From b9f740c386bf424be57e545e84629c61e5848322 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Wed, 26 Feb 2025 03:40:41 +0800 Subject: [PATCH 01/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=9D=99=E9=9F=B3=E6=97=B6=E7=9A=84=E6=9D=83?= =?UTF-8?q?=E9=99=90=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=9B=BA=E5=AE=9A=E7=9A=84=E5=BA=94=E7=94=A8=E9=93=83?= =?UTF-8?q?=E5=A3=B0=E9=9F=B3=E9=87=8F=E8=AE=BE=E7=BD=AE=E3=80=82=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E5=85=B6=E4=BB=96=E5=BA=94=E7=94=A8=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E7=9A=84=E9=93=83=E5=A3=B0=E9=9F=B3=E9=87=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.gradle | 8 +-- contacts/build.properties | 4 +- .../contacts/activities/SettingsActivity.java | 53 +++++++++++++++++ .../studio/contacts/beans/RingTongBean.java | 28 ++++----- .../phonecallui/PhoneCallService.java | 59 +++++++++++++++---- .../contacts/receivers/MainReceiver.java | 8 +-- .../src/main/res/layout/activity_settings.xml | 26 ++++++++ 7 files changed, 150 insertions(+), 36 deletions(-) diff --git a/contacts/build.gradle b/contacts/build.gradle index 552a42a..7bf188e 100644 --- a/contacts/build.gradle +++ b/contacts/build.gradle @@ -18,13 +18,13 @@ def genVersionName(def versionName){ } android { - compileSdkVersion 32 - buildToolsVersion "33.0.3" + compileSdkVersion 30 + buildToolsVersion "30.0.3" defaultConfig { applicationId "cc.winboll.studio.contacts" - minSdkVersion 21 - targetSdkVersion 30 + minSdkVersion 26 + targetSdkVersion 29 versionCode 1 // versionName 更新后需要手动设置 // 项目模块目录的 build.gradle 文件的 stageCount=0 diff --git a/contacts/build.properties b/contacts/build.properties index 86e2b57..61d13e3 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Feb 25 00:17:29 HKT 2025 +#Tue Feb 25 19:32:36 GMT 2025 stageCount=2 libraryProject= baseVersion=1.0 publishVersion=1.0.1 -buildCount=0 +buildCount=34 baseBetaVersion=1.0.2 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java b/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java index bc54d95..bad98bc 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java @@ -26,6 +26,8 @@ import cc.winboll.studio.libappbase.IWinBollActivity; import cc.winboll.studio.libappbase.bean.APPInfo; import com.hjq.toast.ToastUtils; import java.lang.reflect.Field; +import android.widget.SeekBar; +import android.widget.TextView; public class SettingsActivity extends AppCompatActivity implements IWinBollActivity { @@ -33,6 +35,11 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv Toolbar mToolbar; Switch swSilent; + SeekBar msbVolume; + TextView mtvVolume; + int mnStreamMaxVolume; + int mnStreamVolume; + @Override public APPInfo getAppInfo() { @@ -77,6 +84,52 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv getSupportActionBar().setDisplayHomeAsUpEnabled(true); } getSupportActionBar().setSubtitle(getTag()); + + msbVolume = findViewById(R.id.bellvolume); + mtvVolume = findViewById(R.id.tv_volume); + final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); + + // 设置SeekBar的最大值为系统铃声音量的最大刻度 + mnStreamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING); + msbVolume.setMax(mnStreamMaxVolume); + // 获取当前铃声音量并设置为SeekBar的初始进度 + mnStreamVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); + msbVolume.setProgress(mnStreamVolume); + + updateStreamVolumeTextView(); + + msbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + // 设置铃声音量 + audioManager.setStreamVolume(AudioManager.STREAM_RING, progress, 0); + RingTongBean bean = RingTongBean.loadBean(SettingsActivity.this, RingTongBean.class); + if (bean == null) { + bean = new RingTongBean(); + } + bean.setStreamVolume(progress); + RingTongBean.saveBean(SettingsActivity.this, bean); + mnStreamVolume = progress; + updateStreamVolumeTextView(); + //Toast.makeText(SettingsActivity.this, "音量设置为: " + progress, Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + // 当开始拖动SeekBar时的操作 + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + // 当停止拖动SeekBar时的操作 + } + }); + } + + void updateStreamVolumeTextView() { + mtvVolume.setText(String.format("%d/%d", mnStreamVolume, mnStreamMaxVolume)); } public void onDefaultPhone(View view) { diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/beans/RingTongBean.java b/contacts/src/main/java/cc/winboll/studio/contacts/beans/RingTongBean.java index 792bce4..5db7262 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/beans/RingTongBean.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/beans/RingTongBean.java @@ -12,26 +12,26 @@ import android.media.AudioManager; import android.util.JsonReader; public class RingTongBean extends BaseBean { - + public static final String TAG = "AudioRingTongBean"; - - // 模式 - int ringerMode; + + // 铃声音量 + int streamVolume; public RingTongBean() { - this.ringerMode = AudioManager.RINGER_MODE_NORMAL; + this.streamVolume = 100; } - public RingTongBean(int ringerMode) { - this.ringerMode = ringerMode; + public RingTongBean(int streamVolume) { + this.streamVolume = streamVolume; } - public void setRingerMode(int ringerMode) { - this.ringerMode = ringerMode; + public void setStreamVolume(int streamVolume) { + this.streamVolume = streamVolume; } - public int getRingerMode() { - return ringerMode; + public int getStreamVolume() { + return streamVolume; } @Override @@ -42,15 +42,15 @@ public class RingTongBean extends BaseBean { @Override public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { super.writeThisToJsonWriter(jsonWriter); - jsonWriter.name("ringerMode").value(getRingerMode()); + jsonWriter.name("streamVolume").value(getStreamVolume()); } @Override public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else { - if (name.equals("ringerMode")) { - setRingerMode(jsonReader.nextInt()); + if (name.equals("streamVolume")) { + setStreamVolume(jsonReader.nextInt()); } else { return false; } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java index 88eb69e..b60df64 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java @@ -21,8 +21,6 @@ import cc.winboll.studio.libappbase.LogUtils; public class PhoneCallService extends InCallService { public static final String TAG = "PhoneCallService"; - - private volatile int originalRingVolume; private final Call.Callback callback = new Call.Callback() { @Override @@ -61,39 +59,78 @@ public class PhoneCallService extends InCallService { String phoneNumber = details.getHandle().getSchemeSpecificPart(); // 记录原始铃声音量 + // AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); - originalRingVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); + + // 恢复铃声音量,预防其他意外条件导致的音量变化问题 + // + + // 读取应用配置,未配置就初始化配置文件 + RingTongBean bean = RingTongBean.loadBean(this, RingTongBean.class); + if (bean == null) { + // 初始化配置 + bean = new RingTongBean(); + RingTongBean.saveBean(this, bean); + } + // 如果当前音量和应用保存的不一致就恢复为应用设定值 + // 恢复铃声音量 + try { + audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); + //audioManager.setMode(AudioManager.RINGER_MODE_NORMAL); + } catch (java.lang.SecurityException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + // 检查电话接收规则 if (!Rules.getInstance(this).isAllowed(phoneNumber)) { - // 预先静音 - audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0); + // 调低音量 + try { + audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0); + //audioManager.setMode(AudioManager.RINGER_MODE_SILENT); + } catch (java.lang.SecurityException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } // 断开电话 call.disconnect(); // 停顿1秒,预防第一声铃声响动 try { - Thread.sleep(1000); + Thread.sleep(500); } catch (InterruptedException e) { LogUtils.d(TAG, ""); } // 恢复铃声音量 - audioManager.setStreamVolume(AudioManager.STREAM_RING, originalRingVolume, 0); + try { + audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); + //audioManager.setMode(AudioManager.RINGER_MODE_NORMAL); + } catch (java.lang.SecurityException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } // 屏蔽电话结束 return; } + // 正常接听电话 PhoneCallActivity.actionStart(this, phoneNumber, callType); } } + void resumeStreamVolume(AudioManager audioManager, int originalRingVolume) { + // 如果当前音量和应用保存的不一致就恢复为应用设定值 + RingTongBean bean = RingTongBean.loadBean(this, RingTongBean.class); + if (bean == null) { + bean = new RingTongBean(); + } + if (originalRingVolume != bean.getStreamVolume()) { + // 恢复铃声音量 + audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); + } + } + @Override public void onCallRemoved(Call call) { super.onCallRemoved(call); - call.unregisterCallback(callback); PhoneCallManager.call = null; - AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); - // 恢复铃声音量 - audioManager.setStreamVolume(AudioManager.STREAM_RING, originalRingVolume, 0); } public enum CallType { diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java b/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java index d1dfb52..457a8e9 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java @@ -9,13 +9,11 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.media.RingtoneManager; -import android.net.Uri; -import android.util.Log; +import android.media.AudioManager; import cc.winboll.studio.contacts.services.MainService; +import cc.winboll.studio.libappbase.LogUtils; import com.hjq.toast.ToastUtils; import java.lang.ref.WeakReference; -import cc.winboll.studio.libappbase.LogUtils; public class MainReceiver extends BroadcastReceiver { @@ -43,7 +41,7 @@ public class MainReceiver extends BroadcastReceiver { public void registerAction(Context context) { IntentFilter filter=new IntentFilter(); filter.addAction(ACTION_BOOT_COMPLETED); - //filter.addAction(Intent.ACTION_BATTERY_CHANGED); + //filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); context.registerReceiver(this, filter); } } diff --git a/contacts/src/main/res/layout/activity_settings.xml b/contacts/src/main/res/layout/activity_settings.xml index 2122230..6ce953a 100644 --- a/contacts/src/main/res/layout/activity_settings.xml +++ b/contacts/src/main/res/layout/activity_settings.xml @@ -45,6 +45,32 @@ + + + + + + + + + + From 3734a659ff0a7023b9e59a1b66eac7b4eebe37ed Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Wed, 26 Feb 2025 04:35:14 +0800 Subject: [PATCH 02/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=BB=E8=A6=81?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=90=AF=E5=8A=A8=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.properties | 4 +- .../winboll/studio/contacts/MainActivity.java | 12 ++++- .../contacts/activities/SettingsActivity.java | 24 +++++++++- .../studio/contacts/services/MainService.java | 47 +++++++++++++++---- .../src/main/res/layout/activity_settings.xml | 19 ++++++++ 5 files changed, 92 insertions(+), 14 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index 61d13e3..414eead 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Feb 25 19:32:36 GMT 2025 +#Tue Feb 25 20:33:54 GMT 2025 stageCount=2 libraryProject= baseVersion=1.0 publishVersion=1.0.1 -buildCount=34 +buildCount=41 baseBetaVersion=1.0.2 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java b/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java index 24f9f4f..c3241ee 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java @@ -47,6 +47,8 @@ import java.util.ArrayList; import java.util.List; import android.content.DialogInterface; import cc.winboll.studio.contacts.activities.SettingsActivity; +import cc.winboll.studio.contacts.beans.MainServiceBean; +import cc.winboll.studio.contacts.services.MainService; final public class MainActivity extends AppCompatActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener { @@ -140,7 +142,15 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct // } // } // }); - MainService.startMainService(MainActivity.this); + + MainServiceBean mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); + if (mMainServiceBean == null) { + mMainServiceBean = new MainServiceBean(); + MainServiceBean.saveBean(this, mMainServiceBean); + } + if (mMainServiceBean.isEnable()) { + MainService.startMainService(this); + } } //初始化view,即显示的图片 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java b/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java index bad98bc..4525b54 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java @@ -28,6 +28,8 @@ import com.hjq.toast.ToastUtils; import java.lang.reflect.Field; import android.widget.SeekBar; import android.widget.TextView; +import cc.winboll.studio.contacts.beans.MainServiceBean; +import cc.winboll.studio.contacts.services.MainService; public class SettingsActivity extends AppCompatActivity implements IWinBollActivity { @@ -39,6 +41,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv TextView mtvVolume; int mnStreamMaxVolume; int mnStreamVolume; + Switch mswMainService; @Override @@ -85,6 +88,23 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv } getSupportActionBar().setSubtitle(getTag()); + mswMainService = findViewById(R.id.sw_mainservice); + MainServiceBean mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); + mswMainService.setChecked(mMainServiceBean.isEnable()); + mswMainService.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View arg0) { + // TODO: Implement this method + if (mswMainService.isChecked()) { + //ToastUtils.show("Is Checked"); + MainService.startMainService(SettingsActivity.this); + } else { + //ToastUtils.show("Not Checked"); + MainService.stopMainService(SettingsActivity.this); + } + } + }); + msbVolume = findViewById(R.id.bellvolume); mtvVolume = findViewById(R.id.tv_volume); final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); @@ -95,7 +115,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv // 获取当前铃声音量并设置为SeekBar的初始进度 mnStreamVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); msbVolume.setProgress(mnStreamVolume); - + updateStreamVolumeTextView(); msbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @@ -127,7 +147,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv } }); } - + void updateStreamVolumeTextView() { mtvVolume.setText(String.format("%d/%d", mnStreamVolume, mnStreamMaxVolume)); } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java b/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java index 3eef1a4..9ad9eec 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java @@ -30,6 +30,9 @@ import cc.winboll.studio.libappbase.bean.APPSOSBean; import cc.winboll.studio.contacts.dun.Rules; import android.media.AudioManager; import com.hjq.toast.ToastUtils; +import java.util.Timer; +import java.util.TimerTask; +import cc.winboll.studio.contacts.beans.RingTongBean; public class MainService extends Service { @@ -48,8 +51,8 @@ public class MainService extends Service { AssistantService mAssistantService; boolean isBound = false; MainReceiver mMainReceiver; - - + Timer mStreamVolumeCheckTimer; + @Override public IBinder onBind(Intent intent) { return new MyBinder(); @@ -71,9 +74,35 @@ public class MainService extends Service { mMyServiceConnection = new MyServiceConnection(); } mMainServiceHandler = new MainServiceHandler(this); - - - + + // 铃声检查定时器 + mStreamVolumeCheckTimer = new Timer(); + mStreamVolumeCheckTimer.schedule(new TimerTask() { + @Override + public void run() { + AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); + + // 恢复铃声音量,预防其他意外条件导致的音量变化问题 + // + + // 读取应用配置,未配置就初始化配置文件 + RingTongBean bean = RingTongBean.loadBean(MainService.this, RingTongBean.class); + if (bean == null) { + // 初始化配置 + bean = new RingTongBean(); + RingTongBean.saveBean(MainService.this, bean); + } + // 如果当前音量和应用保存的不一致就恢复为应用设定值 + // 恢复铃声音量 + try { + audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); + //audioManager.setMode(AudioManager.RINGER_MODE_NORMAL); + } catch (java.lang.SecurityException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + } + }, 1000, 60000); + // 运行服务内容 mainService(); } @@ -104,11 +133,11 @@ public class MainService extends Service { mMainReceiver = new MainReceiver(this); mMainReceiver.registerAction(this); } - + Rules.getInstance(this); //Rules.getInstance(this).add("18888888888", true); //Rules.getInstance(this).add("16769764848", true); - + startPhoneCallListener(); MainServiceThread.getInstance(this, mMainServiceHandler).start(); @@ -137,7 +166,7 @@ public class MainService extends Service { // LogUtils.d(TAG, "startService(intent)"); // bindService(new Intent(this, AssistantService.class), mMyServiceConnection, Context.BIND_IMPORTANT); } - + void startPhoneCallListener() { Intent callListener = new Intent(this, CallListenerService.class); startService(callListener); @@ -168,7 +197,7 @@ public class MainService extends Service { // 停止主要进程 MainServiceThread.getInstance(this, mMainServiceHandler).setIsExit(true); - + } super.onDestroy(); diff --git a/contacts/src/main/res/layout/activity_settings.xml b/contacts/src/main/res/layout/activity_settings.xml index 6ce953a..c68fcc2 100644 --- a/contacts/src/main/res/layout/activity_settings.xml +++ b/contacts/src/main/res/layout/activity_settings.xml @@ -18,6 +18,25 @@ android:layout_height="0dp" android:layout_weight="1.0"> + + + + + + + + Date: Wed, 26 Feb 2025 04:37:18 +0800 Subject: [PATCH 03/68] APK 1.0.2 release Publish. --- contacts/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index 414eead..c6dd70a 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Feb 25 20:33:54 GMT 2025 -stageCount=2 +#Wed Feb 26 04:37:17 HKT 2025 +stageCount=3 libraryProject= baseVersion=1.0 -publishVersion=1.0.1 -buildCount=41 -baseBetaVersion=1.0.2 +publishVersion=1.0.2 +buildCount=0 +baseBetaVersion=1.0.3 From bdb9bc7637a3044669fd0798341968c18e3ed18c Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Wed, 26 Feb 2025 05:08:56 +0800 Subject: [PATCH 04/68] =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.properties | 4 ++-- .../phonecallui/PhoneCallService.java | 20 +++++-------------- .../studio/contacts/services/MainService.java | 8 +++++--- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index c6dd70a..ae5615e 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed Feb 26 04:37:17 HKT 2025 +#Tue Feb 25 21:06:27 GMT 2025 stageCount=3 libraryProject= baseVersion=1.0 publishVersion=1.0.2 -buildCount=0 +buildCount=2 baseBetaVersion=1.0.3 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java index b60df64..3786899 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java @@ -61,7 +61,7 @@ public class PhoneCallService extends InCallService { // 记录原始铃声音量 // AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); - + int ringerVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); // 恢复铃声音量,预防其他意外条件导致的音量变化问题 // @@ -75,8 +75,10 @@ public class PhoneCallService extends InCallService { // 如果当前音量和应用保存的不一致就恢复为应用设定值 // 恢复铃声音量 try { - audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); - //audioManager.setMode(AudioManager.RINGER_MODE_NORMAL); + if (ringerVolume != bean.getStreamVolume()) { + audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); + //audioManager.setMode(AudioManager.RINGER_MODE_NORMAL); + } } catch (java.lang.SecurityException e) { LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); } @@ -114,18 +116,6 @@ public class PhoneCallService extends InCallService { } } - void resumeStreamVolume(AudioManager audioManager, int originalRingVolume) { - // 如果当前音量和应用保存的不一致就恢复为应用设定值 - RingTongBean bean = RingTongBean.loadBean(this, RingTongBean.class); - if (bean == null) { - bean = new RingTongBean(); - } - if (originalRingVolume != bean.getStreamVolume()) { - // 恢复铃声音量 - audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); - } - } - @Override public void onCallRemoved(Call call) { super.onCallRemoved(call); diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java b/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java index 9ad9eec..59b2ba2 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java @@ -81,7 +81,7 @@ public class MainService extends Service { @Override public void run() { AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); - + int ringerVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); // 恢复铃声音量,预防其他意外条件导致的音量变化问题 // @@ -95,8 +95,10 @@ public class MainService extends Service { // 如果当前音量和应用保存的不一致就恢复为应用设定值 // 恢复铃声音量 try { - audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); - //audioManager.setMode(AudioManager.RINGER_MODE_NORMAL); + if (ringerVolume != bean.getStreamVolume()) { + audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); + //audioManager.setMode(AudioManager.RINGER_MODE_NORMAL); + } } catch (java.lang.SecurityException e) { LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); } From d4135f0104faaa65ece0888dfea869f050b08da5 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Wed, 26 Feb 2025 05:10:50 +0800 Subject: [PATCH 05/68] APK 1.0.3 release Publish. --- contacts/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index ae5615e..1e29427 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Feb 25 21:06:27 GMT 2025 -stageCount=3 +#Wed Feb 26 05:10:50 HKT 2025 +stageCount=4 libraryProject= baseVersion=1.0 -publishVersion=1.0.2 -buildCount=2 -baseBetaVersion=1.0.3 +publishVersion=1.0.3 +buildCount=0 +baseBetaVersion=1.0.4 From 2f0293103c673204bb99f2782f98858853341fc6 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Wed, 26 Feb 2025 14:10:16 +0800 Subject: [PATCH 06/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=9A=E8=AF=9D?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=92=8C=E8=81=94=E7=B3=BB=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.properties | 4 +- contacts/src/main/AndroidManifest.xml | 9 +- .../winboll/studio/contacts/MainActivity.java | 20 +-- .../studio/contacts/PhoneCallManager.java | 35 ----- .../contacts/adapters/CallLogAdapter.java | 61 +++++++++ .../contacts/adapters/ContactAdapter.java | 57 ++++++++ .../contacts/adapters/MyPagerAdapter.java | 4 +- .../studio/contacts/beans/CallLogModel.java | 36 +++++ .../studio/contacts/beans/ContactModel.java | 28 ++++ .../contacts/fragments/CallFragment.java | 51 ------- .../contacts/fragments/CallLogFragment.java | 125 ++++++++++++++++++ .../contacts/fragments/ContactsFragment.java | 81 ++++++++++-- .../contacts/receivers/MainReceiver.java | 2 - .../contacts/services/AssistantService.java | 2 - .../studio/contacts/services/MainService.java | 10 +- .../src/main/res/layout/fragment_call.xml | 29 ---- .../src/main/res/layout/fragment_call_log.xml | 15 +++ .../src/main/res/layout/fragment_contacts.xml | 11 +- .../src/main/res/layout/item_call_log.xml | 32 +++++ contacts/src/main/res/layout/item_contact.xml | 24 ++++ 20 files changed, 469 insertions(+), 167 deletions(-) delete mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/PhoneCallManager.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/beans/CallLogModel.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/beans/ContactModel.java delete mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/fragments/CallFragment.java create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/fragments/CallLogFragment.java delete mode 100644 contacts/src/main/res/layout/fragment_call.xml create mode 100644 contacts/src/main/res/layout/fragment_call_log.xml create mode 100644 contacts/src/main/res/layout/item_call_log.xml create mode 100644 contacts/src/main/res/layout/item_contact.xml diff --git a/contacts/build.properties b/contacts/build.properties index 1e29427..fe4eca4 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed Feb 26 05:10:50 HKT 2025 +#Wed Feb 26 06:08:35 GMT 2025 stageCount=4 libraryProject= baseVersion=1.0 publishVersion=1.0.3 -buildCount=0 +buildCount=5 baseBetaVersion=1.0.4 diff --git a/contacts/src/main/AndroidManifest.xml b/contacts/src/main/AndroidManifest.xml index 36ac1ee..ed1cce3 100644 --- a/contacts/src/main/AndroidManifest.xml +++ b/contacts/src/main/AndroidManifest.xml @@ -29,9 +29,10 @@ - - - + + + + - + \ No newline at end of file diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java b/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java index c3241ee..e301a8c 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java @@ -1,36 +1,26 @@ package cc.winboll.studio.contacts; -import android.Manifest; -import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActivityManager; -import android.app.role.RoleManager; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; -import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.provider.Settings; import android.telecom.TelecomManager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.WindowManager; import android.widget.CheckBox; -import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.Switch; import android.widget.Toast; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; import androidx.viewpager.widget.ViewPager; import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.activities.CallActivity; +import cc.winboll.studio.contacts.activities.SettingsActivity; import cc.winboll.studio.contacts.adapters.MyPagerAdapter; import cc.winboll.studio.contacts.beans.MainServiceBean; import cc.winboll.studio.contacts.services.MainService; @@ -40,15 +30,9 @@ import cc.winboll.studio.libapputils.app.IWinBollActivity; import cc.winboll.studio.libapputils.app.WinBollActivityManager; import cc.winboll.studio.libapputils.bean.APPInfo; import cc.winboll.studio.libapputils.view.YesNoAlertDialog; -import cc.winboll.studio.contacts.listenphonecall.CallListenerService; import com.google.android.material.tabs.TabLayout; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import android.content.DialogInterface; -import cc.winboll.studio.contacts.activities.SettingsActivity; -import cc.winboll.studio.contacts.beans.MainServiceBean; -import cc.winboll.studio.contacts.services.MainService; final public class MainActivity extends AppCompatActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener { @@ -171,7 +155,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct void initData() { ViewPager viewPager = findViewById(R.id.activitymainViewPager1); LayoutInflater inflater = LayoutInflater.from(getActivity()); - View view1 = inflater.inflate(R.layout.fragment_call, viewPager, false); + View view1 = inflater.inflate(R.layout.fragment_call_log, viewPager, false); View view2 = inflater.inflate(R.layout.fragment_contacts, viewPager, false); View view3 = inflater.inflate(R.layout.fragment_log, viewPager, false); diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/PhoneCallManager.java b/contacts/src/main/java/cc/winboll/studio/contacts/PhoneCallManager.java deleted file mode 100644 index 7f7292f..0000000 --- a/contacts/src/main/java/cc/winboll/studio/contacts/PhoneCallManager.java +++ /dev/null @@ -1,35 +0,0 @@ -package cc.winboll.studio.contacts; - -/** - * @Author ZhanGSKen@AliYun.Com - * @Date 2025/02/20 21:14:52 - * @Describe PhoneCallManager - */ - -import android.telecom.Call; -import android.telecom.VideoProfile; - -public class PhoneCallManager { - - public static final String TAG = "PhoneCallManager"; - - public static Call call; - - /** - * 接听电话 - */ - public void answer() { - if (call != null) { - call.answer(VideoProfile.STATE_AUDIO_ONLY); - } - } - - /** - * 断开电话,包括来电时的拒接以及接听后的挂断 - */ - public void disconnect() { - if (call != null) { - call.disconnect(); - } - } -} diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java new file mode 100644 index 0000000..7830c2f --- /dev/null +++ b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java @@ -0,0 +1,61 @@ +package cc.winboll.studio.contacts.adapters; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/26 13:09:32 + * @Describe CallLogAdapter + */ +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import cc.winboll.studio.contacts.R; +import cc.winboll.studio.contacts.beans.CallLogModel; +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.Locale; + +public class CallLogAdapter extends RecyclerView.Adapter { + public static final String TAG = "CallLogAdapter"; + + private List callLogList; + + public CallLogAdapter(List callLogList) { + this.callLogList = callLogList; + } + + @NonNull + @Override + public CallLogViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_call_log, parent, false); + return new CallLogViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull CallLogViewHolder holder, int position) { + CallLogModel callLog = callLogList.get(position); + holder.phoneNumber.setText(callLog.getPhoneNumber()); + holder.callStatus.setText(callLog.getCallStatus()); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); + holder.callDate.setText(dateFormat.format(callLog.getCallDate())); + } + + @Override + public int getItemCount() { + return callLogList.size(); + } + + public class CallLogViewHolder extends RecyclerView.ViewHolder { + TextView phoneNumber, callStatus, callDate; + + public CallLogViewHolder(@NonNull View itemView) { + super(itemView); + phoneNumber = itemView.findViewById(R.id.phone_number); + callStatus = itemView.findViewById(R.id.call_status); + callDate = itemView.findViewById(R.id.call_date); + } + } +} + diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java new file mode 100644 index 0000000..c1b526f --- /dev/null +++ b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java @@ -0,0 +1,57 @@ +package cc.winboll.studio.contacts.adapters; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/26 13:35:44 + * @Describe ContactAdapter + */ +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import cc.winboll.studio.contacts.R; +import cc.winboll.studio.contacts.beans.ContactModel; +import java.util.List; + +public class ContactAdapter extends RecyclerView.Adapter { + + public static final String TAG = "ContactAdapter"; + + private List contactList; + + public ContactAdapter(List contactList) { + this.contactList = contactList; + } + + @NonNull + @Override + public ContactViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_contact, parent, false); + return new ContactViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) { + ContactModel contact = contactList.get(position); + holder.contactName.setText(contact.getName()); + holder.contactNumber.setText(contact.getNumber()); + } + + @Override + public int getItemCount() { + return contactList.size(); + } + + public class ContactViewHolder extends RecyclerView.ViewHolder { + TextView contactName; + TextView contactNumber; + + public ContactViewHolder(@NonNull View itemView) { + super(itemView); + contactName = itemView.findViewById(R.id.contact_name); + contactNumber = itemView.findViewById(R.id.contact_number); + } + } +} diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/MyPagerAdapter.java b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/MyPagerAdapter.java index 3212231..6c16c5c 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/MyPagerAdapter.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/MyPagerAdapter.java @@ -9,7 +9,7 @@ import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; -import cc.winboll.studio.contacts.fragments.CallFragment; +import cc.winboll.studio.contacts.fragments.CallLogFragment; import cc.winboll.studio.contacts.fragments.ContactsFragment; import cc.winboll.studio.contacts.fragments.LogFragment; @@ -30,7 +30,7 @@ public class MyPagerAdapter extends FragmentPagerAdapter { } else if(position == 2) { return LogFragment.newInstance(position); } else { - return CallFragment.newInstance(position); + return CallLogFragment.newInstance(position); } } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/beans/CallLogModel.java b/contacts/src/main/java/cc/winboll/studio/contacts/beans/CallLogModel.java new file mode 100644 index 0000000..fc371bf --- /dev/null +++ b/contacts/src/main/java/cc/winboll/studio/contacts/beans/CallLogModel.java @@ -0,0 +1,36 @@ +package cc.winboll.studio.contacts.beans; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/26 13:10:57 + * @Describe CallLogModel + */ + +import java.util.Date; + +public class CallLogModel { + public static final String TAG = "CallLogModel"; + + private String phoneNumber; + private String callStatus; + private Date callDate; + + public CallLogModel(String phoneNumber, String callStatus, Date callDate) { + this.phoneNumber = phoneNumber; + this.callStatus = callStatus; + this.callDate = callDate; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public String getCallStatus() { + return callStatus; + } + + public Date getCallDate() { + return callDate; + } +} + diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/beans/ContactModel.java b/contacts/src/main/java/cc/winboll/studio/contacts/beans/ContactModel.java new file mode 100644 index 0000000..74e964e --- /dev/null +++ b/contacts/src/main/java/cc/winboll/studio/contacts/beans/ContactModel.java @@ -0,0 +1,28 @@ +package cc.winboll.studio.contacts.beans; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/26 13:37:00 + * @Describe ContactModel + */ +public class ContactModel { + + public static final String TAG = "ContactModel"; + + private String name; + private String number; + + public ContactModel(String name, String number) { + this.name = name; + this.number = number; + } + + public String getName() { + return name; + } + + public String getNumber() { + return number; + } +} + diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/fragments/CallFragment.java b/contacts/src/main/java/cc/winboll/studio/contacts/fragments/CallFragment.java deleted file mode 100644 index 6acb172..0000000 --- a/contacts/src/main/java/cc/winboll/studio/contacts/fragments/CallFragment.java +++ /dev/null @@ -1,51 +0,0 @@ -package cc.winboll.studio.contacts.fragments; - -/** - * @Author ZhanGSKen@AliYun.Com - * @Date 2025/02/20 12:57:00 - * @Describe 拨号 - */ -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import androidx.fragment.app.Fragment; -import cc.winboll.studio.contacts.R; -import cc.winboll.studio.libappbase.LogView; -import androidx.annotation.Nullable; -import androidx.annotation.NonNull; -import android.widget.TextView; - -public class CallFragment extends Fragment { - - public static final String TAG = "CallFragment"; - - private static final String ARG_PAGE = "ARG_PAGE"; - private int mPage; - - public static CallFragment newInstance(int page) { - Bundle args = new Bundle(); - args.putInt(ARG_PAGE, page); - CallFragment fragment = new CallFragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments()!= null) { - mPage = getArguments().getInt(ARG_PAGE); - } - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_call, container, false); - TextView textView = view.findViewById(R.id.page_text); - textView.setText("这是第 " + mPage + " 页"); - return view; - } -} diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/fragments/CallLogFragment.java b/contacts/src/main/java/cc/winboll/studio/contacts/fragments/CallLogFragment.java new file mode 100644 index 0000000..0a97c40 --- /dev/null +++ b/contacts/src/main/java/cc/winboll/studio/contacts/fragments/CallLogFragment.java @@ -0,0 +1,125 @@ +package cc.winboll.studio.contacts.fragments; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/20 12:57:00 + * @Describe 拨号 + */ +import android.Manifest; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.os.Bundle; +import android.provider.CallLog; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import cc.winboll.studio.contacts.R; +import cc.winboll.studio.contacts.adapters.CallLogAdapter; +import cc.winboll.studio.contacts.beans.CallLogModel; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class CallLogFragment extends Fragment { + + public static final String TAG = "CallFragment"; + + private static final String ARG_PAGE = "ARG_PAGE"; + private int mPage; + + private static final int REQUEST_READ_CALL_LOG = 1; + private RecyclerView recyclerView; + private CallLogAdapter callLogAdapter; + private List callLogList = new ArrayList<>(); + + public static CallLogFragment newInstance(int page) { + Bundle args = new Bundle(); + args.putInt(ARG_PAGE, page); + CallLogFragment fragment = new CallLogFragment(); + fragment.setArguments(args); + return fragment; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_call_log, container, false); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments()!= null) { + mPage = getArguments().getInt(ARG_PAGE); + } + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + recyclerView = view.findViewById(R.id.recyclerView); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + callLogAdapter = new CallLogAdapter(callLogList); + recyclerView.setAdapter(callLogAdapter); + + if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_CALL_LOG)!= PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.READ_CALL_LOG}, REQUEST_READ_CALL_LOG); + } else { + readCallLog(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == REQUEST_READ_CALL_LOG) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + readCallLog(); + } + } + } + + private void readCallLog() { + Cursor cursor = requireContext().getContentResolver().query( + CallLog.Calls.CONTENT_URI, + null, + null, + null, + CallLog.Calls.DATE + " DESC"); + + if (cursor!= null) { + while (cursor.moveToNext()) { + String phoneNumber = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)); + int callType = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)); + long callDateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); + Date callDate = new Date(callDateLong); + + String callStatus = getCallStatus(callType); + + callLogList.add(new CallLogModel(phoneNumber, callStatus, callDate)); + } + cursor.close(); + callLogAdapter.notifyDataSetChanged(); + } + } + + private String getCallStatus(int callType) { + switch (callType) { + case CallLog.Calls.OUTGOING_TYPE: + return "Outgoing"; + case CallLog.Calls.INCOMING_TYPE: + return "Incoming"; + case CallLog.Calls.MISSED_TYPE: + return "Missed"; + default: + return "Unknown"; + } + } + +} diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/fragments/ContactsFragment.java b/contacts/src/main/java/cc/winboll/studio/contacts/fragments/ContactsFragment.java index 2f7dad6..08ebcef 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/fragments/ContactsFragment.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/fragments/ContactsFragment.java @@ -5,23 +5,39 @@ package cc.winboll.studio.contacts.fragments; * @Date 2025/02/20 12:57:50 * @Describe 联系人 */ +import android.Manifest; +import android.content.pm.PackageManager; +import android.database.Cursor; import android.os.Bundle; +import android.provider.ContactsContract; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import cc.winboll.studio.contacts.R; +import cc.winboll.studio.contacts.adapters.ContactAdapter; +import cc.winboll.studio.contacts.beans.ContactModel; +import java.util.ArrayList; +import java.util.List; public class ContactsFragment extends Fragment { - + public static final String TAG = "ContactsFragment"; - + private static final String ARG_PAGE = "ARG_PAGE"; private int mPage; + private static final int REQUEST_READ_CONTACTS = 1; + private RecyclerView recyclerView; + private ContactAdapter contactAdapter; + private List contactList = new ArrayList<>(); + + public static ContactsFragment newInstance(int page) { Bundle args = new Bundle(); args.putInt(ARG_PAGE, page); @@ -33,18 +49,63 @@ public class ContactsFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getArguments()!= null) { + if (getArguments() != null) { mPage = getArguments().getInt(ARG_PAGE); } } + + + + @Nullable @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_contacts, container, false); - TextView textView = view.findViewById(R.id.page_text); - textView.setText("这是第 " + mPage + " 页"); - return view; + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_contacts, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + recyclerView = view.findViewById(R.id.contacts_recycler_view); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + contactAdapter = new ContactAdapter(contactList); + recyclerView.setAdapter(contactAdapter); + + if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS); + } else { + readContacts(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == REQUEST_READ_CONTACTS) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + readContacts(); + } + } + } + + private void readContacts() { + contactList.clear(); + Cursor cursor = requireContext().getContentResolver().query( + ContactsContract.CommonDataKinds.Phone.CONTENT_URI, + null, + null, + null, + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); + + if (cursor != null) { + while (cursor.moveToNext()) { + String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); + String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); + contactList.add(new ContactModel(name, number)); + } + cursor.close(); + contactAdapter.notifyDataSetChanged(); + } } } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java b/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java index 457a8e9..924ddab 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java @@ -9,9 +9,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.media.AudioManager; import cc.winboll.studio.contacts.services.MainService; -import cc.winboll.studio.libappbase.LogUtils; import com.hjq.toast.ToastUtils; import java.lang.ref.WeakReference; diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/services/AssistantService.java b/contacts/src/main/java/cc/winboll/studio/contacts/services/AssistantService.java index a031f4b..6fd8673 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/services/AssistantService.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/services/AssistantService.java @@ -15,8 +15,6 @@ import android.os.IBinder; import cc.winboll.studio.contacts.beans.MainServiceBean; import cc.winboll.studio.contacts.services.MainService; import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.SOS; -import cc.winboll.studio.libappbase.bean.APPSOSBean; public class AssistantService extends Service { diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java b/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java index 59b2ba2..d2c39b3 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java @@ -11,28 +11,26 @@ package cc.winboll.studio.contacts.services; * https://blog.csdn.net/cyp331203/article/details/38920491 */ import android.app.Service; -import cc.winboll.studio.contacts.listenphonecall.CallListenerService; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.media.AudioManager; import android.os.Binder; import android.os.IBinder; import cc.winboll.studio.contacts.beans.MainServiceBean; +import cc.winboll.studio.contacts.beans.RingTongBean; +import cc.winboll.studio.contacts.dun.Rules; import cc.winboll.studio.contacts.handlers.MainServiceHandler; +import cc.winboll.studio.contacts.listenphonecall.CallListenerService; import cc.winboll.studio.contacts.receivers.MainReceiver; import cc.winboll.studio.contacts.services.MainService; import cc.winboll.studio.contacts.threads.MainServiceThread; -import cc.winboll.studio.contacts.widgets.APPStatusWidget; import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.SOS; import cc.winboll.studio.libappbase.bean.APPSOSBean; -import cc.winboll.studio.contacts.dun.Rules; -import android.media.AudioManager; -import com.hjq.toast.ToastUtils; import java.util.Timer; import java.util.TimerTask; -import cc.winboll.studio.contacts.beans.RingTongBean; public class MainService extends Service { diff --git a/contacts/src/main/res/layout/fragment_call.xml b/contacts/src/main/res/layout/fragment_call.xml deleted file mode 100644 index 1b8673c..0000000 --- a/contacts/src/main/res/layout/fragment_call.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - diff --git a/contacts/src/main/res/layout/fragment_call_log.xml b/contacts/src/main/res/layout/fragment_call_log.xml new file mode 100644 index 0000000..32fcbf0 --- /dev/null +++ b/contacts/src/main/res/layout/fragment_call_log.xml @@ -0,0 +1,15 @@ + + + + + + + diff --git a/contacts/src/main/res/layout/fragment_contacts.xml b/contacts/src/main/res/layout/fragment_contacts.xml index aeec420..1628f8a 100644 --- a/contacts/src/main/res/layout/fragment_contacts.xml +++ b/contacts/src/main/res/layout/fragment_contacts.xml @@ -6,10 +6,9 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + + diff --git a/contacts/src/main/res/layout/item_call_log.xml b/contacts/src/main/res/layout/item_call_log.xml new file mode 100644 index 0000000..d9da032 --- /dev/null +++ b/contacts/src/main/res/layout/item_call_log.xml @@ -0,0 +1,32 @@ + + + android:padding="16dp"> + + + + + + + + + diff --git a/contacts/src/main/res/layout/item_contact.xml b/contacts/src/main/res/layout/item_contact.xml new file mode 100644 index 0000000..401c155 --- /dev/null +++ b/contacts/src/main/res/layout/item_contact.xml @@ -0,0 +1,24 @@ + + + + + + + + + From a15f6bad8f1d80a3f4cf21018f9f566af9f366c7 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Wed, 26 Feb 2025 15:09:29 +0800 Subject: [PATCH 07/68] 1509 --- contacts/build.gradle | 28 +++++------ contacts/build.properties | 4 +- .../contacts/adapters/ContactAdapter.java | 18 ++++++- .../studio/contacts/beans/ContactModel.java | 36 ++++++++++++++ .../contacts/fragments/ContactsFragment.java | 48 ++++++++++++++++--- .../src/main/res/layout/fragment_contacts.xml | 7 +++ contacts/src/main/res/layout/item_contact.xml | 43 ++++++++++------- 7 files changed, 141 insertions(+), 43 deletions(-) diff --git a/contacts/build.gradle b/contacts/build.gradle index 7bf188e..55ef8d2 100644 --- a/contacts/build.gradle +++ b/contacts/build.gradle @@ -49,23 +49,19 @@ android { } dependencies { - // 二维码使用的类库 - api 'com.google.zxing:core:3.4.1' - api 'com.journeyapps:zxing-android-embedded:3.6.0' + implementation fileTree(dir: 'libs', include: ['*.jar']) - api 'io.github.medyo:android-about-page:2.0.0' - api 'com.github.getActivity:ToastUtils:10.5' - api 'com.jcraft:jsch:0.1.55' - api 'org.jsoup:jsoup:1.13.1' - api 'com.squareup.okhttp3:okhttp:4.4.1' + // https://mvnrepository.com/artifact/com.github.open-android/pinyin4j + implementation 'com.github.open-android:pinyin4j:2.5.0' + + implementation 'io.github.medyo:android-about-page:2.0.0' + implementation 'com.github.getActivity:ToastUtils:10.5' - api 'androidx.appcompat:appcompat:1.1.0' - api 'androidx.viewpager:viewpager:1.0.0' - api 'androidx.fragment:fragment:1.1.0' - api 'com.google.android.material:material:1.4.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.viewpager:viewpager:1.0.0' + implementation 'androidx.fragment:fragment:1.1.0' + implementation 'com.google.android.material:material:1.4.0' - api 'cc.winboll.studio:libapputils:9.3.2' - api 'cc.winboll.studio:libappbase:1.5.6' - - api fileTree(dir: 'libs', include: ['*.jar']) + implementation 'cc.winboll.studio:libapputils:9.3.2' + implementation 'cc.winboll.studio:libappbase:1.5.6' } diff --git a/contacts/build.properties b/contacts/build.properties index fe4eca4..769e989 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed Feb 26 06:08:35 GMT 2025 +#Wed Feb 26 06:42:40 GMT 2025 stageCount=4 libraryProject= baseVersion=1.0 publishVersion=1.0.3 -buildCount=5 +buildCount=8 baseBetaVersion=1.0.4 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java index c1b526f..b2e2950 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java @@ -5,9 +5,12 @@ package cc.winboll.studio.contacts.adapters; * @Date 2025/02/26 13:35:44 * @Describe ContactAdapter */ +import android.content.Intent; +import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; @@ -19,6 +22,7 @@ public class ContactAdapter extends RecyclerView.Adapter contactList; public ContactAdapter(List contactList) { @@ -34,9 +38,18 @@ public class ContactAdapter extends RecyclerView.Adapter contactList = new ArrayList<>(); - + private List originalContactList = new ArrayList<>(); + private EditText searchEditText; public static ContactsFragment newInstance(int page) { Bundle args = new Bundle(); @@ -54,10 +58,6 @@ public class ContactsFragment extends Fragment { } } - - - - @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -72,6 +72,22 @@ public class ContactsFragment extends Fragment { contactAdapter = new ContactAdapter(contactList); recyclerView.setAdapter(contactAdapter); + searchEditText = view.findViewById(R.id.search_edit_text); + searchEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + filterContacts(s.toString()); + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS); } else { @@ -91,6 +107,7 @@ public class ContactsFragment extends Fragment { private void readContacts() { contactList.clear(); + originalContactList.clear(); Cursor cursor = requireContext().getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, @@ -102,10 +119,29 @@ public class ContactsFragment extends Fragment { while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); - contactList.add(new ContactModel(name, number)); + ContactModel contact = new ContactModel(name, number); + contactList.add(contact); + originalContactList.add(contact); } cursor.close(); contactAdapter.notifyDataSetChanged(); } } + + private void filterContacts(String query) { + contactList.clear(); + if (query.isEmpty()) { + contactList.addAll(originalContactList); + } else { + for (ContactModel contact : originalContactList) { + if (contact.getName().toLowerCase().contains(query.toLowerCase()) || + contact.getPinyin().toLowerCase().contains(query.toLowerCase()) || + contact.getNumber().toLowerCase().contains(query.toLowerCase())) { + contactList.add(contact); + } + } + } + contactAdapter.notifyDataSetChanged(); + } } + diff --git a/contacts/src/main/res/layout/fragment_contacts.xml b/contacts/src/main/res/layout/fragment_contacts.xml index 1628f8a..b2769a6 100644 --- a/contacts/src/main/res/layout/fragment_contacts.xml +++ b/contacts/src/main/res/layout/fragment_contacts.xml @@ -6,6 +6,13 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + - + - + - + + +