From 314c053e560ca9065a301207f4073e0c9b73d5b4 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Thu, 13 Aug 2026 15:26:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(debug):=20=E6=96=B0=E5=A2=9E=E7=94=A8?= =?UTF-8?q?=E6=88=B7Debug=E6=A8=A1=E5=BC=8F=E5=85=A5=E5=8F=A3=E5=8F=8A?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 连续点击触发Debug密码弹窗,验证后进入DebugActivity - 新增UserDebugDialog及相关样式和颜色资源 - 新增开发者选项、USB、蓝牙、相机、TF卡、恢复出厂、应用安装等状态的getter方法 - 将部分系统设置方法改为public以支持调试页面调用 - 移除ShakeDetectionManager中的高频日志输出 --- app/src/main/AndroidManifest.xml | 3 + .../sn/activity/debug/DebugActivity.java | 140 ++++++++ .../sn/activity/debug/DebugViewModel.java | 18 + .../sn/activity/main/MainActivity.java | 44 ++- .../sn/detection/ShakeDetectionManager.java | 2 +- .../aoleyun/sn/dialog/UserDebugDialog.java | 248 ++++++++++++++ .../java/com/aoleyun/sn/utils/JgyUtils.java | 6 + .../com/aoleyun/sn/utils/SysSettingUtils.java | 36 +- app/src/main/res/drawable/bt_pressed.xml | 11 + .../res/drawable/debug_edit_background.xml | 18 + app/src/main/res/drawable/home_card_bg.xml | 19 ++ app/src/main/res/layout/activity_debug.xml | 311 ++++++++++++++++++ app/src/main/res/layout/dialog_userdebug.xml | 87 +++++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/styles.xml | 13 + permission.xml | 58 ++++ 16 files changed, 1008 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/aoleyun/sn/activity/debug/DebugActivity.java create mode 100644 app/src/main/java/com/aoleyun/sn/activity/debug/DebugViewModel.java create mode 100644 app/src/main/java/com/aoleyun/sn/dialog/UserDebugDialog.java create mode 100644 app/src/main/res/drawable/bt_pressed.xml create mode 100644 app/src/main/res/drawable/debug_edit_background.xml create mode 100644 app/src/main/res/drawable/home_card_bg.xml create mode 100644 app/src/main/res/layout/activity_debug.xml create mode 100644 app/src/main/res/layout/dialog_userdebug.xml create mode 100644 permission.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 23338b0..55611ac 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -233,6 +233,9 @@ + { + private static final String TAG = "DebugActivity"; + + private JgyUtils jgyUtils; + + @Override + protected int getLayoutId() { + return R.layout.activity_debug; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView() { + jgyUtils = JgyUtils.getInstance(); + initListener(); + } + + @Override + protected void initData() { + boolean canReset = SysSettingUtils.getCanReset(DebugActivity.this); + Log.e(TAG, "initData: canReset = " + canReset); + mViewDataBinding.swRestore.setChecked(canReset); + + boolean usbStatus = SysSettingUtils.isDisableUsbStatus(DebugActivity.this); + Log.e(TAG, "initData: usbStatus = " + usbStatus); + mViewDataBinding.swUsbDebug.setChecked(usbStatus); + + int tf = SysSettingUtils.getTF(DebugActivity.this); + Log.e(TAG, "initData: tf = " + tf); + mViewDataBinding.swTf.setChecked(tf == 0); + + boolean developer = jgyUtils.getDeveloperOptions(); + Log.e(TAG, "initData: developer = " + developer); + mViewDataBinding.swDeveloper.setChecked(developer); + + int bluetooth = SysSettingUtils.getBluetooth(DebugActivity.this); + Log.e(TAG, "initData: bluetooth = " + bluetooth); + mViewDataBinding.swBluetooth.setChecked(bluetooth == 0); + + int camera = SysSettingUtils.getCamera(DebugActivity.this); + Log.e(TAG, "initData: camera = " + camera); + mViewDataBinding.swCamera.setChecked(camera == 0); + + int appinstall = SysSettingUtils.getAdminApp(DebugActivity.this); + Log.e(TAG, "initData: appinstall = " + appinstall); + mViewDataBinding.swAppinstall.setChecked(appinstall == 0); + + } + + private void initListener() { + mViewDataBinding.swRestore.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + // isChecked=true 允许恢复出厂 -> state=0; false 禁止 -> state=1 + SysSettingUtils.setCanReset(DebugActivity.this, isChecked ? 0 : 1); + Toaster.show("恢复出厂设置已" + (isChecked ? "开启" : "关闭")); + } + }); + + mViewDataBinding.swUsbDebug.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + // isChecked=true 开启 -> state=1(MTP); false 仅充电 -> state=0 + SysSettingUtils.setUsbStatus(DebugActivity.this, isChecked ? 1 : 0); + Toaster.show("USB调试已" + (isChecked ? "开启" : "关闭")); + } + }); + + mViewDataBinding.swTf.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + // isChecked=true 开启 -> state=0; false 关闭 -> state=1 + SysSettingUtils.setTF(DebugActivity.this, isChecked ? 0 : 1); + Toaster.show("存储卡已" + (isChecked ? "开启" : "关闭")); + } + }); + + mViewDataBinding.swDeveloper.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + jgyUtils.setDeveloperOptions(isChecked ? 1 : 0); + Toaster.show("开发者选项已" + (isChecked ? "开启" : "关闭")); + } + }); + + mViewDataBinding.swBluetooth.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + // isChecked=true 开启 -> state=0; false 关闭 -> state=1 + SysSettingUtils.setBluetooth(DebugActivity.this, isChecked ? 0 : 1); + Toaster.show("蓝牙已" + (isChecked ? "开启" : "关闭")); + } + }); + + mViewDataBinding.swCamera.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + // isChecked=true 开启 -> state=0; false 关闭 -> state=1 + SysSettingUtils.setCamera(DebugActivity.this, isChecked ? 0 : 1); + Toaster.show("摄像头已" + (isChecked ? "开启" : "关闭")); + } + }); + + mViewDataBinding.swAppinstall.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + // isChecked=true 允许安装 -> state=0; false 禁止 -> state=1 + SysSettingUtils.setAdminApp(DebugActivity.this, isChecked ? 0 : 1); + Toaster.show("允许安装应用已" + (isChecked ? "开启" : "关闭")); + } + }); + + } + + public class BtnClick { + public void refresh(View view) { + initData(); + } + } +} diff --git a/app/src/main/java/com/aoleyun/sn/activity/debug/DebugViewModel.java b/app/src/main/java/com/aoleyun/sn/activity/debug/DebugViewModel.java new file mode 100644 index 0000000..5510b31 --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/activity/debug/DebugViewModel.java @@ -0,0 +1,18 @@ +package com.aoleyun.sn.activity.debug; + +import com.aoleyun.sn.base.mvvm.BaseViewModel; +import com.aoleyun.sn.databinding.ActivityDebugBinding; +import com.trello.rxlifecycle4.android.ActivityEvent; + +public class DebugViewModel extends BaseViewModel { + + @Override + public ActivityDebugBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } +} diff --git a/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java b/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java index 01e89bc..8baa1ef 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java @@ -23,7 +23,7 @@ import androidx.lifecycle.Observer; import com.aoleyun.sn.BuildConfig; import com.aoleyun.sn.R; -import com.aoleyun.sn.activity.requestlog.RequestLogActivity; +import com.aoleyun.sn.activity.debug.DebugActivity; import com.aoleyun.sn.activity.update.UpdateActivity; import com.aoleyun.sn.base.mvvm.BaseMvvmActivity; import com.aoleyun.sn.bean.AppSettings; @@ -33,6 +33,7 @@ import com.aoleyun.sn.comm.JGYActions; import com.aoleyun.sn.comm.PackageNames; import com.aoleyun.sn.databinding.ActivityMainBinding; import com.aoleyun.sn.dialog.UpdateDialog; +import com.aoleyun.sn.dialog.UserDebugDialog; import com.aoleyun.sn.service.main.MainService; import com.aoleyun.sn.utils.ApkUtils; import com.aoleyun.sn.utils.GlideLoadUtils; @@ -93,10 +94,49 @@ public class MainActivity extends BaseMvvmActivity= (SystemClock.uptimeMillis() - DURATION)) { mHits = new long[COUNTS];//重新初始化数组 - startActivity(new Intent(MainActivity.this, RequestLogActivity.class)); +// startActivity(new Intent(MainActivity.this, RequestLogActivity.class)); + showDebugDialog(); } } + private UserDebugDialog mUserDebugDialog; + + private void showDebugDialog() { + if (mUserDebugDialog != null) { + mUserDebugDialog.dismiss(); + mUserDebugDialog = null; + } + mUserDebugDialog = new UserDebugDialog(this); + mUserDebugDialog.setOnClickBottomListener(new UserDebugDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + if ("10262022".equals(mUserDebugDialog.getEdittext())) { +// mMMKV.encode(CommonConfig.EnableDebug, true); + Toaster.show("进入用户Debug模式"); + startActivity(new Intent(MainActivity.this, DebugActivity.class)); +// AdminManager.getInstance().setRestoreFactoryDisabled(1); +// AdminManager.getInstance().removeActiveDeviceAdmin(); + } else { + Toaster.show("密码错误"); + } + mUserDebugDialog.dismiss(); + } + + @Override + public void onNegtiveClick() { + mUserDebugDialog.dismiss(); + } + }); +// if (ScreenUtils.isTablet(MainActivity.this)) { +// AutoSizeCompat.autoConvertDensityBaseOnWidth(getResources(), BaseAlertDialogBuilder.ALERT_BASE_WIDTH_TABLE); +// } else { +// AutoSizeCompat.autoConvertDensityBaseOnWidth(getResources(), BaseAlertDialogBuilder.ALERT_BASE_WIDTH); +// } + mUserDebugDialog.show(); + mUserDebugDialog.getWindow().setGravity(Gravity.CENTER); + mUserDebugDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + mUserDebugDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + } @Override public void onDisconnected() { diff --git a/app/src/main/java/com/aoleyun/sn/detection/ShakeDetectionManager.java b/app/src/main/java/com/aoleyun/sn/detection/ShakeDetectionManager.java index 514b210..1f1bf40 100644 --- a/app/src/main/java/com/aoleyun/sn/detection/ShakeDetectionManager.java +++ b/app/src/main/java/com/aoleyun/sn/detection/ShakeDetectionManager.java @@ -137,7 +137,7 @@ public class ShakeDetectionManager implements SensorEventListener { @Override public void onSensorChanged(SensorEvent event) { int sensorType = event.sensor.getType(); - Log.e(TAG, "onSensorChanged: sensorType = " + sensorType + ", values=" + event.values[0] + "," + event.values[1] + "," + event.values[2]); +// Log.e(TAG, "onSensorChanged: sensorType = " + sensorType + ", values=" + event.values[0] + "," + event.values[1] + "," + event.values[2]); if (sensorType == Sensor.TYPE_STEP_DETECTOR) { handleStepDetection(); } else if (sensorType == Sensor.TYPE_LINEAR_ACCELERATION diff --git a/app/src/main/java/com/aoleyun/sn/dialog/UserDebugDialog.java b/app/src/main/java/com/aoleyun/sn/dialog/UserDebugDialog.java new file mode 100644 index 0000000..ae7c281 --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/dialog/UserDebugDialog.java @@ -0,0 +1,248 @@ +package com.aoleyun.sn.dialog; + +import android.app.AlertDialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.aoleyun.sn.R; + +/** + * description:自定义dialog + */ + +public class UserDebugDialog extends AlertDialog { + + /** + * 显示的标题 + */ + private TextView titleTv; + + /** + * 确认和取消按钮 + */ + private Button negtiveBn, positiveBn; + + private EditText editText; + + + private Context mContext; + + public UserDebugDialog(Context context) { + super(context, R.style.UserDebugDialog); + this.mContext = context; + } + + /** + * 都是内容数据 + */ + private String message; + private String title; + private String positive, negtive; + private int imageResId = -1; + + /** + * 底部是否只有一个按钮 + */ + private boolean isSingle = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_userdebug); + //按空白处不能取消动画 + setCanceledOnTouchOutside(false); + //初始化界面控件 + initView(); + //初始化界面数据 + refreshView(); + //初始化界面控件的事件 + initEvent(); + } + + /** + * 初始化界面的确定和取消监听器 + */ + private void initEvent() { + //设置确定按钮被点击后,向外界提供监听 + positiveBn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onClickBottomListener != null) { + onClickBottomListener.onPositiveClick(); + } + } + }); + //设置取消按钮被点击后,向外界提供监听 + negtiveBn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onClickBottomListener != null) { + onClickBottomListener.onNegtiveClick(); + } + } + }); + } + + /** + * 初始化界面控件的显示数据 + */ + private void refreshView() { + //如果用户自定了title和message +// if (!TextUtils.isEmpty(title)) { +// titleTv.setText(title); +// titleTv.setVisibility(View.VISIBLE); +// } else { +// titleTv.setVisibility(View.GONE); +// } + //如果设置按钮的文字 + if (!TextUtils.isEmpty(positive)) { + positiveBn.setText(positive); + } else { + positiveBn.setText("确定"); + } + if (!TextUtils.isEmpty(negtive)) { + negtiveBn.setText(negtive); + } else { + negtiveBn.setText("取消"); + } + + /** + * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件 + */ + if (isSingle) { + negtiveBn.setVisibility(View.GONE); + } else { + negtiveBn.setVisibility(View.VISIBLE); + } + } + + @Override + public void show() { + super.show(); + refreshView(); + } + + /** + * 初始化界面控件 + */ + private void initView() { + negtiveBn = findViewById(R.id.bt_cancel); + positiveBn = findViewById(R.id.bt_confirm); + titleTv = findViewById(R.id.tv_title); + editText = findViewById(R.id.editText); + } + + /** + * 设置确定取消按钮的回调 + */ + private OnClickBottomListener onClickBottomListener; + + public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) { + this.onClickBottomListener = onClickBottomListener; + } + + public interface OnClickBottomListener { + /** + * 点击确定按钮事件 + */ + void onPositiveClick(); + + /** + * 点击取消按钮事件 + */ + void onNegtiveClick(); + } + + public String getMessage() { + return message; + } + + public UserDebugDialog setMessage(String message) { + this.message = message; + return this; + } + + public String getTitle() { + return title; + } + + public UserDebugDialog setTitle(String title) { + this.title = title; + return this; + } + + public String getPositive() { + return positive; + } + + public UserDebugDialog setPositive(String positive) { + this.positive = positive; + return this; + } + + public String getNegtive() { + return negtive; + } + + public UserDebugDialog setNegtive(String negtive) { + this.negtive = negtive; + return this; + } + + public UserDebugDialog setNegtiveText(String negtive) { + negtiveBn.setText(negtive); + return this; + } + + public int getImageResId() { + return imageResId; + } + + public boolean isSingle() { + return isSingle; + } + + public UserDebugDialog setSingle(boolean single) { + isSingle = single; + return this; + } + + public UserDebugDialog setImageResId(int imageResId) { + this.imageResId = imageResId; + return this; + } + + public void showKeyboard() { + if (editText != null) { + //设置可获得焦点 + editText.setFocusable(true); + editText.setFocusableInTouchMode(true); + //请求获得焦点 + editText.requestFocus(); + //调用系统输入法 + InputMethodManager inputManager = (InputMethodManager) editText + .getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + inputManager.showSoftInput(editText, 0); + } + } + + @Override + public void dismiss() { + super.dismiss(); + + } + + public String getEdittext() { + if (!TextUtils.isEmpty(editText.getText().toString())) { + return editText.getText().toString().trim(); + } else { + return ""; + } + } +} diff --git a/app/src/main/java/com/aoleyun/sn/utils/JgyUtils.java b/app/src/main/java/com/aoleyun/sn/utils/JgyUtils.java index 8779ac1..9d07ad1 100644 --- a/app/src/main/java/com/aoleyun/sn/utils/JgyUtils.java +++ b/app/src/main/java/com/aoleyun/sn/utils/JgyUtils.java @@ -2166,6 +2166,12 @@ public class JgyUtils { } } + public boolean getDeveloperOptions() { + int development = Settings.System.getInt(crv, CommonConfig.AOLE_ACTION_DEVELOPER_OPTIONS, 0); + int adb = Settings.Global.getInt(crv, Settings.Global.ADB_ENABLED, 0); + return development == 1 && adb == 1; + } + private String chromium_pkg = "org.chromium.browser"; public void hookWebView() { diff --git a/app/src/main/java/com/aoleyun/sn/utils/SysSettingUtils.java b/app/src/main/java/com/aoleyun/sn/utils/SysSettingUtils.java index 2ad9511..1b016f9 100644 --- a/app/src/main/java/com/aoleyun/sn/utils/SysSettingUtils.java +++ b/app/src/main/java/com/aoleyun/sn/utils/SysSettingUtils.java @@ -203,7 +203,7 @@ public class SysSettingUtils { } } - private static void setUsbStatus(Context context, int state) { + public static void setUsbStatus(Context context, int state) { Log.e(TAG, "setUsbStatus: " + state); //USB数据功能管控 //仅充电:usb_charge @@ -330,6 +330,11 @@ public class SysSettingUtils { context.sendBroadcast(usbIntent); } // } + + } + + public static boolean isDisableUsbStatus(Context context) { + return "usb_charge".equals(Settings.System.getString(context.getContentResolver(), "aole_usb_choose")); } /** @@ -495,6 +500,11 @@ public class SysSettingUtils { } } + public static int getBluetooth(Context context) { + int setting_bht = Settings.System.getInt(context.getContentResolver(), CommonConfig.AOLE_ACTION_BHT_FORBID_ON, 0); + return setting_bht; + } + private static void setHotspot(Context context, int state) { try { Intent intent = new Intent(); @@ -633,7 +643,7 @@ public class SysSettingUtils { } } - private static void setCamera(Context context, int state) { + public static void setCamera(Context context, int state) { try { //摄像头开关 boolean qch_app_camera = Settings.System.putInt(context.getContentResolver(), "qch_app_camera", 0); @@ -681,7 +691,11 @@ public class SysSettingUtils { } } - private static void setTF(Context context, int state) { + public static int getCamera(Context context) { + return Settings.System.getInt(context.getContentResolver(), "qch_app_camera", 0); + } + + public static void setTF(Context context, int state) { //存储卡 if (JgyUtils.isAllWinnerDevice()) { AllwinnerCubeMdmManager.getInstance().setSDEnable(state == 0); @@ -773,6 +787,10 @@ public class SysSettingUtils { } } + public static int getTF(Context context) { + return Settings.System.getInt(context.getContentResolver(), CommonConfig.AOLE_ACTION_SDCARD_FORBID_ON, 0); + } + private static void setIcon(Context context, int state) { } @@ -788,7 +806,7 @@ public class SysSettingUtils { Log.e(TAG, "qch_app_wallpaper" + state); } - private static void setCanReset(Context context, int state) { + public static void setCanReset(Context context, int state) { Log.e(TAG, "setCanReset: state = " + state); Settings.System.putInt(context.getContentResolver(), CommonConfig.AOLE_ACTION_RESTORE_FORBID_ON, state); //默认打开 @@ -797,6 +815,10 @@ public class SysSettingUtils { } } + public static boolean getCanReset(Context context) { + return Settings.System.getInt(context.getContentResolver(), CommonConfig.AOLE_ACTION_RESTORE_FORBID_ON, 0) == 0; + } + //aole_restore_forbid_on=1,禁止恢复出厂设置 //aole_restore_forbid_on=0,允许恢复出厂设置 private static void setCanReset(Context context, JsonObject jsonObject) { @@ -985,7 +1007,11 @@ public class SysSettingUtils { } - private static void setAdminApp(Context context, int state) { + public static int getAdminApp(Context context) { + return Settings.System.getInt(context.getContentResolver(), CommonConfig.AOLE_APP_ALLOW_INSTALL, 0); + } + + public static void setAdminApp(Context context, int state) { Log.e(TAG, "setAdminApp: state = " + state); if (JgyUtils.isAllWinnerDevice()) { AllwinnerCubeMdmManager.getInstance().setInstallPackageEnable(state == 0); diff --git a/app/src/main/res/drawable/bt_pressed.xml b/app/src/main/res/drawable/bt_pressed.xml new file mode 100644 index 0000000..a459b44 --- /dev/null +++ b/app/src/main/res/drawable/bt_pressed.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/debug_edit_background.xml b/app/src/main/res/drawable/debug_edit_background.xml new file mode 100644 index 0000000..78a79a5 --- /dev/null +++ b/app/src/main/res/drawable/debug_edit_background.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_card_bg.xml b/app/src/main/res/drawable/home_card_bg.xml new file mode 100644 index 0000000..d2a29ef --- /dev/null +++ b/app/src/main/res/drawable/home_card_bg.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_debug.xml b/app/src/main/res/layout/activity_debug.xml new file mode 100644 index 0000000..9dbfa1b --- /dev/null +++ b/app/src/main/res/layout/activity_debug.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +