version:1.0.0
update:更换包名 bugfixes:
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user