增加签名,优化数据倒灌

This commit is contained in:
2026-02-27 09:53:24 +08:00
parent 8e973eb2e2
commit 67c80de5a3
15 changed files with 263 additions and 54 deletions

View File

@@ -131,7 +131,6 @@ public class AppFragment extends BaseMvvmFragment<AppViewModel, FragmentAppBindi
public void onDestroyView() {
super.onDestroyView();
Log.e(TAG, "onDestroyView: ");
mViewModel.resetLiveData();
}
public class BtnClick {

View File

@@ -12,6 +12,7 @@ import com.ttstd.dialer.base.mvvm.BaseViewModel;
import com.ttstd.dialer.databinding.FragmentAppBinding;
import com.ttstd.dialer.db.app.AppInfo;
import com.ttstd.dialer.db.app.AppRepository;
import com.ttstd.dialer.livedata.SingleLiveEvent;
import java.util.concurrent.Callable;
@@ -33,11 +34,11 @@ public class AppViewModel extends BaseViewModel<FragmentAppBinding, FragmentEven
mAppRepository = new AppRepository(context);
}
public MutableLiveData<Integer> mAppUpdateData = new MutableLiveData<>();
public SingleLiveEvent<Integer> mAppUpdateData = new SingleLiveEvent<>();
public void resetLiveData() {
mAppUpdateData = new MutableLiveData<>();
}
// public void resetLiveData() {
// mAppUpdateData = new MutableLiveData<>();
// }
public void updateAppInfo(AppInfo appInfo) {
Observable.fromCallable(new Callable<Integer>() {

View File

@@ -13,6 +13,7 @@ import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
@@ -20,10 +21,14 @@ import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.hjq.toast.Toaster;
import com.ttstd.dialer.R;
import com.ttstd.dialer.base.mvvm.fragment.BaseMvvmDialogFragment;
import com.ttstd.dialer.databinding.FragmentCallBinding;
import com.ttstd.dialer.db.contact.ContactInfo;
import com.ttstd.dialer.service.DialerAccessibilityService;
import com.ttstd.dialer.utils.AccessibilityServiceHelper;
import com.ttstd.dialer.utils.ApkUtils;
public class CallFragment extends BaseMvvmDialogFragment<CallViewModel, FragmentCallBinding> {
private static final String TAG = "CallFragment";
@@ -120,17 +125,36 @@ public class CallFragment extends BaseMvvmDialogFragment<CallViewModel, Fragment
} catch (Exception e) {
Log.e(TAG, "callNumber: " + e.getMessage());
}
}
private void callWeixin(int type) {
if (AccessibilityServiceHelper.isAccessibilityServiceEnabled(mContext, DialerAccessibilityService.class)) {
if (ApkUtils.isInstalled(mContext, "com.tencent.mm")) {
Intent intent = new Intent(mContext, DialerAccessibilityService.class);
intent.putExtra("ContactInfo", mContactInfo);
intent.putExtra("callType", type);
mContext.startService(intent);
} else {
Toaster.show("微信未安装,请安装后使用");
ApkUtils.openAppStore(mContext, "com.tencent.mm");
}
} else {
Toast.makeText(mContext, "请现在打开无障碍服务中 - 拨号助手无障碍服务", Toast.LENGTH_LONG).show();
AccessibilityServiceHelper.jumpToAccessibilitySettings(mContext);
}
}
public class BtnClick {
public void callWechatVideo(View view) {
callWeixin(1);
dismiss();
}
public void callWechatAudio(View view) {
callWeixin(2);
dismiss();
}

View File

@@ -173,16 +173,6 @@ public class HomeFragment extends BaseMvvmFragment<HomeViewModel, FragmentHomeBi
}
}
public void openAppStore(String pkg) {
Uri uri = Uri.parse("market://details?id=" + pkg);
Intent storeIntent = new Intent(Intent.ACTION_VIEW, uri);
storeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(storeIntent);
} catch (Exception e1) {
Log.e(TAG, "openWeixin storeIntent: " + e1.getMessage());
}
}
public class BtnClick {
public void openContact(View view) {
@@ -203,7 +193,7 @@ public class HomeFragment extends BaseMvvmFragment<HomeViewModel, FragmentHomeBi
ApkUtils.openPackage(mContext, "com.ss.android.ugc.aweme");
} else {
Toaster.show("抖音未安装,请安装后使用");
openAppStore("com.ss.android.ugc.aweme");
ApkUtils.openAppStore(mContext, "com.ss.android.ugc.aweme");
}
}
@@ -222,11 +212,11 @@ public class HomeFragment extends BaseMvvmFragment<HomeViewModel, FragmentHomeBi
} catch (Exception e) {
Log.e(TAG, "launchWeChat: " + e.getMessage());
Toaster.show("打开微信失败");
openAppStore("com.tencent.mm");
ApkUtils.openAppStore(mContext, "com.tencent.mm");
}
} else {
Toaster.show("微信未安装,请安装后使用");
openAppStore("com.tencent.mm");
ApkUtils.openAppStore(mContext, "com.tencent.mm");
}
}

