opt: independent runtime
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
package="com.stardust.auojs.inrt">
|
||||
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||
@@ -24,9 +25,11 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity android:name=".SettingsActivity"/>
|
||||
|
||||
<service
|
||||
android:name="com.stardust.view.accessibility.AccessibilityService"
|
||||
android:label="@string/_app_name"
|
||||
android:name=".rt.AccessibilityService"
|
||||
android:label="inrt"
|
||||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
||||
<intent-filter>
|
||||
<action android:name="android.accessibilityservice.AccessibilityService"/>
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
auto();
|
||||
toast(files.read("/sdcard/1.txt"));
|
||||
@@ -4,6 +4,7 @@ import android.app.Application;
|
||||
import android.app.Fragment;
|
||||
|
||||
import com.stardust.auojs.inrt.rt.AutoJs;
|
||||
import com.stardust.auojs.inrt.rt.GlobalKeyObserver;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/7/1.
|
||||
@@ -22,6 +23,7 @@ public class App extends Application {
|
||||
super.onCreate();
|
||||
sApp = this;
|
||||
AutoJs.initInstance(this);
|
||||
GlobalKeyObserver.init();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,20 +1,23 @@
|
||||
package com.stardust.auojs.inrt;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.RequiresApi;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import com.stardust.auojs.inrt.rt.AutoJs;
|
||||
import com.stardust.autojs.core.console.ConsoleView;
|
||||
import com.stardust.autojs.core.console.StardustConsole;
|
||||
import com.stardust.autojs.script.StringScriptSource;
|
||||
import com.stardust.pio.PFile;
|
||||
import com.stardust.pio.PFiles;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -24,19 +27,22 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
|
||||
private static final int PERMISSION_REQUEST_CODE = 1209;
|
||||
private static final int PERMISSION_REQUEST_CODE = 11186;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setupView();
|
||||
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||
checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||
}
|
||||
|
||||
private void setupView() {
|
||||
ConsoleView consoleView = new ConsoleView(this);
|
||||
setContentView(R.layout.activity_main);
|
||||
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolbar);
|
||||
ConsoleView consoleView = (ConsoleView) findViewById(R.id.console);
|
||||
consoleView.setConsole((StardustConsole) AutoJs.getInstance().getGlobalConsole());
|
||||
setContentView(consoleView);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -50,24 +56,29 @@ public class MainActivity extends AppCompatActivity {
|
||||
AutoJs.getInstance().getGlobalConsole().log(e);
|
||||
}
|
||||
}).start();
|
||||
if(!Pref.shouldShowMainActivity()){
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
System.out.println(PFiles.read("/sdcard/1.txt"));
|
||||
runScript();
|
||||
}
|
||||
|
||||
protected void checkPermission(String... permissions) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
String[] requestPermissions = getRequestPermissions(permissions);
|
||||
if (requestPermissions.length > 0) {
|
||||
requestPermissions(requestPermissions, PERMISSION_REQUEST_CODE);
|
||||
return;
|
||||
}else {
|
||||
runScript();
|
||||
}
|
||||
} else {
|
||||
int[] grantResults = new int[permissions.length];
|
||||
Arrays.fill(grantResults, PERMISSION_GRANTED);
|
||||
onRequestPermissionsResult(PERMISSION_REQUEST_CODE, permissions, grantResults);
|
||||
}
|
||||
int[] grantResults = new int[permissions.length];
|
||||
Arrays.fill(grantResults, PERMISSION_GRANTED);
|
||||
onRequestPermissionsResult(PERMISSION_REQUEST_CODE, permissions, grantResults);
|
||||
}
|
||||
|
||||
|
||||
@@ -82,4 +93,15 @@ public class MainActivity extends AppCompatActivity {
|
||||
return list.toArray(new String[list.size()]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
startActivity(new Intent(this, SettingsActivity.class));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.menu_main, menu);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
39
inrt/src/main/java/com/stardust/auojs/inrt/Pref.java
Normal file
39
inrt/src/main/java/com/stardust/auojs/inrt/Pref.java
Normal file
@@ -0,0 +1,39 @@
|
||||
package com.stardust.auojs.inrt;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/12/8.
|
||||
*/
|
||||
|
||||
public class Pref {
|
||||
|
||||
private static SharedPreferences sPreferences;
|
||||
|
||||
public static SharedPreferences getPreferences() {
|
||||
if (sPreferences == null)
|
||||
sPreferences = PreferenceManager.getDefaultSharedPreferences(App.getApp());
|
||||
return sPreferences;
|
||||
}
|
||||
|
||||
public static boolean isStableModeEnabled() {
|
||||
return getPreferences().getBoolean(getString(R.string.key_stable_mode), false);
|
||||
}
|
||||
|
||||
private static String getString(int res) {
|
||||
return App.getApp().getString(res);
|
||||
}
|
||||
|
||||
public static boolean shouldEnableAccessibilityServiceByRoot() {
|
||||
return getPreferences().getBoolean(getString(R.string.key_enable_accessibility_service_by_root), false);
|
||||
}
|
||||
|
||||
public static boolean shouldShowMainActivity() {
|
||||
return !getPreferences().getBoolean(getString(R.string.key_dont_show_main_activity), false);
|
||||
}
|
||||
|
||||
public static boolean shouldStopAllScriptsWhenVolumeUp() {
|
||||
return getPreferences().getBoolean(getString(R.string.key_use_volume_control_running), true);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.stardust.auojs.inrt;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.preference.Preference;
|
||||
import android.preference.PreferenceFragment;
|
||||
import android.preference.PreferenceScreen;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.View;
|
||||
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/12/8.
|
||||
*/
|
||||
|
||||
public class SettingsActivity extends AppCompatActivity {
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setupViews();
|
||||
}
|
||||
|
||||
private void setupViews() {
|
||||
setContentView(R.layout.activity_settings);
|
||||
getFragmentManager().beginTransaction().replace(R.id.fragment_setting, new PreferenceFragment()).commit();
|
||||
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||
toolbar.setTitle(R.string.text_settings);
|
||||
toolbar.setNavigationOnClickListener(v -> finish());
|
||||
setSupportActionBar(toolbar);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
|
||||
public static class PreferenceFragment extends android.preference.PreferenceFragment {
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
addPreferencesFromResource(R.xml.preference);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
|
||||
return super.onPreferenceTreeClick(preferenceScreen, preference);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.stardust.auojs.inrt.rt;
|
||||
|
||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||
|
||||
import com.stardust.auojs.inrt.Pref;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/12/8.
|
||||
*/
|
||||
|
||||
public class AccessibilityService extends com.stardust.view.accessibility.AccessibilityService {
|
||||
|
||||
|
||||
@Override
|
||||
protected void onServiceConnected() {
|
||||
AccessibilityServiceInfo serviceInfo = getServiceInfo();
|
||||
if (Pref.isStableModeEnabled()) {
|
||||
serviceInfo.flags &= ~AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
|
||||
} else {
|
||||
serviceInfo.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
|
||||
}
|
||||
setServiceInfo(serviceInfo);
|
||||
super.onServiceConnected();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
|
||||
import com.stardust.auojs.inrt.App;
|
||||
import com.stardust.auojs.inrt.Pref;
|
||||
import com.stardust.auojs.inrt.R;
|
||||
import com.stardust.autojs.runtime.exception.ScriptException;
|
||||
import com.stardust.view.accessibility.AccessibilityService;
|
||||
@@ -32,6 +33,7 @@ public class AutoJs extends com.stardust.autojs.AutoJs {
|
||||
super(context);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void ensureAccessibilityServiceEnabled() {
|
||||
if (AccessibilityService.getInstance() != null) {
|
||||
@@ -41,7 +43,11 @@ public class AutoJs extends com.stardust.autojs.AutoJs {
|
||||
if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(getApplication(), AccessibilityService.class)) {
|
||||
errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running);
|
||||
} else {
|
||||
if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(getApplication(), 2000)) {
|
||||
if (Pref.shouldEnableAccessibilityServiceByRoot()) {
|
||||
if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(getApplication(), 2000)) {
|
||||
errorMessage = App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout);
|
||||
}
|
||||
} else {
|
||||
errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission);
|
||||
}
|
||||
}
|
||||
@@ -51,6 +57,7 @@ public class AutoJs extends com.stardust.autojs.AutoJs {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected Application getApplication() {
|
||||
return App.getApp();
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
package com.stardust.auojs.inrt.rt;
|
||||
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
import com.stardust.auojs.inrt.Pref;
|
||||
import com.stardust.autojs.core.inputevent.InputEventObserver;
|
||||
import com.stardust.autojs.core.inputevent.ShellKeyObserver;
|
||||
import com.stardust.view.accessibility.AccessibilityService;
|
||||
import com.stardust.view.accessibility.OnKeyListener;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/8/14.
|
||||
*/
|
||||
|
||||
public class GlobalKeyObserver implements OnKeyListener, ShellKeyObserver.KeyListener {
|
||||
|
||||
|
||||
private static final String LOG_TAG = "GlobalKeyObserver";
|
||||
private static GlobalKeyObserver sSingleton = new GlobalKeyObserver();
|
||||
private boolean mVolumeDownFromShell, mVolumeDownFromAccessibility;
|
||||
private boolean mVolumeUpFromShell, mVolumeUpFromAccessibility;
|
||||
|
||||
GlobalKeyObserver() {
|
||||
AccessibilityService.getStickOnKeyObserver()
|
||||
.addListener(this);
|
||||
ShellKeyObserver observer = new ShellKeyObserver();
|
||||
observer.setKeyListener(this);
|
||||
InputEventObserver.getGlobal().addListener(observer);
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
public void onVolumeUp() {
|
||||
Log.d(LOG_TAG, "onVolumeUp at " + System.currentTimeMillis());
|
||||
if (Pref.shouldStopAllScriptsWhenVolumeUp()) {
|
||||
AutoJs.getInstance().getScriptEngineService().stopAllAndToast();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyEvent(int keyCode, KeyEvent event) {
|
||||
if (event.getAction() != KeyEvent.ACTION_UP)
|
||||
return;
|
||||
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
|
||||
if (mVolumeDownFromShell) {
|
||||
mVolumeDownFromShell = false;
|
||||
return;
|
||||
}
|
||||
mVolumeUpFromAccessibility = true;
|
||||
onVolumeDown();
|
||||
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
|
||||
if (mVolumeUpFromShell) {
|
||||
mVolumeUpFromShell = false;
|
||||
return;
|
||||
}
|
||||
mVolumeUpFromAccessibility = true;
|
||||
onVolumeUp();
|
||||
}
|
||||
}
|
||||
|
||||
public void onVolumeDown() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onKeyDown(String keyName) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyUp(String keyName) {
|
||||
if ("KEY_VOLUMEUP".equals(keyName)) {
|
||||
if (mVolumeUpFromAccessibility) {
|
||||
mVolumeUpFromAccessibility = false;
|
||||
return;
|
||||
}
|
||||
mVolumeUpFromShell = true;
|
||||
onVolumeUp();
|
||||
} else if ("KEY_VOLUMEDOWN".equals(keyName)) {
|
||||
if (mVolumeDownFromAccessibility) {
|
||||
mVolumeDownFromAccessibility = false;
|
||||
return;
|
||||
}
|
||||
mVolumeDownFromShell = true;
|
||||
onVolumeDown();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context="com.stardust.auojs.inrt.MainActivity">
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@android:color/white"
|
||||
android:fitsSystemWindows="true"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
<android.support.design.widget.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<android.support.v7.widget.Toolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</android.support.design.widget.AppBarLayout>
|
||||
|
||||
<com.stardust.autojs.core.console.ConsoleView
|
||||
android:id="@+id/console"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
</LinearLayout>
|
||||
27
inrt/src/main/res/layout/activity_settings.xml
Normal file
27
inrt/src/main/res/layout/activity_settings.xml
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@android:color/white"
|
||||
android:fitsSystemWindows="true"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
||||
<android.support.design.widget.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<android.support.v7.widget.Toolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</android.support.design.widget.AppBarLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/fragment_setting"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@android:color/white"/>
|
||||
</LinearLayout>
|
||||
7
inrt/src/main/res/menu/menu_main.xml
Normal file
7
inrt/src/main/res/menu/menu_main.xml
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item
|
||||
android:id="@+id/settings"
|
||||
android:title="@string/text_settings"/>
|
||||
</menu>
|
||||
@@ -3,4 +3,20 @@
|
||||
<string name="text_no_accessibility_permission">无障碍服务未启动</string>
|
||||
<string name="text_auto_operate_service_enabled_but_not_running">无障碍服务已启用但没有运行,您可以尝试重新启用或重启手机</string>
|
||||
<string name="text_enable_accessibility_service_by_root_timeout">使用root权限启用无障碍服务失败</string>
|
||||
<string name="text_settings">设置</string>
|
||||
<string name="text_script_running">脚本运行</string>
|
||||
|
||||
<string name="key_use_volume_control_running">key_use_volume_control_running</string>
|
||||
<string name="key_enable_accessibility_service_by_root">key_enable_accessibility_service_by_root</string>
|
||||
<string name="text_use_volume_to_stop_running">音量上键停止所有脚本</string>
|
||||
<string name="summary_enable_accessibility_service_by_root">开启后运行脚本会使用Root权限自动开启无障碍服务</string>
|
||||
<string name="text_enable_accessibility_service_by_root">使用Root权限自动启用服务</string>
|
||||
<string name="key_stable_mode">key_stable_mode</string>
|
||||
<string name="summary_stable_mode">开启后布局分析更稳定,但小部分脚本可能无法正常运行。重启无障碍服务生效</string>
|
||||
<string name="text_stable_mode">稳定模式</string>
|
||||
<string name="text_accessibility_service">无障碍服务</string>
|
||||
<string name="text_dont_show_main_activity">不显示主界面</string>
|
||||
<string name="key_dont_show_main_activity">key_dont_show_main_activity</string>
|
||||
<string name="summary_dont_show_main_activity">打开应用后直接运行脚本</string>
|
||||
<string name="text_others">其他</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<resources>
|
||||
|
||||
<!-- Base application theme. -->
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
|
||||
45
inrt/src/main/res/xml/preference.xml
Normal file
45
inrt/src/main/res/xml/preference.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<PreferenceCategory
|
||||
android:title="@string/text_script_running">
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="true"
|
||||
android:key="@string/key_use_volume_control_running"
|
||||
android:title="@string/text_use_volume_to_stop_running"/>
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="@string/key_dont_show_main_activity"
|
||||
android:summary="@string/summary_dont_show_main_activity"
|
||||
android:title="@string/text_dont_show_main_activity"/>
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:title="@string/text_accessibility_service">
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="@string/key_enable_accessibility_service_by_root"
|
||||
android:summary="@string/summary_enable_accessibility_service_by_root"
|
||||
android:title="@string/text_enable_accessibility_service_by_root"/>
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="@string/key_stable_mode"
|
||||
android:summary="@string/summary_stable_mode"
|
||||
android:title="@string/text_stable_mode"/>
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:title="@string/text_others">
|
||||
|
||||
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
|
||||
</PreferenceScreen>
|
||||
Reference in New Issue
Block a user