diff --git a/app/src/main/java/org/meowcat/edxposed/manager/App.java b/app/src/main/java/org/meowcat/edxposed/manager/App.java index 85b94bcd..e952e094 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/App.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/App.java @@ -167,8 +167,8 @@ public class App extends Application implements Application.ActivityLifecycleCal if (pref.getBoolean("hook_modules", true)) { Collection installedModules = ModuleUtil.getInstance().getModules().values(); for (ModuleUtil.InstalledModule info : installedModules) { - if (!AppHelper.FORCE_WHITE_LIST_MODULE.contains(info.packageName)) { - AppHelper.FORCE_WHITE_LIST_MODULE.add(info.packageName); + if (!AppHelper.forceWhiteList.contains(info.packageName)) { + AppHelper.forceWhiteList.add(info.packageName); } } Log.d(TAG, "ApplicationList: Force add modules to list"); diff --git a/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppAdapter.java b/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppAdapter.java index 9f1ab927..1c985623 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppAdapter.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppAdapter.java @@ -1,6 +1,8 @@ package org.meowcat.edxposed.manager.adapters; +import android.annotation.SuppressLint; import android.content.Context; +import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -8,6 +10,9 @@ import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.text.TextUtils; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.CompoundButton; @@ -49,9 +54,11 @@ public class AppAdapter extends RecyclerView.Adapter impl private final PackageManager pm; private final ApplicationFilter filter; private Comparator cmp; + private final SharedPreferences preferences; AppAdapter(Context context) { this.context = context; + preferences = App.getPreferences(); fullList = showList = Collections.emptyList(); checkedList = Collections.emptyList(); filter = new ApplicationFilter(); @@ -93,11 +100,15 @@ public class AppAdapter extends RecyclerView.Adapter impl if (info.packageName.equals(((ScopeAdapter) this).modulePackageName)) { rmList.add(info); } - } else if (!App.getPreferences().getBoolean("show_modules", true)) { - if (info.metaData != null && info.metaData.containsKey("xposedmodule") || AppHelper.FORCE_WHITE_LIST_MODULE.contains(info.packageName)) { + } + if (!preferences.getBoolean("show_modules", true)) { + if (info.metaData != null && info.metaData.containsKey("xposedmodule") || AppHelper.forceWhiteList.contains(info.packageName)) { rmList.add(info); } } + if (!preferences.getBoolean("show_system_apps", true) && (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + rmList.add(info); + } } if (rmList.size() > 0) { fullList.removeAll(rmList); @@ -121,7 +132,7 @@ public class AppAdapter extends RecyclerView.Adapter impl } private void sortApps() { - switch (App.getPreferences().getInt("list_sort", 0)) { + switch (preferences.getInt("list_sort", 0)) { case 7: cmp = Collections.reverseOrder((ApplicationInfo a, ApplicationInfo b) -> { try { @@ -190,6 +201,79 @@ public class AppAdapter extends RecyclerView.Adapter impl }); } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + @SuppressLint("NonConstantResourceId") + public boolean onOptionsItemSelected(MenuItem item) { + int itemId = item.getItemId(); + if (itemId == R.id.item_show_system) { + item.setChecked(!item.isChecked()); + preferences.edit().putBoolean("show_system_apps", item.isChecked()).apply(); + } else if (itemId == R.id.item_show_modules) { + item.setChecked(!item.isChecked()); + preferences.edit().putBoolean("show_modules", item.isChecked()).apply(); + } else if (itemId == R.id.item_sort_by_name) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 0).apply(); + } else if (itemId == R.id.item_sort_by_name_reverse) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 1).apply(); + } else if (itemId == R.id.item_sort_by_package_name) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 2).apply(); + } else if (itemId == R.id.item_sort_by_package_name_reverse) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 3).apply(); + } else if (itemId == R.id.item_sort_by_install_time) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 4).apply(); + } else if (itemId == R.id.item_sort_by_install_time_reverse) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 5).apply(); + } else if (itemId == R.id.item_sort_by_update_time) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 6).apply(); + } else if (itemId == R.id.item_sort_by_update_time_reverse) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 7).apply(); + } else { + return false; + } + refresh(); + return true; + } + + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + inflater.inflate(R.menu.menu_app_list, menu); + menu.findItem(R.id.item_show_modules).setChecked(preferences.getBoolean("show_modules", true)); + menu.findItem(R.id.item_show_system).setChecked(preferences.getBoolean("show_system_apps", true)); + switch (preferences.getInt("list_sort", 0)) { + case 7: + menu.findItem(R.id.item_sort_by_update_time_reverse).setChecked(true); + break; + case 6: + menu.findItem(R.id.item_sort_by_update_time).setChecked(true); + break; + case 5: + menu.findItem(R.id.item_sort_by_install_time_reverse).setChecked(true); + break; + case 4: + menu.findItem(R.id.item_sort_by_install_time).setChecked(true); + break; + case 3: + menu.findItem(R.id.item_sort_by_package_name_reverse).setChecked(true); + break; + case 2: + menu.findItem(R.id.item_sort_by_package_name).setChecked(true); + break; + case 1: + menu.findItem(R.id.item_sort_by_name_reverse).setChecked(true); + break; + case 0: + menu.findItem(R.id.item_sort_by_name).setChecked(true); + break; + } + } + @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { ApplicationInfo info = showList.get(position); @@ -255,6 +339,7 @@ public class AppAdapter extends RecyclerView.Adapter impl } public void refresh() { + //noinspection deprecation AsyncTask.THREAD_POOL_EXECUTOR.execute(this::loadApps); } diff --git a/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java b/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java index 544720fe..2f6fd9c0 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java @@ -16,7 +16,6 @@ import androidx.appcompat.widget.PopupMenu; import androidx.fragment.app.FragmentManager; import org.meowcat.edxposed.manager.App; -import org.meowcat.edxposed.manager.BuildConfig; import org.meowcat.edxposed.manager.Constants; import org.meowcat.edxposed.manager.R; import org.meowcat.edxposed.manager.util.CompileUtil; @@ -30,7 +29,6 @@ import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Objects; @@ -45,8 +43,7 @@ public class AppHelper { private static final String SCOPE_LIST_PATH = "conf/%s.conf"; private static final String WHITE_LIST_MODE = "conf/usewhitelist"; - private static final List FORCE_WHITE_LIST = new ArrayList<>(Collections.singletonList(BuildConfig.APPLICATION_ID)); - public static List FORCE_WHITE_LIST_MODULE = new ArrayList<>(FORCE_WHITE_LIST); + public static List forceWhiteList = new ArrayList<>(); private static final HashMap> scopeList = new HashMap<>(); @@ -64,7 +61,7 @@ public class AppHelper { } private static boolean addBlackList(String packageName) { - if (FORCE_WHITE_LIST_MODULE.contains(packageName)) { + if (forceWhiteList.contains(packageName)) { removeBlackList(packageName); return false; } @@ -72,7 +69,7 @@ public class AppHelper { } private static boolean removeWhiteList(String packageName) { - if (FORCE_WHITE_LIST_MODULE.contains(packageName)) { + if (forceWhiteList.contains(packageName)) { return false; } return whiteListFileName(packageName, false); @@ -94,7 +91,7 @@ public class AppHelper { s.add(file1.getName()); } } - for (String pn : FORCE_WHITE_LIST_MODULE) { + for (String pn : forceWhiteList) { if (s.contains(pn)) { s.remove(pn); removeBlackList(pn); @@ -107,13 +104,13 @@ public class AppHelper { File file = new File(BASE_PATH + WHITE_LIST_PATH); File[] files = file.listFiles(); if (files == null) { - return FORCE_WHITE_LIST_MODULE; + return forceWhiteList; } List result = new ArrayList<>(); for (File file1 : files) { result.add(file1.getName()); } - for (String pn : FORCE_WHITE_LIST_MODULE) { + for (String pn : forceWhiteList) { if (!result.contains(pn)) { result.add(pn); addWhiteList(pn); diff --git a/app/src/main/java/org/meowcat/edxposed/manager/adapters/BlackListAdapter.java b/app/src/main/java/org/meowcat/edxposed/manager/adapters/BlackListAdapter.java index dcea4048..cd48853d 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/adapters/BlackListAdapter.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/adapters/BlackListAdapter.java @@ -28,7 +28,7 @@ public class BlackListAdapter extends AppAdapter { if (App.getPreferences().getBoolean("hook_modules", true)) { Collection installedModules = ModuleUtil.getInstance().getModules().values(); for (ModuleUtil.InstalledModule info : installedModules) { - AppHelper.FORCE_WHITE_LIST_MODULE.add(info.packageName); + AppHelper.forceWhiteList.add(info.packageName); } } AppHelper.makeSurePath(); diff --git a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/AboutActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/AboutActivity.java index 0911a202..7413fa2f 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/AboutActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/AboutActivity.java @@ -1,6 +1,5 @@ package org.meowcat.edxposed.manager.ui.activity; -import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; diff --git a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/BaseActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/BaseActivity.java index 9ec4512b..fc5ba8e6 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/BaseActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/BaseActivity.java @@ -3,6 +3,7 @@ package org.meowcat.edxposed.manager.ui.activity; import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; +import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; @@ -42,6 +43,7 @@ public class BaseActivity extends AppCompatActivity { private static final String THEME_DEFAULT = "DEFAULT"; private static final String THEME_BLACK = "BLACK"; private String theme; + protected SharedPreferences preferences; public static boolean isBlackNightTheme() { return App.getPreferences().getBoolean("black_dark_theme", false) || App.getPreferences().getBoolean("md2", false); @@ -113,6 +115,7 @@ public class BaseActivity extends AppCompatActivity { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + preferences = App.getPreferences(); AppCompatDelegate.setDefaultNightMode(App.getPreferences().getInt("theme", -1)); theme = getTheme(this) + getCustomTheme() + App.getPreferences().getBoolean("md2", false); } diff --git a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/BlackListActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/BlackListActivity.java index 3291df66..33d7d4c5 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/BlackListActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/BlackListActivity.java @@ -4,6 +4,7 @@ import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.os.Handler; import android.view.Menu; +import android.view.MenuItem; import android.view.View; import androidx.annotation.NonNull; @@ -81,9 +82,17 @@ public class BlackListActivity extends BaseActivity implements AppAdapter.Callba }; } + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (!appAdapter.onOptionsItemSelected(item)) { + return super.onOptionsItemSelected(item); + } + return true; + } + @Override public boolean onCreateOptionsMenu(@NonNull Menu menu) { - getMenuInflater().inflate(R.menu.menu_app_list, menu); + appAdapter.onCreateOptionsMenu(menu, getMenuInflater()); searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView.setOnQueryTextListener(searchListener); return super.onCreateOptionsMenu(menu); diff --git a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/ModuleScopeActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/ModuleScopeActivity.java index 27c57616..2cabfe3f 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/ModuleScopeActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/ModuleScopeActivity.java @@ -4,6 +4,7 @@ import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.os.Handler; import android.view.Menu; +import android.view.MenuItem; import android.view.View; import androidx.annotation.NonNull; @@ -66,7 +67,7 @@ public class ModuleScopeActivity extends BaseActivity implements AppAdapter.Call fastScrollerBuilder.build(); appAdapter.setCallback(this); handler.postDelayed(runnable, 300); - binding.swipeRefreshLayout.setOnRefreshListener(() -> appAdapter.refresh()); + binding.swipeRefreshLayout.setOnRefreshListener(appAdapter::refresh); searchListener = new SearchView.OnQueryTextListener() { @Override @@ -83,14 +84,38 @@ public class ModuleScopeActivity extends BaseActivity implements AppAdapter.Call }; } + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (!appAdapter.onOptionsItemSelected(item)) { + return super.onOptionsItemSelected(item); + } + return true; + } + @Override public boolean onCreateOptionsMenu(@NonNull Menu menu) { - getMenuInflater().inflate(R.menu.menu_app_list, menu); + appAdapter.onCreateOptionsMenu(menu, getMenuInflater()); searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView.setOnQueryTextListener(searchListener); return super.onCreateOptionsMenu(menu); } + @Override + public void onResume() { + super.onResume(); + changeTitle(isWhiteListMode()); + } + + + private void changeTitle(boolean isWhiteListMode) { + setTitle(isWhiteListMode ? R.string.title_white_list : R.string.title_black_list); + + } + + private boolean isWhiteListMode() { + return AppHelper.isWhiteListMode(); + } + @Override public void onDataReady() { handler.removeCallbacks(runnable); diff --git a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/ModulesActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/ModulesActivity.java index c24465d5..67d4b4dc 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/ModulesActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/ui/activity/ModulesActivity.java @@ -88,7 +88,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi } } } - switch (App.getPreferences().getInt("list_sort", 0)) { + switch (preferences.getInt("list_sort", 0)) { case 7: cmp = Collections.reverseOrder((ApplicationInfo a, ApplicationInfo b) -> { try { @@ -197,7 +197,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi binding.recyclerView.setAdapter(adapter); binding.recyclerView.setLayoutManager(new LinearLayoutManagerFix(this)); FastScrollerBuilder fastScrollerBuilder = new FastScrollerBuilder(binding.recyclerView); - if (!App.getPreferences().getBoolean("md2", false)) { + if (!preferences.getBoolean("md2", false)) { DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); binding.recyclerView.addItemDecoration(dividerItemDecoration); @@ -279,24 +279,14 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi } } } - }/* else if (requestCode == 44) { - if (data != null) { - Uri uri = data.getData(); - if (uri != null) { - try { - importModules(uri); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - }*/ + } } @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { Intent intent; int itemId = item.getItemId(); + boolean reload = false; if (itemId == R.id.export_enabled_modules) { if (ModuleUtil.getInstance().getEnabledModules().isEmpty()) { Snackbar.make(binding.snackbar, R.string.no_enabled_modules, Snackbar.LENGTH_SHORT).show(); @@ -321,12 +311,42 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi intent.putExtra(Intent.EXTRA_TITLE, "installed_modules.list"); startActivityForResult(intent, 43); return true; - } else if (itemId == R.id.import_installed_modules || itemId == R.id.import_enabled_modules) { - intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); - intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType("*/*"); - startActivityForResult(intent, 44); - return true; + } else if (itemId == R.id.item_sort_by_name) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 0).apply(); + reload = true; + } else if (itemId == R.id.item_sort_by_name_reverse) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 1).apply(); + reload = true; + } else if (itemId == R.id.item_sort_by_package_name) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 2).apply(); + reload = true; + } else if (itemId == R.id.item_sort_by_package_name_reverse) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 3).apply(); + reload = true; + } else if (itemId == R.id.item_sort_by_install_time) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 4).apply(); + reload = true; + } else if (itemId == R.id.item_sort_by_install_time_reverse) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 5).apply(); + reload = true; + } else if (itemId == R.id.item_sort_by_update_time) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 6).apply(); + reload = true; + } else if (itemId == R.id.item_sort_by_update_time_reverse) { + item.setChecked(true); + preferences.edit().putInt("list_sort", 7).apply(); + reload = true; + } + if (reload) { + moduleUtil.updateModulesList(false, null); + reloadModules.run(); } return super.onOptionsItemSelected(item); } @@ -593,31 +613,31 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi TextView warningText = holder.warningText; if (item.minVersion == 0) { - if (!App.getPreferences().getBoolean("skip_xposedminversion_check", false)) { + if (!preferences.getBoolean("skip_xposedminversion_check", false)) { mSwitch.setEnabled(false); } warningText.setText(getString(R.string.no_min_version_specified)); warningText.setVisibility(View.VISIBLE); } else if (installedXposedVersion > 0 && item.minVersion > installedXposedVersion) { - if (!App.getPreferences().getBoolean("skip_xposedminversion_check", false)) { + if (!preferences.getBoolean("skip_xposedminversion_check", false)) { mSwitch.setEnabled(false); } warningText.setText(String.format(getString(R.string.warning_xposed_min_version), item.minVersion)); warningText.setVisibility(View.VISIBLE); } else if (item.minVersion < ModuleUtil.MIN_MODULE_VERSION) { - if (!App.getPreferences().getBoolean("skip_xposedminversion_check", false)) { + if (!preferences.getBoolean("skip_xposedminversion_check", false)) { mSwitch.setEnabled(false); } warningText.setText(String.format(getString(R.string.warning_min_version_too_low), item.minVersion, ModuleUtil.MIN_MODULE_VERSION)); warningText.setVisibility(View.VISIBLE); } else if (item.isInstalledOnExternalStorage()) { - if (!App.getPreferences().getBoolean("skip_xposedminversion_check", false)) { + if (!preferences.getBoolean("skip_xposedminversion_check", false)) { mSwitch.setEnabled(false); } warningText.setText(getString(R.string.warning_installed_on_external_storage)); warningText.setVisibility(View.VISIBLE); } else if (installedXposedVersion == 0 || (installedXposedVersion == -1)) { - if (!App.getPreferences().getBoolean("skip_xposedminversion_check", false)) { + if (!preferences.getBoolean("skip_xposedminversion_check", false)) { mSwitch.setEnabled(false); } warningText.setText(getString(R.string.not_installed_no_lollipop)); diff --git a/app/src/main/res/menu/menu_app_list.xml b/app/src/main/res/menu/menu_app_list.xml index d24a1da1..8fbcc86e 100644 --- a/app/src/main/res/menu/menu_app_list.xml +++ b/app/src/main/res/menu/menu_app_list.xml @@ -6,16 +6,79 @@ android:id="@+id/menu_search" android:title="@string/menuSearch" app:actionViewClass="androidx.appcompat.widget.SearchView" - app:showAsAction="always" /> - + app:showAsAction="ifRoom" /> + android:id="@+id/item_show_system" + android:checkable="true" + android:checked="true" + android:title="@string/menu_show_system_apps" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c18c3e3e..4f0456c6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -316,4 +316,7 @@ 启用资源钩子 警告: 资源钩子已被弃用 变体 + 优化… + 系统应用 + 模块 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 82bd9b27..fc11fa1e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -345,4 +345,7 @@ Enable scope The version of LSPosed you installed does not support module scope, download new version? Variant + Optimize + System apps + Modules diff --git a/app/src/main/res/xml/prefs.xml b/app/src/main/res/xml/prefs.xml index c446c4a2..20b08dd4 100644 --- a/app/src/main/res/xml/prefs.xml +++ b/app/src/main/res/xml/prefs.xml @@ -11,22 +11,6 @@ android:summary="@string/skip_xposedminversion_check_summ" android:title="@string/skip_xposedminversion_check" app:iconSpaceReserved="false" /> - - - - - + + -->