version:1.0.0

update:更换包名
bugfixes:
This commit is contained in:
2024-07-11 10:30:46 +08:00
parent ed06e2903c
commit a8c6e48435
412 changed files with 1654 additions and 1722 deletions

View File

@@ -0,0 +1,266 @@
package com.xxpatx.os.activity.setting;
import android.Manifest;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import com.tencent.mmkv.MMKV;
import com.xxpatx.os.BuildConfig;
import com.xxpatx.os.R;
import com.xxpatx.os.activity.tts.TtsActivity;
import com.xxpatx.os.base.mvvm.BaseMvvmActivity;
import com.xxpatx.os.config.CommonConfig;
import com.xxpatx.os.databinding.ActivitySettingBinding;
import com.xxpatx.os.service.WeAccessibilityService;
import com.xxpatx.os.service.main.MainService;
import com.xxpatx.os.utils.AccessibilityUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class SettingActivity extends BaseMvvmActivity<SettingViewModel, ActivitySettingBinding> {
private static final String TAG = SettingActivity.class.getSimpleName();
private static final int REQUEST_PERMISSION_CODE = 1234;
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
private String[] PERMISSIONS_SMS = {
Manifest.permission.READ_SMS,
Manifest.permission.RECEIVE_SMS,
};
@Override
protected int getLayoutId() {
return R.layout.activity_setting;
}
@Override
protected void initDataBinding() {
mViewModel.setCtx(this);
mViewModel.setVDBinding(mViewDataBinding);
mViewModel.setLifecycle(getLifecycleSubject());
mViewDataBinding.setClick(new BtnClick());
}
@Override
protected void initView() {
}
@Override
protected void initData() {
}
@Override
protected void onResume() {
super.onResume();
setStatus();
}
private void setStatus() {
boolean showFloatWindow = mMMKV.decodeBool(CommonConfig.FLOAT_WINDOW, false);
Log.e(TAG, "initView: showFloatWindow = " + showFloatWindow);
mViewDataBinding.setFloatWindowEnable(showFloatWindow);
boolean voiceBroadcast = mMMKV.decodeBool(CommonConfig.VOICE_BROADCAST, false);
Log.e(TAG, "initView: voiceBroadcast = " + voiceBroadcast);
mViewDataBinding.setVoiceBroadcast(voiceBroadcast);
boolean autoAccept = mMMKV.decodeBool(CommonConfig.WECHAT_CALL_AUTO_ACCEPT, false);
Log.e(TAG, "initView: autoAccept = " + autoAccept);
mViewDataBinding.setAutoAccept(autoAccept);
boolean dialTone = mMMKV.decodeBool(CommonConfig.DISABLE_DIAL_TONE_MODIFY, true);
Log.e(TAG, "initView: dialTone = " + dialTone);
mViewDataBinding.setDialTone(dialTone);
}
private static final int REQUEST_CODE_DRAW_OVER_OTHER_APPS_PERMISSION = 200;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_DRAW_OVER_OTHER_APPS_PERMISSION) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
// 权限被拒绝
Toast.makeText(this, "用户取消授予悬浮窗权限", Toast.LENGTH_SHORT).show();
} else {
// 权限已授予,可以显示悬浮窗
showFloatingWindow();
}
}
setStatus();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CODE) {
}
}
private void showFloatingWindow() {
mViewDataBinding.setFloatWindowEnable(true);
mMMKV.encode(CommonConfig.FLOAT_WINDOW, true);
startService(new Intent(SettingActivity.this, MainService.class));
sendBroadcast(new Intent(MainService.ACTION_FLOAT_WINDOW_ON));
}
private void hideFloatingWindow() {
mViewDataBinding.setFloatWindowEnable(false);
mMMKV.encode(CommonConfig.FLOAT_WINDOW, false);
startService(new Intent(SettingActivity.this, MainService.class));
sendBroadcast(new Intent(MainService.ACTION_FLOAT_WINDOW_OFF));
}
/***
* 检查悬浮窗开启权限
* @param context
* @return
*/
public boolean checkFloatPermission(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return true;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
try {
Class cls = Class.forName("android.content.Context");
Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE");
declaredField.setAccessible(true);
Object obj = declaredField.get(cls);
if (!(obj instanceof String)) {
return false;
}
String str2 = (String) obj;
obj = cls.getMethod("getSystemService", String.class).invoke(context, str2);
cls = Class.forName("android.app.AppOpsManager");
Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED");
declaredField2.setAccessible(true);
Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class);
int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName());
return result == declaredField2.getInt(cls);
} catch (Exception e) {
return false;
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
if (appOpsMgr == null)
return false;
int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context
.getPackageName());
return Settings.canDrawOverlays(context) || mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED;
} else {
return Settings.canDrawOverlays(context);
}
}
}
public class BtnClick {
public void openFloat(View view) {
boolean floatWindowEnable = mMMKV.decodeBool(CommonConfig.FLOAT_WINDOW, false);
if (floatWindowEnable) {
hideFloatingWindow();
} else {
boolean permission = checkFloatPermission(SettingActivity.this);
if (permission) {
showFloatingWindow();
} else {
// 在Activity或Fragment中请求权限
if (!Settings.canDrawOverlays(SettingActivity.this)) {
Toast.makeText(SettingActivity.this, "请先打开悬浮窗权限", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_DRAW_OVER_OTHER_APPS_PERMISSION);
} else {
showFloatingWindow();
}
}
}
}
public void voiceBroadcast(View view) {
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(SettingActivity.this, Manifest.permission.READ_SMS)) {
ActivityCompat.requestPermissions(SettingActivity.this, PERMISSIONS_SMS, REQUEST_PERMISSION_CODE);
Toast.makeText(SettingActivity.this, "请授予读取短信权限", Toast.LENGTH_LONG).show();
return;
}
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(SettingActivity.this, Manifest.permission.RECEIVE_SMS)) {
ActivityCompat.requestPermissions(SettingActivity.this, PERMISSIONS_SMS, REQUEST_PERMISSION_CODE);
Toast.makeText(SettingActivity.this, "请授予接收短信权限", Toast.LENGTH_LONG).show();
return;
}
boolean voiceBroadcast = mMMKV.decodeBool(CommonConfig.VOICE_BROADCAST, false);
Log.e(TAG, "voiceBroadcast: voiceBroadcast = " + voiceBroadcast);
mViewDataBinding.setVoiceBroadcast(!voiceBroadcast);
mMMKV.encode(CommonConfig.VOICE_BROADCAST, !voiceBroadcast);
}
private String testText = "TTS从文本到语音Text To Speech是将文本转化为语音人机对话的一部分让机器能够说话。\n" +
"android自带的TTS目前只支持英文、法文、意大利文、德文、西班牙文。不支持中文如果想要播放出中文语音需要借助中文TTS引擎的帮助。";
public void testTts(View view) {
if (BuildConfig.DEBUG) {
Intent ttsIntent = new Intent(SettingActivity.this, TtsActivity.class);
ttsIntent.putExtra("sender", "test");
ttsIntent.putExtra("body", testText);
startActivity(ttsIntent);
}
}
public void autoAccept(View view) {
if (AccessibilityUtils.isAccessibilitySettingsOn(SettingActivity.this)) {
boolean autoAccept = mMMKV.decodeBool(CommonConfig.WECHAT_CALL_AUTO_ACCEPT, true);
Log.e(TAG, "autoAccept: autoAccept = " + autoAccept);
mViewDataBinding.setAutoAccept(!autoAccept);
mMMKV.encode(CommonConfig.WECHAT_CALL_AUTO_ACCEPT, !autoAccept);
Intent intent = new Intent(WeAccessibilityService.SETTING_AUTOMATIC_ANSWER_ACTION);
intent.putExtra("auto_answer", !autoAccept);
} else {
Toast.makeText(SettingActivity.this, "请在无障碍服务中打开 - 关爱守护快捷服务", Toast.LENGTH_LONG).show();
startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
}
}
public void setDialTone(View view) {
boolean dialTone = mMMKV.decodeBool(CommonConfig.DISABLE_DIAL_TONE_MODIFY, true);
Log.e(TAG, "setDialTone: dialTone = " + dialTone);
mViewDataBinding.setDialTone(!dialTone);
mMMKV.encode(CommonConfig.DISABLE_DIAL_TONE_MODIFY, !dialTone);
}
public void toInternet(View view) {
startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
}
public void toFont(View view) {
startActivity(new Intent(Settings.ACTION_DISPLAY_SETTINGS));
}
public void toTouch(View view) {
startActivity(new Intent(SettingActivity.this, TouchActivity.class));
}
public void toSettings(View view) {
startActivity(new Intent(Settings.ACTION_SETTINGS));
}
}
}

