Remove "optimize all" and reboot menus (#43)

* Remove "optimize all" menus

* Remove reboot menus
This commit is contained in:
tehcneko 2021-02-02 12:20:36 +08:00 committed by GitHub
parent aa0d587be0
commit 9c93b65206
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 15 additions and 646 deletions

View File

@ -53,10 +53,6 @@
</intent-filter>
</activity>
<receiver
android:name=".util.NotificationUtil$RebootReceiver"
android:exported="false" />
<receiver
android:name=".receivers.EdServiceReceiver"
android:exported="true"

View File

@ -15,7 +15,6 @@ import java.io.StringWriter;
import io.github.lsposed.manager.ui.activity.CrashReportActivity;
import io.github.lsposed.manager.util.CompileUtil;
import io.github.lsposed.manager.util.NotificationUtil;
import io.github.lsposed.manager.util.RebootUtil;
import rikka.shizuku.Shizuku;
import rikka.sui.Sui;
@ -36,15 +35,10 @@ public class App extends Application {
}
private void onRequestPermissionsResult(int requestCode, int grantResult) {
if (requestCode < 10) {
RebootUtil.onRequestPermissionsResult(requestCode, grantResult);
} else {
CompileUtil.onRequestPermissionsResult(requestCode - 10, grantResult);
}
CompileUtil.onRequestPermissionsResult(requestCode, grantResult);
}
public static int checkPermission(int code, int from) {
int requestCode = code + from * 10;
public static int checkPermission(int code) {
try {
if (!Shizuku.isPreV11() && Shizuku.getVersion() >= 11) {
if (Shizuku.checkSelfPermission() == PERMISSION_GRANTED) {
@ -52,7 +46,7 @@ public class App extends Application {
} else if (Shizuku.shouldShowRequestPermissionRationale()) {
return -1;
} else {
Shizuku.requestPermission(requestCode);
Shizuku.requestPermission(code);
return -1;
}
}

View File

@ -243,10 +243,6 @@ public class ScopeAdapter extends RecyclerView.Adapter<ScopeAdapter.ViewHolder>
if (launchIntent != null) {
activity.startActivity(launchIntent);
}
} else if (itemId == R.id.app_menu_compile_speed) {
CompileUtil.compileSpeed(activity, activity.getSupportFragmentManager(), info);
} else if (itemId == R.id.app_menu_compile_dexopt) {
CompileUtil.compileDexopt(activity, activity.getSupportFragmentManager(), info);
} else if (itemId == R.id.app_menu_compile_reset) {
CompileUtil.reset(activity, activity.getSupportFragmentManager(), info);
} else if (itemId == R.id.app_menu_store) {
@ -352,8 +348,6 @@ public class ScopeAdapter extends RecyclerView.Adapter<ScopeAdapter.ViewHolder>
menu.removeItem(R.id.app_menu_launch);
}
if (android) {
menu.removeItem(R.id.app_menu_compile_speed);
menu.removeItem(R.id.app_menu_compile_dexopt);
menu.removeItem(R.id.app_menu_compile_reset);
menu.removeItem(R.id.app_menu_store);
}

View File

@ -8,10 +8,8 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Build;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StyleRes;
import androidx.appcompat.app.AppCompatActivity;
@ -28,10 +26,8 @@ import java.util.Objects;
import io.github.lsposed.manager.App;
import io.github.lsposed.manager.R;
import io.github.lsposed.manager.util.CompileUtil;
import io.github.lsposed.manager.util.CustomThemeColor;
import io.github.lsposed.manager.util.CustomThemeColors;
import io.github.lsposed.manager.util.RebootUtil;
public class BaseActivity extends AppCompatActivity {
@ -172,28 +168,4 @@ public class BaseActivity extends AppCompatActivity {
.setNegativeButton(android.R.string.cancel, null)
.show();
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.dexopt_all) {
CompileUtil.compileAllDexopt(this);
} else if (itemId == R.id.speed_all) {
CompileUtil.compileAllSpeed(this);
} else if (itemId == R.id.reboot) {
areYouSure(R.string.reboot, (dialog, which) -> RebootUtil.reboot(RebootUtil.RebootType.NORMAL));
} else if (itemId == R.id.soft_reboot) {
areYouSure(R.string.soft_reboot, (dialog, which) -> RebootUtil.reboot(RebootUtil.RebootType.USERSPACE));
} else if (itemId == R.id.reboot_recovery) {
areYouSure(R.string.reboot_recovery, (dialog, which) -> RebootUtil.reboot(RebootUtil.RebootType.RECOVERY));
} else if (itemId == R.id.reboot_bootloader) {
areYouSure(R.string.reboot_bootloader, (dialog, which) -> RebootUtil.reboot(RebootUtil.RebootType.BOOTLOADER));
} else if (itemId == R.id.reboot_download) {
areYouSure(R.string.reboot_download, (dialog, which) -> RebootUtil.reboot(RebootUtil.RebootType.DOWNLOAD));
} else if (itemId == R.id.reboot_edl) {
areYouSure(R.string.reboot_edl, (dialog, which) -> RebootUtil.reboot(RebootUtil.RebootType.EDL));
}
return super.onOptionsItemSelected(item);
}
}

View File

@ -4,8 +4,6 @@ import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.widget.PopupMenu;
import androidx.appcompat.widget.TooltipCompat;
import androidx.core.content.ContextCompat;
import com.bumptech.glide.Glide;
@ -60,12 +58,6 @@ public class MainActivity extends BaseActivity {
intent.setClass(getApplicationContext(), AboutActivity.class);
startActivity(intent);
});
TooltipCompat.setTooltipText(binding.menuMore, getString(androidx.appcompat.R.string.abc_action_menu_overflow_description));
PopupMenu appMenu = new PopupMenu(MainActivity.this, binding.menuMore);
appMenu.inflate(R.menu.menu_installer);
appMenu.setOnMenuItemClickListener(this::onOptionsItemSelected);
binding.menuMore.setOnTouchListener(appMenu.getDragToOpenListener());
binding.menuMore.setOnClickListener(v -> appMenu.show());
Glide.with(binding.appIcon)
.load(GlideHelper.wrapApplicationInfoForIconLoader(getApplicationInfo()))
.into(binding.appIcon);

View File

@ -67,7 +67,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
}
}
}
Comparator<PackageInfo> cmp = AppHelper.getAppListComparator(preferences.getInt("list_sort", 0), pm);
Comparator<PackageInfo> cmp = AppHelper.getAppListComparator(0, pm);
fullList.sort((a, b) -> {
boolean aChecked = moduleUtil.isModuleEnabled(a.packageName);
boolean bChecked = moduleUtil.isModuleEnabled(b.packageName);
@ -160,15 +160,6 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (AppHelper.onOptionsItemSelected(item, preferences)) {
moduleUtil.updateModulesList(false, null);
reloadModules.run();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onDestroy() {
super.onDestroy();

View File

@ -36,8 +36,6 @@ public class CompileDialogFragment extends AppCompatDialogFragment {
// TODO:
private static final String COMPILE_COMMAND_PREFIX = "cmd package ";
private static final String COMPILE_RESET_COMMAND = COMPILE_COMMAND_PREFIX + "compile --reset ";
private static final String COMPILE_SPEED_COMMAND = COMPILE_COMMAND_PREFIX + "compile -f -m speed ";
private static final String COMPILE_DEXOPT_COMMAND = COMPILE_COMMAND_PREFIX + "force-dex-opt ";
private static final String KEY_APP_INFO = "app_info";
private static final String KEY_MSG = "msg";
@ -91,18 +89,10 @@ public class CompileDialogFragment extends AppCompatDialogFragment {
AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
try {
boolean checkProfiles = ShizukuSystemProperties.getBoolean("dalvik.vm.usejitprofiles", false);
switch (mode) {
case RESET:
CompileUtil.PACKAGE_MANAGER.get().clearApplicationProfileData(appInfo.packageName);
String filter = ShizukuSystemProperties.get("pm.dexopt.install");
CompileUtil.PACKAGE_MANAGER.get().performDexOptMode(appInfo.packageName, checkProfiles, filter, true, true, null);
break;
case SPEED:
CompileUtil.PACKAGE_MANAGER.get().performDexOptMode(appInfo.packageName, checkProfiles, "speed", true, true, null);
break;
case DEXOPT:
CompileUtil.PACKAGE_MANAGER.get().forceDexOpt(appInfo.packageName);
break;
if (mode == CompileUtil.CompileType.RESET) {
CompileUtil.PACKAGE_MANAGER.get().clearApplicationProfileData(appInfo.packageName);
String filter = ShizukuSystemProperties.get("pm.dexopt.install");
CompileUtil.PACKAGE_MANAGER.get().performDexOptMode(appInfo.packageName, checkProfiles, filter, true, true, null);
}
App.runOnUiThread(() -> {
ToastUtil.showLongToast(App.getInstance(), R.string.done);
@ -129,7 +119,7 @@ public class CompileDialogFragment extends AppCompatDialogFragment {
if (arguments != null) {
int type = arguments.getInt(KEY_TYPE);
appInfo = arguments.getParcelable(KEY_APP_INFO);
int result = App.checkPermission(type, 1);
int result = App.checkPermission(type);
switch (result) {
case 0:
onRequestPermissionsResult(type, PERMISSION_GRANTED);
@ -151,10 +141,6 @@ public class CompileDialogFragment extends AppCompatDialogFragment {
String command = null;
if (type == CompileUtil.CompileType.RESET) {
command = COMPILE_RESET_COMMAND + appInfo.packageName;
} else if (type == CompileUtil.CompileType.DEXOPT) {
command = COMPILE_DEXOPT_COMMAND + appInfo.packageName;
} else if (type == CompileUtil.CompileType.SPEED) {
command = COMPILE_SPEED_COMMAND + appInfo.packageName;
}
if (command != null) {
new CompileTask(this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, command);

View File

@ -1,41 +1,21 @@
package io.github.lsposed.manager.util;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.os.AsyncTask;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.topjohnwu.superuser.Shell;
import java.util.List;
import io.github.lsposed.manager.App;
import io.github.lsposed.manager.R;
import io.github.lsposed.manager.ui.fragment.CompileDialogFragment;
import rikka.shizuku.ShizukuBinderWrapper;
import rikka.shizuku.ShizukuSystemProperties;
import rikka.shizuku.SystemServiceHelper;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
@SuppressWarnings("deprecation")
public class CompileUtil {
// TODO:
public enum CompileType {
RESET,
SPEED,
DEXOPT,
SPEED_ALL,
DEXOPT_ALL;
RESET;
@Override
public String toString() {
@ -54,53 +34,8 @@ public class CompileUtil {
}
};
@SuppressLint("StaticFieldLeak")
private static Activity sActivity;
public static void onRequestPermissionsResult(int requestCode, int grantResult) {
CompileUtil.CompileType mode = CompileUtil.CompileType.values()[requestCode];
if (mode == CompileType.DEXOPT_ALL || mode == CompileType.SPEED_ALL) {
AlertDialog dialog = new MaterialAlertDialogBuilder(sActivity)
.setTitle(R.string.speed_now)
.setMessage(R.string.this_may_take_a_while)
.setCancelable(false)
.show();
AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
if (grantResult == PERMISSION_GRANTED) {
try {
IPackageManager packageManager = PACKAGE_MANAGER.get();
if (mode == CompileType.DEXOPT_ALL) {
packageManager.runBackgroundDexoptJob(null);
} else {
boolean checkProfiles = ShizukuSystemProperties.getBoolean("dalvik.vm.usejitprofiles", false);
List<String> list = packageManager.getAllPackages();
for (String packageName : list) {
CompileUtil.PACKAGE_MANAGER.get().performDexOptMode(packageName, checkProfiles, "speed", true, true, null);
}
}
dialog.dismiss();
App.runOnUiThread(() -> Toast.makeText(sActivity, R.string.done, Toast.LENGTH_LONG).show());
return;
} catch (Exception e) {
e.printStackTrace();
}
}
if (!Shell.rootAccess()) {
dialog.dismiss();
App.runOnUiThread(() -> Toast.makeText(sActivity, R.string.root_failed, Toast.LENGTH_LONG).show());
return;
}
if (mode == CompileType.SPEED_ALL) {
Shell.su("cmd package compile -m speed -a").exec();
} else {
Shell.su("cmd package bg-dexopt-job").exec();
}
dialog.dismiss();
App.runOnUiThread(() -> Toast.makeText(sActivity, R.string.done, Toast.LENGTH_LONG).show());
});
} else if (instance != null) {
if (instance != null) {
instance.onRequestPermissionsResult(requestCode, grantResult);
}
}
@ -108,52 +43,12 @@ public class CompileUtil {
public static void reset(Context context, FragmentManager fragmentManager,
ApplicationInfo info) {
compilePackageInBg(fragmentManager, info,
context.getString(R.string.compile_reset_msg), CompileType.RESET);
}
public static void compileSpeed(Context context, FragmentManager fragmentManager,
ApplicationInfo info) {
compilePackageInBg(fragmentManager, info,
context.getString(R.string.compile_speed_msg), CompileType.SPEED);
}
public static void compileDexopt(Context context, FragmentManager fragmentManager,
ApplicationInfo info) {
compilePackageInBg(fragmentManager, info,
context.getString(R.string.compile_speed_msg), CompileType.DEXOPT);
}
public static void compileAllDexopt(Activity activity) {
sActivity = activity;
int type = CompileType.DEXOPT_ALL.ordinal();
int result = App.checkPermission(type, 1);
switch (result) {
case 0:
onRequestPermissionsResult(type, PERMISSION_GRANTED);
break;
case -2:
onRequestPermissionsResult(type, PERMISSION_DENIED);
break;
}
}
public static void compileAllSpeed(Activity activity) {
sActivity = activity;
int type = CompileType.SPEED_ALL.ordinal();
int result = App.checkPermission(type, 1);
switch (result) {
case 0:
onRequestPermissionsResult(type, PERMISSION_GRANTED);
break;
case -2:
onRequestPermissionsResult(type, PERMISSION_DENIED);
break;
}
context.getString(R.string.compile_reset_msg));
}
private static void compilePackageInBg(FragmentManager fragmentManager,
ApplicationInfo info, String msg, CompileType type) {
instance = CompileDialogFragment.newInstance(info, msg, type);
ApplicationInfo info, String msg) {
instance = CompileDialogFragment.newInstance(info, msg, CompileType.RESET);
instance.show(fragmentManager, TAG_COMPILE_DIALOG);
}

View File

@ -3,21 +3,16 @@ package io.github.lsposed.manager.util;
import android.annotation.SuppressLint;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import androidx.core.app.NotificationChannelCompat;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;
import com.topjohnwu.superuser.Shell;
import io.github.lsposed.manager.App;
import io.github.lsposed.manager.R;
import io.github.lsposed.manager.ui.activity.MainActivity;
import io.github.lsposed.manager.ui.activity.ModulesActivity;
@SuppressLint("UnspecifiedImmutableFlag")
@ -27,9 +22,6 @@ public final class NotificationUtil {
private static final int NOTIFICATION_MODULES_UPDATED = 1;
private static final int PENDING_INTENT_OPEN_MODULES = 0;
private static final int PENDING_INTENT_OPEN_INSTALL = 1;
private static final int PENDING_INTENT_SOFT_REBOOT = 2;
private static final int PENDING_INTENT_REBOOT = 3;
private static final String NOTIFICATION_MODULES_CHANNEL = "modules_channel_2";
@SuppressLint("StaticFieldLeak")
@ -53,14 +45,6 @@ public final class NotificationUtil {
notificationManager.createNotificationChannel(channel.build());
}
public static void cancel(String tag, int id) {
notificationManager.cancel(tag, id);
}
public static void cancelAll() {
notificationManager.cancelAll();
}
public static void showNotActivatedNotification(String packageName, String appName) {
Intent intent = new Intent(context, ModulesActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@ -80,7 +64,7 @@ public final class NotificationUtil {
}
public static void showModulesUpdatedNotification(String appName) {
Intent intent = new Intent(context, MainActivity.class)
Intent intent = new Intent(context, ModulesActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pInstallTab = PendingIntent.getActivity(context, PENDING_INTENT_OPEN_INSTALL, intent, PendingIntent.FLAG_UPDATE_CURRENT);
@ -90,18 +74,6 @@ public final class NotificationUtil {
NotificationCompat.Builder builder = getNotificationBuilder(title, appName)
.setContentIntent(pInstallTab);
Intent iSoftReboot = new Intent(context, RebootReceiver.class);
iSoftReboot.putExtra(RebootReceiver.EXTRA_SOFT_REBOOT, true);
PendingIntent pSoftReboot = PendingIntent.getBroadcast(context, PENDING_INTENT_SOFT_REBOOT,
iSoftReboot, PendingIntent.FLAG_UPDATE_CURRENT);
Intent iReboot = new Intent(context, RebootReceiver.class);
PendingIntent pReboot = PendingIntent.getBroadcast(context, PENDING_INTENT_REBOOT,
iReboot, PendingIntent.FLAG_UPDATE_CURRENT);
builder.addAction(new NotificationCompat.Action.Builder(0, context.getString(R.string.reboot), pReboot).build());
builder.addAction(new NotificationCompat.Action.Builder(0, context.getString(R.string.soft_reboot), pSoftReboot).build());
notificationManager.notify(null, NOTIFICATION_MODULES_UPDATED, builder.build());
}
@ -115,29 +87,4 @@ public final class NotificationUtil {
.setSmallIcon(R.drawable.ic_notification)
.setColor(ContextCompat.getColor(context, R.color.colorPrimary));
}
public static class RebootReceiver extends BroadcastReceiver {
public static String EXTRA_SOFT_REBOOT = "soft";
@Override
public void onReceive(Context context, Intent intent) {
/*
* Close the notification bar in order to see the toast that module
* was enabled successfully. Furthermore, if SU permissions haven't
* been granted yet, the SU dialog will be prompted behind the
* expanded notification panel and is therefore not visible to the
* user.
*/
context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
cancelAll();
if (!Shell.rootAccess()) {
Log.e(App.TAG, "NotificationUtil -> Could not start root shell");
return;
}
boolean softReboot = intent.getBooleanExtra(EXTRA_SOFT_REBOOT, false);
RebootUtil.reboot(softReboot ? RebootUtil.RebootType.USERSPACE : RebootUtil.RebootType.NORMAL);
}
}
}

View File

@ -1,98 +0,0 @@
package io.github.lsposed.manager.util;
import android.content.Context;
import android.os.Build;
import android.os.IPowerManager;
import android.os.PowerManager;
import android.os.RemoteException;
import com.topjohnwu.superuser.Shell;
import io.github.lsposed.manager.App;
import io.github.lsposed.manager.BuildConfig;
import rikka.shizuku.ShizukuBinderWrapper;
import rikka.shizuku.ShizukuSystemProperties;
import rikka.shizuku.SystemServiceHelper;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
public class RebootUtil {
public enum RebootType {
NORMAL,
USERSPACE,
RECOVERY,
BOOTLOADER,
DOWNLOAD,
EDL;
@Override
public String toString() {
return super.toString().toLowerCase();
}
}
public static void onRequestPermissionsResult(int requestCode, int grantResult) {
RebootType mode = RebootType.values()[requestCode];
if (grantResult == PERMISSION_GRANTED) {
try {
if (mode == RebootType.USERSPACE && !supportUserspaceReboot()) {
ShizukuSystemProperties.set("ctl.restart", "surfaceflinger");
} else {
POWER_MANAGER.get().reboot(BuildConfig.DEBUG, mode.toString(), false);
}
} catch (RemoteException e) {
e.printStackTrace();
rebootWithShell(mode);
}
} else {
rebootWithShell(mode);
}
}
private static final Singleton<IPowerManager> POWER_MANAGER = new Singleton<IPowerManager>() {
@Override
protected IPowerManager create() {
return IPowerManager.Stub.asInterface(new ShizukuBinderWrapper(SystemServiceHelper.getSystemService(Context.POWER_SERVICE)));
}
};
public static void reboot(RebootType mode) {
int result = App.checkPermission(mode.ordinal(), 0);
switch (result) {
case 0:
onRequestPermissionsResult(mode.ordinal(), PERMISSION_GRANTED);
break;
case -2:
onRequestPermissionsResult(mode.ordinal(), PERMISSION_DENIED);
break;
}
}
private static void rebootWithShell(RebootType mode) {
if (!Shell.rootAccess()) {
return;
}
String command;
if (mode == RebootType.USERSPACE) {
if (supportUserspaceReboot()) {
command = "/system/bin/svc power reboot userspace";
} else {
command = "setprop ctl.restart surfaceflinger";
}
} else if (mode == RebootType.NORMAL) {
command = "/system/bin/svc power reboot";
} else if (mode == RebootType.RECOVERY) {
Shell.su("touch /cache/recovery/boot").exec();
command = "/system/bin/svc power recovery";
} else {
command = "/system/bin/svc power reboot " + mode.toString();
}
Shell.su(command).exec();
}
private static boolean supportUserspaceReboot() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && ((PowerManager) App.getInstance().getSystemService(Context.POWER_SERVICE)).isRebootingUserspaceSupported();
}
}

View File

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
</vector>

View File

@ -46,20 +46,6 @@
android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:textSize="20sp"
tools:ignore="RelativeOverlap" />
<ImageView
android:id="@+id/menu_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:background="?selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/abc_action_menu_overflow_description"
android:focusable="true"
android:padding="2dp"
app:srcCompat="@drawable/ic_more"
tools:ignore="PrivateResource" />
</RelativeLayout>
<com.google.android.material.card.MaterialCardView

View File

@ -3,12 +3,6 @@
<item
android:id="@+id/app_menu_launch"
android:title="@string/app_launch" />
<item
android:id="@+id/app_menu_compile_speed"
android:title="@string/menu_title_compile_speed" />
<item
android:id="@+id/app_menu_compile_dexopt"
android:title="@string/menu_title_compile_dexopt" />
<item
android:id="@+id/app_menu_compile_reset"
android:title="@string/menu_title_compile_reset" />

View File

@ -76,59 +76,4 @@
</group>
</menu>
</item>
<item
android:id="@+id/menu_optimize"
android:title="@string/menu_optimize"
app:showAsAction="never">
<menu>
<group>
<item
android:id="@+id/dexopt_all"
android:title="@string/dexopt_now"
app:showAsAction="never" />
<item
android:id="@+id/speed_all"
android:title="@string/speed_now"
app:showAsAction="never" />
</group>
</menu>
</item>
<item
android:title="@string/menu_reboot"
app:showAsAction="never">
<menu>
<item
android:id="@+id/soft_reboot"
android:title="@string/soft_reboot"
app:showAsAction="never" />
<item
android:id="@+id/reboot"
android:title="@string/reboot_system"
app:showAsAction="never" />
<item
android:id="@+id/reboot_recovery"
android:title="@string/reboot_recovery"
app:showAsAction="never" />
<item
android:id="@+id/reboot_bootloader"
android:title="@string/reboot_bootloader"
app:showAsAction="never" />
<item
android:id="@+id/reboot_download"
android:title="@string/reboot_download"
app:showAsAction="never" />
<item
android:id="@+id/reboot_edl"
android:title="@string/reboot_edl"
app:showAsAction="never" />
</menu>
</item>
</menu>

View File

@ -1,61 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_optimize"
android:title="@string/menu_optimize"
app:showAsAction="never">
<menu>
<group>
<item
android:id="@+id/dexopt_all"
android:title="@string/dexopt_now"
app:showAsAction="never" />
<item
android:id="@+id/speed_all"
android:title="@string/speed_now"
app:showAsAction="never" />
</group>
</menu>
</item>
<item
android:title="@string/menu_reboot"
app:showAsAction="never">
<menu>
<item
android:id="@+id/soft_reboot"
android:title="@string/soft_reboot"
app:showAsAction="never" />
<item
android:id="@+id/reboot"
android:title="@string/reboot_system"
app:showAsAction="never" />
<item
android:id="@+id/reboot_recovery"
android:title="@string/reboot_recovery"
app:showAsAction="never" />
<item
android:id="@+id/reboot_bootloader"
android:title="@string/reboot_bootloader"
app:showAsAction="never" />
<item
android:id="@+id/reboot_download"
android:title="@string/reboot_download"
app:showAsAction="never" />
<item
android:id="@+id/reboot_edl"
android:title="@string/reboot_edl"
app:showAsAction="never" />
</menu>
</item>
</menu>

View File

@ -7,82 +7,4 @@
android:title="@string/menuSearch"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom" />
<item
android:id="@+id/item_list_sort"
android:title="@string/menu_sort"
app:showAsAction="never">
<menu>
<group android:checkableBehavior="single">
<item
android:id="@+id/item_sort_by_name"
android:checked="true"
android:title="@string/sort_by_name" />
<item
android:id="@+id/item_sort_by_name_reverse"
android:title="@string/sort_by_name_reverse" />
<item
android:id="@+id/item_sort_by_package_name"
android:title="@string/sort_by_package_name" />
<item
android:id="@+id/item_sort_by_package_name_reverse"
android:title="@string/sort_by_package_name_reverse" />
<item
android:id="@+id/item_sort_by_install_time"
android:title="@string/sort_by_install_time" />
<item
android:id="@+id/item_sort_by_install_time_reverse"
android:title="@string/sort_by_install_time_reverse" />
<item
android:id="@+id/item_sort_by_update_time"
android:title="@string/sort_by_update_time" />
<item
android:id="@+id/item_sort_by_update_time_reverse"
android:title="@string/sort_by_update_time_reverse" />
</group>
</menu>
</item>
<item
android:title="@string/menu_reboot"
app:showAsAction="never">
<menu>
<item
android:id="@+id/soft_reboot"
android:title="@string/soft_reboot"
app:showAsAction="never" />
<item
android:id="@+id/reboot"
android:title="@string/reboot_system"
app:showAsAction="never" />
<item
android:id="@+id/reboot_recovery"
android:title="@string/reboot_recovery"
app:showAsAction="never" />
<item
android:id="@+id/reboot_bootloader"
android:title="@string/reboot_bootloader"
app:showAsAction="never" />
<item
android:id="@+id/reboot_download"
android:title="@string/reboot_download"
app:showAsAction="never" />
<item
android:id="@+id/reboot_edl"
android:title="@string/reboot_edl"
app:showAsAction="never" />
</menu>
</item>
</menu>

View File

@ -21,14 +21,11 @@
<string name="nav_item_logs_err">模块日志</string>
<!-- Installer tab -->
<string name="soft_reboot">软重启</string>
<string name="reboot">重启</string>
<string name="areyousure">您确定?</string>
<string name="install_warning_title">请小心!</string>
<string name="dont_show_again">不再提示</string>
<!-- File operations -->
<string name="root_failed">无法获取 root 权限\n\n请确认您的设备已正确 root 且没有阻止 shell 命令</string>
<!-- Modules tab -->
<string name="module_is_not_activated_yet">LSPosed 模块尚未激活</string>
@ -74,20 +71,11 @@
<!-- RepoLoader -->
<string name="warning_installed_on_external_storage">此模块因被安装在 SD 卡中而导致无法加载, 请将其移动到内部存储</string>
<string name="export_">导出…</string>
<string name="export_enabled_modules">导出已启用模块列表</string>
<string name="export_installed_modules">导出已安装模块列表</string>
<string name="no_installed_modules">没有任何已安装的模块</string>
<string name="no_enabled_modules">没有任何已启用的模块</string>
<string name="info">信息</string>
<string name="not_installed_no_lollipop">LSPosed 框架未安装</string>
<string name="scroll_top">滚动到顶部</string>
<string name="reboot_recovery">重启至恢复模式</string>
<string name="reboot_bootloader">重启至引导加载器</string>
<string name="reboot_download">重启至下载模式</string>
<string name="reboot_edl">重启至救援模式</string>
<string name="loading">正在加载…</string>
<string name="scroll_bottom">滚动到底部</string>
<string name="skip_xposedminversion_check">关闭状态检查</string>
@ -96,8 +84,6 @@
<!-- LSPd related -->
<string name="menu_title_compile_reset">取消优化</string>
<string name="menu_title_compile_speed">以 Speed 模式优化应用</string>
<string name="menu_title_compile_dexopt">以 Dexopt 模式优化应用</string>
<string name="compile_reset_msg">清除中…</string>
<string name="compile_speed_msg">优化中…</string>
<string name="notinstalled">LSPosed 框架未安装</string>
@ -105,9 +91,6 @@
<string name="verified_boot_deactivated">引导验证已禁用</string>
<string name="verified_boot_none">无法获取引导验证状态</string>
<string name="done">完成!</string>
<string name="dexopt_now">以 Dexopt 模式优化全部应用</string>
<string name="speed_now">以 Speed 模式优化全部应用</string>
<string name="this_may_take_a_while">请稍后, 这将需要一段时间…</string>
<string name="pref_title_disable_verbose_log">禁用详细日志</string>
<string name="logs_cannot_read">无法读取日志: \n</string>
@ -115,7 +98,6 @@
<string name="compile_failed">优化失败或返回值为空</string>
<string name="compile_failed_with_info">优化失败: </string>
<string name="not_installed">未安装</string>
<string name="reboot_system">重启至系统</string>
<string name="pref_title_disable_modules_log">禁用模块日志</string>
<string name="pref_disable_modules_log_summary">模块抛出的的异常堆栈仍将正常抓取</string>
<string name="follow_system">跟随系统</string>
@ -139,9 +121,7 @@
<string name="settings_enable_resources">启用资源钩子</string>
<string name="settings_enable_resources_summary"><b>警告: </b> 资源钩子已被弃用</string>
<string name="settings_variant">变体</string>
<string name="menu_optimize">优化…</string>
<string name="menu_show_system_apps">系统应用</string>
<string name="menu_reboot">重启…</string>
<string name="menu_sort">排序…</string>
<string name="enable_module">启用模块</string>
<string name="no_scope_selected">未选择任何应用。继续?</string>

View File

@ -21,14 +21,11 @@
<string name="nav_item_logs_err">模塊日誌</string>
<!-- Installer tab -->
<string name="soft_reboot">軟重啟</string>
<string name="reboot">重啟</string>
<string name="areyousure">您確定?</string>
<string name="install_warning_title">請小心!</string>
<string name="dont_show_again">不再提示</string>
<!-- File operations -->
<string name="root_failed">無法獲取 root 權限\n\n請確認您的設備已正確 root 且沒有阻止 shell 命令</string>
<!-- Modules tab -->
<string name="module_is_not_activated_yet">LSPosed 模塊尚未激活</string>
@ -73,20 +70,11 @@
<!-- RepoLoader -->
<string name="warning_installed_on_external_storage">此模塊因被安裝在 SD 卡中而導致無法加載, 請將其移動到內部存儲</string>
<string name="export_">導出…</string>
<string name="export_enabled_modules">導出已啟用模塊列表</string>
<string name="export_installed_modules">導出已安裝模塊列表</string>
<string name="no_installed_modules">沒有任何已安裝的模塊</string>
<string name="no_enabled_modules">沒有任何已啟用的模塊</string>
<string name="info">信息</string>
<string name="not_installed_no_lollipop">LSPosed 框架未安裝</string>
<string name="scroll_top">滾動到頂部</string>
<string name="reboot_recovery">重啟至恢復模式</string>
<string name="reboot_bootloader">重啟至引導加載器</string>
<string name="reboot_download">重啟至下載模式</string>
<string name="reboot_edl">重啟至救援模式</string>
<string name="loading">正在加載…</string>
<string name="scroll_bottom">滾動到底部</string>
<string name="skip_xposedminversion_check">關閉狀態檢查</string>
@ -95,8 +83,6 @@
<!-- LSPd related -->
<string name="menu_title_compile_reset">取消優化</string>
<string name="menu_title_compile_speed">以 Speed 模式優化應用</string>
<string name="menu_title_compile_dexopt">以 Dexopt 模式優化應用</string>
<string name="compile_reset_msg">清除中…</string>
<string name="compile_speed_msg">優化中…</string>
<string name="notinstalled">LSPosed 框架未安裝</string>
@ -104,16 +90,12 @@
<string name="verified_boot_deactivated">引導驗證已禁用</string>
<string name="verified_boot_none">無法獲取引導驗證狀態</string>
<string name="done">完成!</string>
<string name="dexopt_now">以 Dexopt 模式優化全部應用</string>
<string name="speed_now">以 Speed 模式優化全部應用</string>
<string name="this_may_take_a_while">請稍後, 這將需要一段時間…</string>
<string name="pref_title_disable_verbose_log">禁用詳細日誌</string>
<string name="logs_cannot_read">無法讀取日誌: \n</string>
<string name="app_launch">運行</string>
<string name="compile_failed">優化失敗或返回值為空</string>
<string name="not_installed">未安裝</string>
<string name="reboot_system">重啟至系統</string>
<string name="pref_title_disable_modules_log">禁用模塊日誌</string>
<string name="pref_disable_modules_log_summary">模塊拋出的的異常堆棧仍將正常抓取</string>
<string name="follow_system">跟隨系統</string>

View File

@ -21,14 +21,11 @@
<string name="nav_item_logs_err">模組日誌</string>
<!-- Installer tab -->
<string name="soft_reboot">軟重啟</string>
<string name="reboot">重啟</string>
<string name="areyousure">您確定?</string>
<string name="install_warning_title">請小心!</string>
<string name="dont_show_again">不再提示</string>
<!-- File operations -->
<string name="root_failed">無法獲取 root 許可權\n\n請確認您的裝置已正確 root 且沒有阻止 shell 命令</string>
<!-- Modules tab -->
<string name="module_is_not_activated_yet">LSPosed 模組尚未啟用</string>
@ -73,20 +70,11 @@
<!-- RepoLoader -->
<string name="warning_installed_on_external_storage">此模組因被安裝在 SD 卡中而導致無法載入, 請將其移動到內部儲存</string>
<string name="export_">匯出…</string>
<string name="export_enabled_modules">匯出已啟用模組列表</string>
<string name="export_installed_modules">匯出已安裝模組列表</string>
<string name="no_installed_modules">沒有任何已安裝的模組</string>
<string name="no_enabled_modules">沒有任何已啟用的模組</string>
<string name="info">資訊</string>
<string name="not_installed_no_lollipop">LSPosed 框架未安裝</string>
<string name="scroll_top">滾動到頂部</string>
<string name="reboot_recovery">重啟至恢復模式</string>
<string name="reboot_bootloader">重啟至引導載入器</string>
<string name="reboot_download">重啟至下載模式</string>
<string name="reboot_edl">重啟至救援模式</string>
<string name="loading">正在載入…</string>
<string name="scroll_bottom">滾動到底部</string>
<string name="skip_xposedminversion_check">關閉狀態檢查</string>
@ -95,8 +83,6 @@
<!-- LSPd related -->
<string name="menu_title_compile_reset">取消優化</string>
<string name="menu_title_compile_speed">以 Speed 模式優化 App</string>
<string name="menu_title_compile_dexopt">以 Dexopt 模式優化 App</string>
<string name="compile_reset_msg">清除中…</string>
<string name="compile_speed_msg">優化中…</string>
<string name="notinstalled">LSPosed 框架未安裝</string>
@ -104,16 +90,12 @@
<string name="verified_boot_deactivated">引導驗證已禁用</string>
<string name="verified_boot_none">無法獲取引導驗證狀態</string>
<string name="done">完成!</string>
<string name="dexopt_now">以 Dexopt 模式優化全部 App</string>
<string name="speed_now">以 Speed 模式優化全部 App</string>
<string name="this_may_take_a_while">請稍後, 這將需要一段時間…</string>
<string name="pref_title_disable_verbose_log">禁用詳細日誌</string>
<string name="logs_cannot_read">無法讀取日誌: \n</string>
<string name="app_launch">執行</string>
<string name="compile_failed">優化失敗或返回值為空</string>
<string name="not_installed">未安裝</string>
<string name="reboot_system">重啟至系統</string>
<string name="pref_title_disable_modules_log">禁用模組日誌</string>
<string name="pref_disable_modules_log_summary">模組丟擲的的異常堆疊仍將正常抓取</string>
<string name="follow_system">跟隨系統</string>

View File

@ -22,14 +22,11 @@
<string name="nav_item_logs_err">Modules Logs</string>
<!-- Installer tab -->
<string name="soft_reboot">Soft reboot</string>
<string name="reboot">Reboot</string>
<string name="areyousure">Are you sure?</string>
<string name="install_warning_title">Be careful!</string>
<string name="dont_show_again">Don\'t show this again</string>
<!-- File operations -->
<string name="root_failed">Failed to get root access\n\nMake sure your device is rooted properly and you have not blocked shell commands</string>
<!-- Modules tab -->
<string name="module_is_not_activated_yet">LSPosed module is not activated yet</string>
@ -77,20 +74,11 @@
<!-- RepoLoader -->
<string name="warning_installed_on_external_storage">This module cannot be loaded because it\'s installed on the SD card, please move it to internal storage</string>
<string name="export_">Export…</string>
<string name="export_enabled_modules">Export enabled modules list</string>
<string name="export_installed_modules">Export installed modules list</string>
<string name="no_installed_modules">There are no installed modules!</string>
<string name="no_enabled_modules">There are no modules enabled</string>
<string name="info">Info</string>
<string name="not_installed_no_lollipop">LSPosed Framework is not installed</string>
<string name="scroll_top">Scroll to top</string>
<string name="reboot_recovery">Reboot to Recovery</string>
<string name="reboot_bootloader">Reboot to Bootloader</string>
<string name="reboot_download">Reboot to Download</string>
<string name="reboot_edl">Reboot to Emergency</string>
<string name="loading">Loading…</string>
<string name="scroll_bottom">Scroll to bottom</string>
<string name="skip_xposedminversion_check">Skip status check</string>
@ -99,9 +87,6 @@
<string name="android_sdk" translatable="false">Android %2$s (%1$s, API %3$d)</string>
<string name="not_logcat">This is the LSPosed Framework and modules log\nif you need a Android logcat, you can try our Log Catcher Magisk module</string>
<string name="dexopt_now">Optimize all apps with Dexopt</string>
<string name="speed_now">Optimize all apps with Speed mode</string>
<string name="this_may_take_a_while">Please wait, this may take a while…</string>
<string name="done">Done!</string>
<string name="verified_boot_deactivated">Verified Boot is deactivated</string>
<string name="verified_boot_none">Could not detect Verified Boot state</string>
@ -109,8 +94,6 @@
<!-- LSPd related -->
<string name="menu_title_compile_reset">De-optimize</string>
<string name="menu_title_compile_speed">Optimize with Speed mode</string>
<string name="menu_title_compile_dexopt">Optimize with Dexopt mode</string>
<string name="compile_reset_msg">Resetting …</string>
<string name="compile_speed_msg">Optimizing …</string>
@ -125,7 +108,6 @@
<string name="compile_failed">Optimization failed or return value is empty</string>
<string name="compile_failed_with_info">Optimization failed: </string>
<string name="not_installed">Not installed</string>
<string name="reboot_system">Reboot to System</string>
<string name="pref_title_disable_modules_log">Disable modules logs</string>
<string name="pref_disable_modules_log_summary">Exception stack thrown by the module will still be catched normally</string>
<string name="pure_black_dark_theme">Use the pure black dark theme</string>
@ -146,9 +128,7 @@
<string name="settings_group_theme">Theme</string>
<string name="material_design_2">Material Design 2</string>
<string name="settings_variant">Variant</string>
<string name="menu_optimize">Optimize…</string>
<string name="menu_show_system_apps">System apps</string>
<string name="menu_reboot">Reboot…</string>
<string name="menu_sort">Sorting…</string>
<string name="enable_module">Enable module</string>
<string name="no_scope_selected">You did not select any app. Continue?</string>