mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-03-28 19:32:15 +00:00
158 lines
5.2 KiB
Java
158 lines
5.2 KiB
Java
package com.topjohnwu.magisk.components;
|
|
|
|
import android.Manifest;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.SharedPreferences;
|
|
import android.content.pm.PackageManager;
|
|
import android.os.Bundle;
|
|
import android.text.TextUtils;
|
|
import android.view.WindowManager;
|
|
import android.widget.Toast;
|
|
|
|
import com.topjohnwu.magisk.App;
|
|
import com.topjohnwu.magisk.Config;
|
|
import com.topjohnwu.magisk.Const;
|
|
import com.topjohnwu.magisk.R;
|
|
import com.topjohnwu.magisk.utils.LocaleManager;
|
|
import com.topjohnwu.magisk.utils.Topic;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.StyleRes;
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
import androidx.appcompat.app.AppCompatDelegate;
|
|
import androidx.core.app.ActivityCompat;
|
|
import androidx.core.content.ContextCompat;
|
|
|
|
public abstract class BaseActivity extends AppCompatActivity implements Topic.AutoSubscriber {
|
|
|
|
public static final String INTENT_PERM = "perm_dialog";
|
|
private static Runnable grantCallback;
|
|
|
|
static int[] EMPTY_INT_ARRAY = new int[0];
|
|
|
|
private ActivityResultListener activityResultListener;
|
|
public App app = App.self;
|
|
|
|
static {
|
|
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
|
|
}
|
|
|
|
@Override
|
|
public int[] getSubscribedTopics() {
|
|
return EMPTY_INT_ARRAY;
|
|
}
|
|
|
|
@Override
|
|
public void onPublish(int topic, Object[] result) {}
|
|
|
|
@StyleRes
|
|
public int getDarkTheme() {
|
|
return -1;
|
|
}
|
|
|
|
@Override
|
|
protected void attachBaseContext(Context base) {
|
|
super.attachBaseContext(LocaleManager.getLocaleContext(base, LocaleManager.locale));
|
|
}
|
|
|
|
@Override
|
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
|
Topic.subscribe(this);
|
|
if (getDarkTheme() != -1 && (boolean) Config.get(Config.Key.DARK_THEME)) {
|
|
setTheme(getDarkTheme());
|
|
}
|
|
super.onCreate(savedInstanceState);
|
|
String[] perms = getIntent().getStringArrayExtra(INTENT_PERM);
|
|
if (perms != null)
|
|
ActivityCompat.requestPermissions(this, perms, 0);
|
|
}
|
|
|
|
@Override
|
|
protected void onDestroy() {
|
|
Topic.unsubscribe(this);
|
|
super.onDestroy();
|
|
}
|
|
|
|
protected void setFloating() {
|
|
boolean isTablet = getResources().getBoolean(R.bool.isTablet);
|
|
if (isTablet) {
|
|
WindowManager.LayoutParams params = getWindow().getAttributes();
|
|
params.height = getResources().getDimensionPixelSize(R.dimen.floating_height);
|
|
params.width = getResources().getDimensionPixelSize(R.dimen.floating_width);
|
|
params.alpha = 1.0f;
|
|
params.dimAmount = 0.6f;
|
|
params.flags |= 2;
|
|
getWindow().setAttributes(params);
|
|
setFinishOnTouchOutside(true);
|
|
}
|
|
}
|
|
|
|
public void runWithExternalRW(Runnable callback) {
|
|
runWithPermission(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, callback);
|
|
}
|
|
|
|
public void runWithPermission(String[] permissions, Runnable callback) {
|
|
runWithPermission(this, permissions, callback);
|
|
}
|
|
|
|
public static void runWithPermission(Context context, String[] permissions, Runnable callback) {
|
|
boolean granted = true;
|
|
for (String perm : permissions) {
|
|
if (ContextCompat.checkSelfPermission(context, perm) != PackageManager.PERMISSION_GRANTED)
|
|
granted = false;
|
|
}
|
|
if (granted) {
|
|
Const.EXTERNAL_PATH.mkdirs();
|
|
callback.run();
|
|
} else {
|
|
// Passed in context should be an activity if not granted, need to show dialog!
|
|
if (context instanceof BaseActivity) {
|
|
grantCallback = callback;
|
|
ActivityCompat.requestPermissions((BaseActivity) context, permissions, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
if (activityResultListener != null)
|
|
activityResultListener.onActivityResult(requestCode, resultCode, data);
|
|
activityResultListener = null;
|
|
}
|
|
|
|
public void startActivityForResult(Intent intent, int requestCode, ActivityResultListener listener) {
|
|
activityResultListener = listener;
|
|
super.startActivityForResult(intent, requestCode);
|
|
}
|
|
|
|
@Override
|
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
|
boolean grant = true;
|
|
for (int result : grantResults) {
|
|
if (result != PackageManager.PERMISSION_GRANTED)
|
|
grant = false;
|
|
}
|
|
if (grant) {
|
|
if (grantCallback != null) {
|
|
grantCallback.run();
|
|
}
|
|
} else {
|
|
Toast.makeText(this, R.string.no_rw_storage, Toast.LENGTH_LONG).show();
|
|
}
|
|
grantCallback = null;
|
|
}
|
|
|
|
public interface ActivityResultListener {
|
|
void onActivityResult(int requestCode, int resultCode, Intent data);
|
|
}
|
|
|
|
@Override
|
|
public SharedPreferences getSharedPreferences(String name, int mode) {
|
|
if (TextUtils.equals(name, getPackageName() + "_preferences"))
|
|
return app.prefs;
|
|
return super.getSharedPreferences(name, mode);
|
|
}
|
|
}
|