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 {
- Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
- v.setPadding(systemBars.left, systemBars.top, systemBars.right, 0);
- return insets;
- });
-
if (prefsApp.getString("checker_arch", "NULL").equals("NULL") || prefsApp.getString("checker_type", "NULL").equals("NULL")) {
Intent intent = new Intent(MainActivity.this, SetupActivity.class);
startActivity(intent);
finish();
} else {
+
+ EdgeToEdge.enable(this);
+
+ setContentView(R.layout.activity_main);
+
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, 0);
+ return insets;
+ });
+
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
new MaterialAlertDialogBuilder(this)
@@ -101,43 +99,25 @@ public void onClick(DialogInterface dialog, int which) {
}
}
- }
-
- titleView = findViewById(R.id.title);
- BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView);
- NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
- NavigationUI.setupWithNavController(bottomNavigationView, navController);
-
- Context ctx = getApplicationContext();
-
- navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
- @Override
- public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
- if (destination.getId() == R.id.nav_info) {
- titleView.setText(ctx.getString(R.string.status));
- } else if (destination.getId() == R.id.nav_logs) {
- titleView.setText(ctx.getString(R.string.logs));
- } else if (destination.getId() == R.id.nav_settings) {
- titleView.setText(ctx.getString(R.string.settings));
- }
- }
- });
- }
-
- private void onRequestPermissionsResult(int requestCode, int grantResult) {
- if (requestCode == 100) {
- boolean granted = grantResult == PackageManager.PERMISSION_GRANTED;
- if (granted) {
- recreate();
- logUtils.w("Shizuku permission is granted.");
-
- if (Utils.getBatteryRestrictionStatus(this)) {
- Utils.showBatteryDialog(this);
+ titleView = findViewById(R.id.title);
+ BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView);
+ NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
+ NavigationUI.setupWithNavController(bottomNavigationView, navController);
+
+ Context ctx = getApplicationContext();
+
+ navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
+ @Override
+ public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
+ if (destination.getId() == R.id.nav_info) {
+ titleView.setText(ctx.getString(R.string.status));
+ } else if (destination.getId() == R.id.nav_logs) {
+ titleView.setText(ctx.getString(R.string.logs));
+ } else if (destination.getId() == R.id.nav_settings) {
+ titleView.setText(ctx.getString(R.string.settings));
+ }
}
- } else {
- logUtils.w("Shizuku permission is rejected.");
- Utils.showDialog(this, this.getString(R.string.permission_rejected), this.getString(R.string.perm_rejected_desc));
- }
+ });
}
}
@@ -146,22 +126,18 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 105) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- if (Utils.isShizukuInstalled(MainActivity.this)) {
- if (Shizuku.pingBinder()) {
- Shizuku.addRequestPermissionResultListener(REQUEST_PERMISSION_RESULT_LISTENER);
- if (!Utils.hasShizukuPermission()) {
- logUtils.w("Shizuku permission is not granted, requesting permission.");
- Shizuku.requestPermission(100);
- }
+ if (RootManager.isDeviceRooted()) {
+ if (RootManager.requestRootPermission()) {
+ Toast.makeText(MainActivity.this, "Root access granted", Toast.LENGTH_SHORT).show();
} else {
- Toast.makeText(MainActivity.this, MainActivity.this.getString(R.string.please_start_shizuku), Toast.LENGTH_SHORT).show();
- Utils.openShizuku(MainActivity.this);
+ Toast.makeText(MainActivity.this, "Root access rejected, please allow from manager.", Toast.LENGTH_SHORT).show();
}
} else {
- Toast.makeText(MainActivity.this, MainActivity.this.getString(R.string.please_install_shizuku), Toast.LENGTH_SHORT).show();
- Utils.openPlayStore(MainActivity.this);
+ Toast.makeText(MainActivity.this, "SU binary doesn't found in device, please root your device.", Toast.LENGTH_SHORT).show();
}
-
+ prefsEditor.putBoolean("root_request_complete", true);
+ prefsEditor.apply();
+ recreate();
} else {
Toast.makeText(this, "Please allow notification permission from App Info", Toast.LENGTH_SHORT).show();
finish();
@@ -169,10 +145,4 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis
}
}
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Shizuku.removeRequestPermissionResultListener(REQUEST_PERMISSION_RESULT_LISTENER);
- }
}
\ No newline at end of file
diff --git a/app/src/main/java/me/mamiiblt/instafel/updater/fragments/InfoFragment.java b/app/src/main/java/me/mamiiblt/instafel/updater/fragments/InfoFragment.java
index 35ec4bc..ec1d210 100644
--- a/app/src/main/java/me/mamiiblt/instafel/updater/fragments/InfoFragment.java
+++ b/app/src/main/java/me/mamiiblt/instafel/updater/fragments/InfoFragment.java
@@ -13,6 +13,7 @@
import androidx.preference.PreferenceManager;
import android.provider.Settings;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -25,8 +26,10 @@
import me.mamiiblt.instafel.updater.MainActivity;
import me.mamiiblt.instafel.updater.update.UpdateWorkHelper;
+import me.mamiiblt.instafel.updater.utils.CommandOutput;
import me.mamiiblt.instafel.updater.utils.LogUtils;
import me.mamiiblt.instafel.updater.R;
+import me.mamiiblt.instafel.updater.utils.RootManager;
import me.mamiiblt.instafel.updater.utils.Utils;
import rikka.shizuku.Shizuku;
@@ -34,6 +37,7 @@ public class InfoFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
+ private static boolean rootStatus = false;
private String mParam1;
private String mParam2;
@@ -59,17 +63,17 @@ public void onCreate(Bundle savedInstanceState) {
}
}
- private TextView viewShizukuStatus, viewArchitecture, viewIType, viewStatus, viewBatteryStatus;
+ private TextView viewRootStatus, viewArchitecture, viewIType, viewStatus, viewBatteryStatus;
private Button viewStartBtn, viewStopBtn;
private FloatingActionButton viewFab;
private SharedPreferences sharedPreferences;
- public String STRING_AUTHORIZED, STRING_UNAUTHORIZED, STRING_STOPPED, STRING_NOT_INSTALLED, STRING_START_SERVICE, STRING_RESTRICTED, STRING_UNRESTICTED;
+ public String STRING_UNAUTHORIZED, STRING_STOPPED, STRING_RESTRICTED, STRING_NOT_FOUND, STRING_UNRESTICTED;
private LogUtils logUtils;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_info, container, false);
- viewShizukuStatus = view.findViewById(R.id.statusTextView);
+ viewRootStatus = view.findViewById(R.id.statusTextView);
viewArchitecture = view.findViewById(R.id.statusTextView2);
viewIType = view.findViewById(R.id.statusTextView3);
viewStatus = view.findViewById(R.id.statusTextView4);
@@ -80,11 +84,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
logUtils = new LogUtils(getActivity());
Context ctx = getContext();
- STRING_AUTHORIZED = ctx.getString(R.string.authorized);
STRING_UNAUTHORIZED = ctx.getString(R.string.unauthorized);
+ STRING_NOT_FOUND = ctx.getString(R.string.not_found);
STRING_STOPPED = ctx.getString(R.string.stopped);
- STRING_NOT_INSTALLED = ctx.getString(R.string.not_installed);
- STRING_START_SERVICE = ctx.getString(R.string.start_service);
STRING_RESTRICTED = ctx.getString(R.string.battery_restiricted);
STRING_UNRESTICTED = ctx.getString(R.string.battery_unrestiricted);
@@ -106,35 +108,28 @@ public void onClick(View view) {
viewBatteryStatus.setText(STRING_UNRESTICTED);
}
- if (Utils.isShizukuInstalled(getActivity())) {
- if (Shizuku.pingBinder()) {
- if (Utils.hasShizukuPermission()) {
- viewShizukuStatus.setText(STRING_AUTHORIZED);
+ if (sharedPreferences.getBoolean("root_request_complete", false)) {
+ if (RootManager.isDeviceRooted()) {
+ CommandOutput commandOutput = RootManager.execSuCommands("su -v", "su -V");
+ if (commandOutput.getExitCode() == 0) {
+ rootStatus = true;
+ String[] outputParts = commandOutput.getLog().trim().split("\n");
+ viewRootStatus.setText("✔ " + outputParts[0].trim() + " (" + outputParts[1].trim() + ")");
} else {
- viewShizukuStatus.setText(STRING_UNAUTHORIZED);
- view.findViewById(R.id.shizuku_status).setOnClickListener(new View.OnClickListener() {
+ rootStatus = false;
+ viewRootStatus.setText(STRING_UNAUTHORIZED);
+ view.findViewById(R.id.root_status).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- if (Utils.hasShizukuPermission()) {
- viewShizukuStatus.setText(STRING_AUTHORIZED);
- } else {
- Shizuku.requestPermission(100);
- }
+ RootManager.requestRootPermission();
}
});
}
} else {
- Toast.makeText(ctx, ctx.getString(R.string.please_start_shizuku), Toast.LENGTH_SHORT).show();
- viewShizukuStatus.setText(STRING_START_SERVICE);
+ viewRootStatus.setText(STRING_NOT_FOUND);
}
} else {
- viewShizukuStatus.setText(STRING_NOT_INSTALLED);
- view.findViewById(R.id.shizuku_status).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- Utils.openPlayStore(getActivity());
- }
- });
+ viewRootStatus.setText(this.getString(R.string.checking));
}
updateUI();
@@ -143,23 +138,12 @@ public void onClick(View view) {
@Override
public void onClick(View view) {
if (!Utils.getBatteryRestrictionStatus(getActivity())) {
- if (Utils.isShizukuInstalled(getActivity())) {
- if (Shizuku.pingBinder()) {
- if (Utils.hasShizukuPermission()) {
- logUtils.w(getContext().getString(R.string.upd_started));
- UpdateWorkHelper.scheduleWork(getActivity());
- updateUI();
- } else {
- Toast.makeText(ctx, ctx.getString(R.string.please_give_permission), Toast.LENGTH_SHORT).show();
- Utils.openShizuku(ctx);
- }
- } else {
- Toast.makeText(ctx, ctx.getString(R.string.please_start_shizuku), Toast.LENGTH_SHORT).show();
- Utils.openShizuku(ctx);
- }
+ if (rootStatus) {
+ logUtils.w(getContext().getString(R.string.upd_started));
+ UpdateWorkHelper.scheduleWork(getActivity());
+ updateUI();
} else {
- Toast.makeText(ctx, ctx.getString(R.string.please_install_shizuku), Toast.LENGTH_SHORT).show();
- Utils.openPlayStore(ctx);
+ Toast.makeText(ctx, getString(R.string.please_install_root), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(ctx, ctx.getString(R.string.please_allow_unrestiracted), Toast.LENGTH_SHORT).show();
diff --git a/app/src/main/java/me/mamiiblt/instafel/updater/update/InstafelUpdateService.java b/app/src/main/java/me/mamiiblt/instafel/updater/update/InstafelUpdateService.java
index 89c12dd..68c14e1 100644
--- a/app/src/main/java/me/mamiiblt/instafel/updater/update/InstafelUpdateService.java
+++ b/app/src/main/java/me/mamiiblt/instafel/updater/update/InstafelUpdateService.java
@@ -23,10 +23,9 @@
import java.text.DecimalFormat;
import me.mamiiblt.instafel.updater.R;
+import me.mamiiblt.instafel.updater.utils.CommandOutput;
import me.mamiiblt.instafel.updater.utils.LogUtils;
-import me.mamiiblt.instafel.updater.utils.ShizukuInstaller;
-import me.mamiiblt.instafel.updater.utils.Utils;
-import rikka.shizuku.Shizuku;
+import me.mamiiblt.instafel.updater.utils.RootManager;
public class InstafelUpdateService extends Service {
@@ -59,7 +58,6 @@ public int onStartCommand(Intent intent, int flags, int startId) {
createNotificationChannel();
startForeground(NOTIFICATION_ID, notifyWaitingAPI());
version = intent.getStringExtra("version");
- advanced_userservice_mode = intent.getBooleanExtra("advanced_userservice_mode", false);
disable_priority_error_log = intent.getBooleanExtra("disable_error_log", false);
downloadFile(intent.getStringExtra("file_url"));
}
@@ -67,9 +65,6 @@ public int onStartCommand(Intent intent, int flags, int startId) {
}
private void downloadFile(String fileUrl) {
- if (advanced_userservice_mode) {
- ShizukuInstaller.ensureUserService(ctx);
- }
this.df = new DecimalFormat("#.##");
try {
@@ -123,9 +118,6 @@ private void downloadFile(String fileUrl) {
errorOccured = true;
} finally {
if (!errorOccured) {
- if (advanced_userservice_mode) {
- ShizukuInstaller.ensureUserService(ctx);
- }
updateApp(ifl_update_file);
}
}
@@ -175,27 +167,24 @@ private void updateApp(File ifl_update_file) {
logUtils.w("Download complete, installation is started.");
new Thread(() -> {
try {
- if (ShizukuInstaller.isShizukuSupported()) {
- if (Utils.hasShizukuPermission()) {
- if (!advanced_userservice_mode) {
- installApk(ifl_update_file);
- } else {
- int try_num = 0;
- for (int i = 0; i < 5; i++) {
- boolean issued = ShizukuInstaller.ensureUserService(ctx);
- if (issued) {
- try_num = 10;
- } else {
- try_num++;
- }
- }
- installApk(ifl_update_file);
- }
- } else {
- logUtils.w("Shizuku permission is not granted for Install.");
- }
+ logUtils.w("Installing update");
+ CommandOutput commandOutput = RootManager.execSuCommands(
+ "cp " + ifl_update_file.getAbsolutePath() + " /data/local/tmp/INSTAFEL_UPDATE.apk",
+ "pm install /data/local/tmp/INSTAFEL_UPDATE.apk",
+ "rm /data/local/tmp/INSTAFEL_UPDATE.apk"
+ );
+
+ if (commandOutput.getExitCode() == 0 && commandOutput.getLog().contains("Success")) {
+ logUtils.w("Update installed.");
+ recreateFilesDir();
+ notifyUpdateInstalled();
+ logUtils.w("Instafel succesfully updated.");
} else {
- logUtils.w("Shizuku is not supported.");
+ logUtils.w("Update installation failed.");
+ notifyError("An error occurred when installing update (RESULT_FAILED)");
+ logUtils.w("exitCode: " + commandOutput.getExitCode());
+ logUtils.w("output: " + commandOutput.getLog());
+ logUtils.w("errOutput: " + commandOutput.getErrorLog());
}
} catch (Exception e) {
logUtils.w("Installation method crashed.");
@@ -207,25 +196,6 @@ private void updateApp(File ifl_update_file) {
}).start();
}
- private void installApk(File ifl_update_file) {
- logUtils.w("Shizuku permission is valid, triggering UserService again, " + ShizukuInstaller.ensureUserService(ctx));
- logUtils.w("Copying downloaded apk file to temp.");
- ShizukuInstaller.runCommand(ctx, "cp " + ifl_update_file + " /data/local/tmp/INSTAFEL_UPDATE.apk");
- logUtils.w("Installing update");
- String updateLog = ShizukuInstaller.runCommand(ctx, "pm install /data/local/tmp/INSTAFEL_UPDATE.apk");
- if (updateLog.trim().equals("Success")) {
- logUtils.w("Update installed.");
- ShizukuInstaller.runCommand(ctx, "rm -r /data/local/tmp/INSTAFEL_UPDATE.apk");
- recreateFilesDir();
- logUtils.w("Downloaded apk & temp apk removed");
- notifyUpdateInstalled();
- logUtils.w("Instafel succesfully updated.");
- } else {
- logUtils.w("Update installation failed.");
- notifyError("An error occurred when installing update (RESULT_FAILED)");
- }
- }
-
private void notifyStatus(int prog, String finalFormattedDownloadedSize) {
notificationBuilder
.setContentTitle(ctx.getString(R.string.n1_downloading))
diff --git a/app/src/main/java/me/mamiiblt/instafel/updater/update/UpdateWork.java b/app/src/main/java/me/mamiiblt/instafel/updater/update/UpdateWork.java
index e6ca562..38abd1d 100644
--- a/app/src/main/java/me/mamiiblt/instafel/updater/update/UpdateWork.java
+++ b/app/src/main/java/me/mamiiblt/instafel/updater/update/UpdateWork.java
@@ -33,7 +33,6 @@
import me.mamiiblt.instafel.updater.utils.AppPreferences;
import me.mamiiblt.instafel.updater.utils.LocalizationUtils;
import me.mamiiblt.instafel.updater.utils.LogUtils;
-import me.mamiiblt.instafel.updater.utils.ShizukuInstaller;
import me.mamiiblt.instafel.updater.utils.Utils;
import okhttp3.OkHttpClient;
import okhttp3.Request;
@@ -113,7 +112,6 @@ public Result doWork() {
preferences.getBoolean("12_hour_rule", false),
preferences.getBoolean("use_instafel_api", true),
preferences.getBoolean("disable_error_notifications", false),
- preferences.getBoolean("advanced_userservice_mode", false),
preferences.getBoolean("crash_logger", false));
// Check Network Statues
@@ -202,12 +200,6 @@ public Result doWork() {
}
}
- // Start Shizuku User Service for run commands
-
- logUtils.w("Starting UserService");
- ShizukuInstaller.ensureUserService(ctx);
-
-
String b_download_url = null;
if (appPreferences.isUseInstafelApi()) {
if (type.equals("uc")) {
@@ -232,7 +224,6 @@ public Result doWork() {
Intent fgServiceIntent = new Intent(ctx, InstafelUpdateService.class);
fgServiceIntent.putExtra("file_url", b_download_url);
fgServiceIntent.putExtra("version", uVersion);
- fgServiceIntent.putExtra("advanced_userservice_mode", appPreferences.isAllowAdvancedUserServiceMode());
fgServiceIntent.putExtra("disable_error_log", appPreferences.isDisable_error_notifications());
ctx.startService(fgServiceIntent);
} else {
diff --git a/app/src/main/java/me/mamiiblt/instafel/updater/utils/AppPreferences.java b/app/src/main/java/me/mamiiblt/instafel/updater/utils/AppPreferences.java
index e95f87d..f3e13a4 100644
--- a/app/src/main/java/me/mamiiblt/instafel/updater/utils/AppPreferences.java
+++ b/app/src/main/java/me/mamiiblt/instafel/updater/utils/AppPreferences.java
@@ -2,9 +2,9 @@
public class AppPreferences {
private String checker_interval, arch, itype;
- private boolean send_notification, send_toast, use_mobile_data, hour_mode12, use_instafel_api, disable_error_notifications, crash_logger, advanced_userservice_mode;
+ private boolean send_notification, send_toast, use_mobile_data, hour_mode12, use_instafel_api, disable_error_notifications, crash_logger;
- public AppPreferences(String checker_interval, String arch, String itype, boolean send_notification, boolean send_toast, boolean use_mobile_data, boolean hour_mode12, boolean use_instafel_api, boolean disable_error_notifications, boolean crash_logger, boolean advanced_userservice_mode) {
+ public AppPreferences(String checker_interval, String arch, String itype, boolean send_notification, boolean send_toast, boolean use_mobile_data, boolean hour_mode12, boolean use_instafel_api, boolean disable_error_notifications, boolean crash_logger) {
this.checker_interval = checker_interval;
this.arch = arch;
this.itype = itype;
@@ -14,7 +14,6 @@ public AppPreferences(String checker_interval, String arch, String itype, boolea
this.hour_mode12 = hour_mode12;
this.use_instafel_api = use_instafel_api;
this.disable_error_notifications = disable_error_notifications;
- this.advanced_userservice_mode = advanced_userservice_mode;
this.crash_logger = crash_logger;
}
@@ -50,9 +49,6 @@ public boolean isUseInstafelApi() {
return use_instafel_api;
}
- public boolean isAllowAdvancedUserServiceMode() {
- return advanced_userservice_mode;
- }
public boolean isCrashLoggerEnabled() {
return crash_logger;
diff --git a/app/src/main/java/me/mamiiblt/instafel/updater/utils/CommandOutput.java b/app/src/main/java/me/mamiiblt/instafel/updater/utils/CommandOutput.java
index 5a133eb..72d6dc3 100644
--- a/app/src/main/java/me/mamiiblt/instafel/updater/utils/CommandOutput.java
+++ b/app/src/main/java/me/mamiiblt/instafel/updater/utils/CommandOutput.java
@@ -1,4 +1,25 @@
package me.mamiiblt.instafel.updater.utils;
public class CommandOutput {
+
+ int exitCode;
+ String log, errorLog;
+
+ public CommandOutput(int exitCode, String log, String errorLog) {
+ this.exitCode = exitCode;
+ this.log = log;
+ this.errorLog = errorLog;
+ }
+
+ public int getExitCode() {
+ return exitCode;
+ }
+
+ public String getLog() {
+ return log;
+ }
+
+ public String getErrorLog() {
+ return errorLog;
+ }
}
diff --git a/app/src/main/java/me/mamiiblt/instafel/updater/utils/RootManager.java b/app/src/main/java/me/mamiiblt/instafel/updater/utils/RootManager.java
index 119c17f..207a582 100644
--- a/app/src/main/java/me/mamiiblt/instafel/updater/utils/RootManager.java
+++ b/app/src/main/java/me/mamiiblt/instafel/updater/utils/RootManager.java
@@ -1,4 +1,107 @@
package me.mamiiblt.instafel.updater.utils;
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.InputStreamReader;
+
public class RootManager {
+ public static boolean isDeviceRooted() {
+ String[] paths = {
+ "/sbin/su",
+ "/system/bin/su",
+ "/system/xbin/su",
+ "/data/local/xbin/su",
+ "/data/local/bin/su",
+ "/system/sd/xbin/su",
+ "/system/bin/failsafe/su",
+ "/data/local/su"
+ };
+
+ for (String path : paths) {
+ if (new File(path).exists()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean requestRootPermission() {
+ try {
+ Process process = Runtime.getRuntime().exec("su");
+ DataOutputStream os = new DataOutputStream(process.getOutputStream());
+ os.writeBytes("exit\n");
+ os.flush();
+ process.waitFor();
+ int exitValue = process.exitValue();
+ return exitValue == 0;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ public static String execSuCommand(String command) {
+ StringBuilder output = new StringBuilder();
+ try {
+ Process process = Runtime.getRuntime().exec("su");
+
+ DataOutputStream os = new DataOutputStream(process.getOutputStream());
+ os.writeBytes(command + "\n");
+ os.writeBytes("exit\n");
+ os.flush();
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+ String line;
+ while ((line = reader.readLine()) != null) {
+ output.append(line).append("\n");
+ }
+
+ BufferedReader errorReader = new BufferedReader(
+ new InputStreamReader(process.getErrorStream()));
+
+ while ((line = errorReader.readLine()) != null) {
+ output.append("ERROR: ").append(line).append("\n");
+ }
+
+ process.waitFor();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return output.toString();
+ }
+
+ public static CommandOutput execSuCommands(String... commands) {
+ StringBuilder output = new StringBuilder();
+ try {
+ Process process = Runtime.getRuntime().exec("su");
+ DataOutputStream os = new DataOutputStream(process.getOutputStream());
+ for (String command : commands) {
+ os.writeBytes(command + "\n");
+ }
+ os.writeBytes("exit\n");
+ os.flush();
+
+ BufferedReader reader = new BufferedReader(
+ new InputStreamReader(process.getInputStream()));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ output.append(line).append("\n");
+ }
+
+ StringBuilder errorOutput = new StringBuilder();
+ BufferedReader errorReader = new BufferedReader(
+ new InputStreamReader(process.getErrorStream()));
+ while ((line = errorReader.readLine()) != null) {
+ errorOutput.append(line).append("\n");
+ }
+
+ process.waitFor();
+ return new CommandOutput(process.exitValue(), output.toString(), errorOutput.toString());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new CommandOutput(-1, output.toString(), null);
+ }
+ }
}
diff --git a/app/src/main/java/me/mamiiblt/instafel/updater/utils/Utils.java b/app/src/main/java/me/mamiiblt/instafel/updater/utils/Utils.java
index 1f91214..e312d4f 100644
--- a/app/src/main/java/me/mamiiblt/instafel/updater/utils/Utils.java
+++ b/app/src/main/java/me/mamiiblt/instafel/updater/utils/Utils.java
@@ -24,30 +24,6 @@
import rikka.shizuku.Shizuku;
public class Utils {
-
- public static boolean status = false;
-
- public static boolean hasShizukuPermission() {
- if (Shizuku.isPreV11()) {
- return false;
- }
-
- return Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED;
- }
-
- public static boolean isShizukuInstalled(Activity activity) {
- if (getAppVersionCode(activity, "moe.shizuku.privileged.api").equals("NOT_INSTALLED")) {
- return false;
- } else {
- return true;
- }
- }
-
- public static void openShizuku(Context ctx) {
- Intent intent = ctx.getPackageManager().getLaunchIntentForPackage("moe.shizuku.privileged.api");
- ctx.startActivity(intent);
- }
-
public static void showBatteryDialog(Context ctx) {
if (Utils.getBatteryRestrictionStatus(ctx)) {
new MaterialAlertDialogBuilder(ctx)
@@ -95,18 +71,8 @@ public static boolean getBatteryRestrictionStatus(Context ctx) {
}
}
- public static void openPlayStore(Context ctx) {
- Intent intent = new Intent("android.intent.action.VIEW", Uri.parse("https://play.google.com/store/apps/details?id=moe.shizuku.privileged.api"));
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- ctx.startActivity(intent);
- }
-
-
public static String getAppVersionCode(Context ctx, String packageName) {
try {
- /*PackageManager packageManager = ctx.getPackageManager();
- PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
- Log.v("IFL", "p: " + packageName);*/
PackageManager pm = ctx.getPackageManager();
PackageInfo pInfo = pm.getPackageInfo(packageName, PackageManager.GET_META_DATA);
return pInfo.versionName;
@@ -115,15 +81,4 @@ public static String getAppVersionCode(Context ctx, String packageName) {
return "NOT_INSTALLED";
}
}
-
- public static void showDialog(Context ctx, String title, String message) {
- new MaterialAlertDialogBuilder(ctx)
- .setTitle(title)
- .setMessage(message)
- .setNegativeButton(android.R.string.yes, null)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .show();
- }
-
-
}
diff --git a/app/src/main/res/drawable/iflu_icon_foreground.xml b/app/src/main/res/drawable/iflu_icon_foreground.xml
index 3ad5c99..7dbfe2e 100644
--- a/app/src/main/res/drawable/iflu_icon_foreground.xml
+++ b/app/src/main/res/drawable/iflu_icon_foreground.xml
@@ -1,18 +1,14 @@
-
+ android:viewportWidth="960"
+ android:viewportHeight="960">
+
-
+ android:pathData="M266.67,920q-27,0 -46.84,-19.83Q200,880.33 200,853.33v-746.66q0,-27 19.83,-46.84Q239.67,40 266.67,40h306.66v66.67L266.67,106.67L266.67,140h306.66v66.67L266.67,206.67v546.66h426.66L693.33,640L760,640v213.33q0,27 -19.83,46.84Q720.33,920 693.33,920L266.67,920ZM266.67,820v33.33h426.66L693.33,820L266.67,820ZM729.33,550.67L538.67,360l46.66,-46.67 110.67,110v-296.66h66.67v296.66l110.66,-110L920,360 729.33,550.67ZM266.67,140v-33.33L266.67,140ZM266.67,820v33.33L266.67,820Z"
+ android:fillColor="#362a14"/>
diff --git a/app/src/main/res/layout/fragment_info.xml b/app/src/main/res/layout/fragment_info.xml
index 492196b..069da27 100644
--- a/app/src/main/res/layout/fragment_info.xml
+++ b/app/src/main/res/layout/fragment_info.xml
@@ -21,7 +21,7 @@
app:cardElevation="4dp">
@@ -70,6 +70,7 @@
android:layout_height="wrap_content"
android:text="_restype"
android:textAppearance="?android:attr/textAppearanceMedium" />
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/iflu_icon.xml b/app/src/main/res/mipmap-anydpi-v26/iflu_icon.xml
index 813e43c..828c33f 100644
--- a/app/src/main/res/mipmap-anydpi-v26/iflu_icon.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/iflu_icon.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/iflu_icon_round.xml b/app/src/main/res/mipmap-anydpi-v26/iflu_icon_round.xml
index aea4953..828c33f 100644
--- a/app/src/main/res/mipmap-anydpi-v26/iflu_icon_round.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/iflu_icon_round.xml
@@ -1,6 +1,6 @@
-
+
-
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/iflu_icon.webp b/app/src/main/res/mipmap-hdpi/iflu_icon.webp
index 85fc2c1472a9df0c9bed663e9a4af72b658b77bb..4a67a669c5d0aeac00424014644ef7de740f521f 100644
GIT binary patch
literal 876
zcmV-y1C#txNk&Fw0{{S5MM6+kP&iCj0{{RoN5ByfhvhnwY*m@3$d~3%coZRA+d-0W
z+(?q7WY6p_&l~^WxP=Qh%yg&YMv@dM7moSvcmCVK1~JceC*0b$RaNug4jDxdkuqq*
zDxn|haOY>%1mTa|&N={q00IagfEG{%0tg_00#FAkKmaB61xPp)Uyp5X{Qh^Lq*ACr
z2oXXw1yWKFQXy0+fh-ULDL`23RiqM1fB>}_l0if^kM;jMrEDi7z%U3Bw#L+S$>Phb@h7L&&K<%UnNMW
zgCHjS_cxuNFaKZA+FJW=Afq?AU*_YfQ=h0~f+R@O!n*bTmR1kuR^OK1JN4E*oOUrCJ3q&Y{NcEQtf<8MV1E`HcAwUU0mZDOj&(LR)
zN@I3Xss4Xd3QZ$}Km}4MK>ytOUG!n{wynJce&EsFx6RvOH^_O*(bAj0_PIPeq+Q!y
zNRn;aw$|RAwQbu|Yh%0~+g#&ERwsSxU4N>2l5`^aKLK8U-=m^QN;gD;sNfR7{kymC
z-LbSIwE!YH1Y&N*iFoUao7cS}nWBIjarGp{6(2;gMB|#Mk0%+Mc?Qu;-dCv@$qT&M
zd@jcmk%3^lsZ=enKf#
zSe8U3V|1{s)qJ;7DGg)Qbmm+?q1IVbY@SQ4y+kqo9=vn4c1==BgQ$w1w>y{C>HdK_
z*)UdB+cmL~M!O5OV{~9$|9Hd
z`WYl`YR*zW1(lSmeiH5_k#@2!>E}@NYE=IEIx2G*%imC%z|KQQXM*tiGv<5UZ
zpf#WYKm%F>8XC|V(9p-E+V2E^@#6IU7#JEBZh4Ok_~6Y0eERYEz2$93d%0B*#NSlI
C*s!nw
literal 1352
zcmV-O1-JTANk&FM1pok7MM6+kP&iC81pojqN5Byf2}Nz&K<&0)#vk!TA)@~ike(~(
zG48Nj;X#k#H5ZH`Nm7&xPxP0e8Jy%r@=NmlNJ+Q0tz}y^&x5d|Xc+$vNf$h;vXtQ`hAJP9L~N-h0@A!VD5?h#93H4yVfx;dCP|Q8
zBaKq218pmRuS(`Ut5T)@Hx{a$B}g?EF=TLU*I>QX(HB+CBH
zf|?~b^0{%*hkqypjDI$cF-=`c|qIv~=4RIXjr!KsjU@A!YafRtfGEn+1A
zP$e?2A`ng9jrtz}P!tKVan!g#)H{43{{jU7_=B^Htv@XxF?U-mI}lAX0D?dO!o$bQ
zm*0q+n6jF~S819N2?t?X01%a#8>4APq$U=eVEwt8yoG`^o4tqSCmFY<{`@Kc4E_}F
zK7}Bl1cLDWAAk^<&M#bhI1~()GAIa^GJs;JVHyke^X@%WiP1}$u^$a0v-a%Rd1Y)l
zPje3dlo&DCIgQOzm^zKf^nT^*U$O8goB!R@m;l2Eduz{_5kul*kI1}u6OW$8m)~Q-
ze|x6&0LwE*7yaV#zhj_B?1C4sdH6KGRsaA7EAIXugGT&w_SI`1%v`=!fd0Yl=7Ru{
zkpKX^nNkmCEFFV;;X?uxK_uQ4x27;4Kq2sf8{aBGF;KDg+MX$gczTbP=SwlBaa&^Q
zu^7HQKtv`RhwK3YN>Bg-5GL%7xWSLcvZ6*?2v8KEz#pcTDSR!``Thqz?}QSP5IzEre)eSQm`
zyn7sJl;R)C`EQ@Dj^2E7GG_kOiBMBnF9sp;eO*DG8irIGj^t@5qnv4e&%^QmZyiB7
z_Cl2glp}zzJJ0U!?l^OMZ}h_JqfJwf3KhxkYeSwEWu)3j?piNCiI#Z0(Q6;xOYTI*
zuZ($aHox+;7Y6sveOQ~A8$&jZHS7PCEh78}FsKV*z(yhTFkq2kDb+BL3JnkljQ|3{
zvZ#jvOMn1SAwgFdK_eT3j1b&Lh6U>>%A{}k_5IG<=ac^*oWjc`j~cQOi
K8WiyVBme+GBywp0
diff --git a/app/src/main/res/mipmap-hdpi/iflu_icon_round.webp b/app/src/main/res/mipmap-hdpi/iflu_icon_round.webp
index fe0ba5fe30f12a298999208595d267b8515f6905..16957f99d3cf47247f8512970115453193d47c80 100644
GIT binary patch
literal 2284
zcmV0
zTY1QhBsp@@e^=-PX#l@`X{|X^RoyF201|B5HtlG9Td{51wr$(C?R3F*Qnp=Ph;2K0
z@BT9ZP_u1Yw(Rrc?jHZ+UjTP^cU{0;5)qQSJ0y461>X04U<;xRK({r1CSV=G&jpz{O4$PYxnh5adb4t
z2ntto!8bS1mVP3(RR87WNOi}j&sZ6JUCpJ<(EuRk6VaGVXGK*gdQ?%rm7`Tfoyh7|
zK6>2jYPmXjYM%p@&hq>21pv*VNizWQ-7Tq{nJOQ@P}HHUKu8MWEX2<-ozE{Q31Dcn
zI4(ep|JE@b1ByBm0ws;4PMpgX?ls7iv{2V|vq)jibwm;V;sXHJp+W;tI-TUBkBS0;
zg}I6GHhE!0arB`8THst4ygyP_)GQOobyQjBh+?Ciz;y$Z<{t`xa%Q2T?uE{E44}?+
zRMf-a0G|Zp6Uh5Jc+&AJfpP|h0S}>&j$c0mp9J6&ke||1)P@L|NTC@*rE??i-TLr}
zY8rTsJeLt6q%?$*e#mj#3pABJ0m&K0kR!Dmy&AHqNccpRPaxlI4~85m=E9>P{jm>x
zqJjo_p4M9iIa19!aUkch1w&np4HlW4
zqiqxyWip-R)G&L?0UUoCA&)F+MnUuALb`W}OZo&QjVN|l
zaN?BQY{jDvz$TmX&(mE-V6rUcbQD)PaD6n$(U~HOAmug-N~}v^N!(BXbWrw8E0h2w
zgC3nH&IQfKvGeF>f~zH)mG@g_6dadm-Vh)<0FWODFwF-Muii&ft(e?c#C`MtOqQ`Z
z?B_-r3;+i*bUF(i)hh2GPlYFJF@53-3vxvU&>*uZ7d*Hmg(u9_Y9K(+030hvJ&Hlb
zBMY~tEe8yP04b09Ny8S))D_(5}+D}0Sy5?pIXKuDh16lb)M;9
zJ`{U9^ntIJ={VEP27}MENL7j`3eq;KRRRYL7lwV1@Tx;JRXUb=ib;lp!CsZuYWRA9
zY7^UsZVFYCWiUsbi5%nyq6-stQ}UWi8t@daj7H-jG_!m3i0mjI4rvNJ~LA^6GJH^fm)OD7%x*KrXz-Ro4CMCF!N`K7%-2^oK?>6)q1F3lQ6`E9F
zjm32rZc{q}rO7fi*S%6Y;2O{mi*!D9NDCfQbSDK-hWe;2Py)k%OEu+^UO2~__
zRPkCe5COw52(WV0zmNwP7mGCi32+Sq@^e8Vz({Y6Q?u%3-Mk};%+Z>=(*elOCHeRT
zTXlk#>cYq8B$C1(oh(bo@fv_bfIMjyUx7gtVc9Dfd=3$RCIT2%D{P8+sy#G=NvaS_
z6(2Opu3;GfkVt@+zIusVt@ydg$R}kY9+|!MfdD@d06-(aoFys1B5JAA$Qo@i=9Q{L
z(r``jF$hqa9kg@nBQ%MQj^(v8O_-%JC-n?Q4;nr&4L4K*B8w%X$ko_kdQO>JjC}fz
z^|u6)!aWsCJ3YHcG4SggGSKXP_X%AE#3#*QJeob_jh}o2b*~n(%r$gBhprp9G};g;)~_a0Xjz_>V$Y0cX=}lF7fFK|P6O
zs-f4l#a}-**Ob_xBOd7lWae)@kH{IA8iz4@-?ZsBTbu@QoCZkOx6EpnrM?noFoao(
z=Bi0H=j#Uoa$H~_9_devKh>05gRJl%h?LG&!w9=NpXixa2E^H}mtPJ6mATvR?~76w
zQ97~vrfGjBp!$X#H+Y_apuCM?iewc-w1vcc>9yn=(~G+R3dFYyK9~d~TVK0xT64uX
zU7Rg$u3Kgg{C@?Af75?(3CQ)nx0H+)Vw@(Co@T8@_Tc?Lwm@yG?hhga6q9i>pCR=jYYi-#6sV*q
zdt|Egr(_&0zByCdyjxtiE_ZW9562*>}$Ptk9x1O_cI5sQ4W}GU*f#?qOV={m<9A(
z)dKa6y0J(Nv_!ceML;^b!B<~x5It?pm+QtNZ=7U7(Ari*K&}-iO#`hVpcfAvyuW2b
GfB^ucvMnkA
literal 3416
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