View File

@@ -0,0 +1,70 @@
package com.ttstd.dialer.service;
import android.accessibilityservice.AccessibilityService;
import android.content.ComponentName;
import android.content.Intent;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import com.ttstd.dialer.db.contact.ContactInfo;
import com.ttstd.dialer.utils.ApkUtils;
public class DialerAccessibilityService extends AccessibilityService {
private static final String TAG = "AccessibilityService";
public static final int ACTION_VIDEO = 1;
public static final int ACTION_AUDIO = 2;
private ContactInfo mContactInfo;
private int mCallType = ACTION_VIDEO;
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
mContactInfo = (ContactInfo) intent.getSerializableExtra("ContactInfo");
mCallType = intent.getIntExtra("callType", 1);
if (mContactInfo != null) {
startWeixin();
}
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
private void startWeixin() {
Intent intent = new Intent();
ComponentName cmp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI");
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setComponent(cmp);
try {
startActivity(intent);
} catch (Exception e) {
Log.e(TAG, "launchWeChat: " + e.getMessage());
}
}
}

View File

@@ -0,0 +1,74 @@
package com.ttstd.dialer.utils;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.accessibility.AccessibilityManager;
import com.ttstd.dialer.service.DialerAccessibilityService;
import java.util.List;
public class AccessibilityServiceHelper {
private static final String TAG = "AccessibilityHelper";
/**
* 检查特定的无障碍服务是否已启用
*
* @param context 上下文对象
* @param serviceClass 你的无障碍服务类(例如 MyAccessibilityService.class
* @return true 已开启false 未开启
*/
public static boolean isAccessibilityServiceEnabled(Context context, Class<?> serviceClass) {
// 获取 AccessibilityManager 系统服务
AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
if (am == null) {
return false;
}
// 获取所有已启用的无障碍服务列表
List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
// 构建你服务的完整组件标识符
String expectedServiceId = new ComponentName(context, serviceClass).flattenToShortString();
Log.e(TAG, "isAccessibilityServiceEnabled: expectedServiceId = " + expectedServiceId);
for (AccessibilityServiceInfo serviceInfo : enabledServices) {
Log.e(TAG, "isAccessibilityServiceEnabled: serviceInfo.getId() = " + serviceInfo.getId());
if (expectedServiceId.equals(serviceInfo.getId())) {
return true;
}
}
return false;
}
/**
* 跳转到系统的无障碍服务设置页面
*
* @param context 上下文对象
*/
public static void jumpToAccessibilitySettings(Context context) {
try {
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 通常从应用上下文启动时需要此标志
String str = context.getPackageName() + "/com.ttstd.dialer.service." + DialerAccessibilityService.class.getCanonicalName();
Bundle bundle = new Bundle();
bundle.putString(":settings:fragment_args_key", str);
intent.putExtra(":settings:fragment_args_key", str);
intent.putExtra(":settings:show_fragment_args", bundle);
context.startActivity(intent);
} catch (Exception e) {
// 处理跳转失败的情况,例如某些设备可能没有标准的设置界面
e.printStackTrace();
// 可以尝试跳转到系统通用设置作为备选方案
Intent fallbackIntent = new Intent(Settings.ACTION_SETTINGS);
fallbackIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(fallbackIntent);
}
}
}

View File

@@ -9,6 +9,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
@@ -176,4 +177,15 @@ public class ApkUtils {
return isSystemApp;
}
public static void openAppStore(Context context, String pkg) {
Uri uri = Uri.parse("market://details?id=" + pkg);
Intent storeIntent = new Intent(Intent.ACTION_VIEW, uri);
storeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
context.startActivity(storeIntent);
} catch (Exception e1) {
Log.e(TAG, "openWeixin storeIntent: " + e1.getMessage());
}
}
}