View File

@@ -0,0 +1,18 @@
package com.xxpatx.os.activity.setting;
import com.trello.rxlifecycle4.android.ActivityEvent;
import com.xxpatx.os.base.mvvm.BaseViewModel;
import com.xxpatx.os.databinding.ActivitySettingBinding;
public class SettingViewModel extends BaseViewModel<ActivitySettingBinding, ActivityEvent> {
@Override
public ActivitySettingBinding getVDBinding() {
return binding;
}
@Override
public void onDestroy() {
}
}

View File

@@ -0,0 +1,53 @@
package com.xxpatx.os.activity.setting;
import android.os.Bundle;
import androidx.appcompat.app.ActionBar;
import androidx.preference.PreferenceFragmentCompat;
import com.xxpatx.os.R;
import com.xxpatx.os.base.mvvm.BaseMvvmActivity;
public class SettingsActivity extends BaseMvvmActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
@Override
protected int getLayoutId() {
return 0;
}
@Override
protected void initDataBinding() {
}
@Override
protected void initView() {
}
@Override
protected void initData() {
}
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
}
}
}

View File

@@ -0,0 +1,74 @@
package com.xxpatx.os.activity.setting;
import android.util.Log;
import android.view.View;
import com.tencent.mmkv.MMKV;
import com.xxpatx.os.R;
import com.xxpatx.os.base.mvvm.BaseMvvmActivity;
import com.xxpatx.os.config.CommonConfig;
import com.xxpatx.os.databinding.ActivityTouchBinding;
public class TouchActivity extends BaseMvvmActivity<TouchViewModel, ActivityTouchBinding> {
private static final String TAG =TouchActivity.class.getSimpleName() ;
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
@Override
protected int getLayoutId() {
return R.layout.activity_touch;
}
@Override
protected void initDataBinding() {
mViewModel.setCtx(this);
mViewModel.setVDBinding(mViewDataBinding);
mViewModel.setLifecycle(getLifecycleSubject());
mViewDataBinding.setClick(new BtnClick());
}
@Override
protected void initView() {
boolean disableKey = mMMKV.decodeBool(CommonConfig.DISABLE_VOLUME_KEY, false);
Log.e(TAG, "initView: disableKey = " + disableKey);
mViewDataBinding.setDisableKey(disableKey);
boolean contactModify = mMMKV.decodeBool(CommonConfig.DISABLE_CONTACT_MODIFY, false);
Log.e(TAG, "initView: contactModify = " + contactModify);
mViewDataBinding.setDisableContact(contactModify);
boolean clockModify = mMMKV.decodeBool(CommonConfig.DISABLE_CLOCK_MODIFY, false);
Log.e(TAG, "disableVolumeKey: clockModify = " + clockModify);
mViewDataBinding.setDisableClock(clockModify);
}
@Override
protected void initData() {
}
public class BtnClick {
public void disableVolumeKey(View view) {
boolean disableKey = mMMKV.decodeBool(CommonConfig.DISABLE_VOLUME_KEY, false);
Log.e(TAG, "disableVolumeKey: disableKey = " + disableKey);
mViewDataBinding.setDisableKey(!disableKey);
mMMKV.encode(CommonConfig.DISABLE_VOLUME_KEY, !disableKey);
}
public void disableContactModify(View view) {
boolean contactModify = mMMKV.decodeBool(CommonConfig.DISABLE_CONTACT_MODIFY, false);
Log.e(TAG, "disableVolumeKey: contactModify = " + contactModify);
mViewDataBinding.setDisableContact(!contactModify);
mMMKV.encode(CommonConfig.DISABLE_CONTACT_MODIFY, !contactModify);
}
public void disableClockModify(View view) {
boolean clockModify = mMMKV.decodeBool(CommonConfig.DISABLE_CLOCK_MODIFY, false);
Log.e(TAG, "disableVolumeKey: clockModify = " + clockModify);
mViewDataBinding.setDisableClock(!clockModify);
mMMKV.encode(CommonConfig.DISABLE_CLOCK_MODIFY, !clockModify);
}
}
}

View File

@@ -0,0 +1,18 @@
package com.xxpatx.os.activity.setting;
import com.trello.rxlifecycle4.android.ActivityEvent;
import com.xxpatx.os.base.mvvm.BaseViewModel;
import com.xxpatx.os.databinding.ActivityTouchBinding;
public class TouchViewModel extends BaseViewModel<ActivityTouchBinding, ActivityEvent> {
@Override
public ActivityTouchBinding getVDBinding() {
return binding;
}
@Override
public void onDestroy() {
}
}