1
mirror of https://github.com/topjohnwu/Magisk synced 2024-11-14 22:28:37 +01:00

WIP Tile stuff

This commit is contained in:
d8ahazard 2016-09-20 17:01:20 -05:00
parent 6a40e18193
commit 8176fb7bad
10 changed files with 144 additions and 33 deletions

View File

@ -32,11 +32,16 @@ repositories {
dependencies { dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs') compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:recyclerview-v7:24.2.0' compile 'com.android.support:recyclerview-v7:24.2.1'
compile 'com.android.support:cardview-v7:24.2.0' compile 'com.android.support:cardview-v7:24.2.1'
compile 'com.android.support:design:24.2.0' compile 'com.android.support:design:24.2.1'
compile 'com.github.d8ahazard:BroadcastTileSupportUpdate:master'
compile 'com.jakewharton:butterknife:8.4.0' compile 'com.jakewharton:butterknife:8.4.0'
compile 'com.github.michalis-vitos:aFileChooser:master' compile 'com.github.michalis-vitos:aFileChooser:master'
compile 'com.github.kcoppock:BroadcastTileSupport:master'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
} }

View File

@ -42,8 +42,9 @@
</service> </service>
<receiver <receiver
android:name=".receivers.PrivateBroadcastReceiver" android:name=".tile.PrivateBroadcastReceiver"
android:exported="false"> android:enabled="true"
android:exported="true">
<intent-filter> <intent-filter>
<action android:name="com.topjohnwu.magisk.CUSTOMTILE_ACTION_AUTOROOT"/> <action android:name="com.topjohnwu.magisk.CUSTOMTILE_ACTION_AUTOROOT"/>
<action android:name="com.topjohnwu.magisk.CUSTOMTILE_ACTION_DISABLEROOT"/> <action android:name="com.topjohnwu.magisk.CUSTOMTILE_ACTION_DISABLEROOT"/>

View File

@ -1,4 +1,4 @@
package com.topjohnwu.magisk.utils; package com.topjohnwu.magisk;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;

View File

@ -24,7 +24,6 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import com.topjohnwu.magisk.module.RepoHelper; import com.topjohnwu.magisk.module.RepoHelper;
import com.topjohnwu.magisk.utils.LogFragment;
import com.topjohnwu.magisk.services.MonitorService; import com.topjohnwu.magisk.services.MonitorService;
import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.Utils;

View File

@ -33,7 +33,7 @@ public class QuickSettingTileService extends TileService {
Icon iconAuto = Icon.createWithResource(getApplicationContext(), R.drawable.ic_autoroot); Icon iconAuto = Icon.createWithResource(getApplicationContext(), R.drawable.ic_autoroot);
Tile tile = this.getQsTile(); Tile tile = this.getQsTile();
boolean autoRootStatus = Utils.autoRootEnabled(getApplicationContext()); boolean autoRootStatus = Utils.autoRootEnabled(getApplicationContext());
boolean rootStatus = Utils.rootStatus(); boolean rootStatus = Utils.rootEnabled();
Log.d("Magisk", "QST: Auto and root are " + autoRootStatus + " and " + rootStatus); Log.d("Magisk", "QST: Auto and root are " + autoRootStatus + " and " + rootStatus);
if (autoRootStatus) { if (autoRootStatus) {
tile.setLabel("Auto-root"); tile.setLabel("Auto-root");

View File

@ -0,0 +1,59 @@
package com.topjohnwu.magisk.tile;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import com.kcoppock.broadcasttilesupport.BroadcastTileIntentBuilder;
import com.topjohnwu.magisk.R;
final public class CustomTileHelper {
/**
* This is the identifier of the custom Broadcast Tile. Whatever action you configured the tile
* for must be used when configuring the tile. For Broadcast tiles, only alphanumeric characters
* (and periods) are allowed. Keep in mind that this excludes underscores.
*/
private static final String BROADCAST_TILE_IDENTIFIER = "com.kcoppock.CUSTOMTILE";
/**
* Keeps track of the last known state of the Quick Settings custom tile. There doesn't seem to
* be a way to query the state of the tile.
*/
private static final String PREF_TILE_SHOWN = "com.kcoppock.CUSTOMTILE_SHOWN";
private final Context mContext;
private final TilePreferenceHelper mTilePreferenceHelper;
CustomTileHelper(@NonNull Context context) {
mContext = context.getApplicationContext();
mTilePreferenceHelper = new TilePreferenceHelper(mContext);
}
void showTile() {
mTilePreferenceHelper.setBoolean(PREF_TILE_SHOWN, true);
// Set up an Intent that will be broadcast by the system, and received by the exported
// PublicBroadcastReceiver.
// Send the update event to the Broadcast Tile. Custom tiles are hidden by default until
// enabled with this broadcast Intent.
mContext.sendBroadcast(new BroadcastTileIntentBuilder(mContext, BROADCAST_TILE_IDENTIFIER)
.setVisible(true)
.build());
}
void hideTile() {
mTilePreferenceHelper.setBoolean(PREF_TILE_SHOWN, false);
mContext.sendBroadcast(new BroadcastTileIntentBuilder(mContext, BROADCAST_TILE_IDENTIFIER)
.setVisible(false)
.build());
}
boolean isLastTileStateShown() {
return mTilePreferenceHelper.getBoolean(PREF_TILE_SHOWN);
}
}

View File

@ -1,8 +1,9 @@
package com.topjohnwu.magisk.receivers; package com.topjohnwu.magisk.tile;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.util.Log;
import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.Utils;
@ -18,7 +19,7 @@ public final class PrivateBroadcastReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
final String action = intent.getAction(); final String action = intent.getAction();
Log.d("Magisk","Broadcast Receiver, Made it this far!");
if (ACTION_AUTOROOT.equals(action)) { if (ACTION_AUTOROOT.equals(action)) {
Utils.toggleAutoRoot(true, context); Utils.toggleAutoRoot(true, context);
} }

View File

@ -0,0 +1,29 @@
package com.topjohnwu.magisk.tile;
import android.content.*;
import android.widget.Toast;
/**
* Exported receiver for the custom event on the custom Quick Settings tile
*/
public final class PublicBroadcastReceiver extends BroadcastReceiver {
/**
* The action broadcast from the Quick Settings tile when clicked
*/
public static final String ACTION_TOAST = "com.kcoppock.CUSTOMTILE_ACTION_TOAST";
/**
* Constant for the String extra to be displayed in the Toast
*/
public static final String EXTRA_MESSAGE = "com.kcoppock.CUSTOMTILE_EXTRA_MESSAGE";
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (ACTION_TOAST.equals(action)) {
final String message = intent.getStringExtra(EXTRA_MESSAGE);
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
}
}

View File

@ -0,0 +1,26 @@
package com.topjohnwu.magisk.tile;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;
/**
* Helper class for tracking preference values to keep track of the state of the custom tile
*/
final public class TilePreferenceHelper {
private static final String PREFS_NAME = "tile_prefs";
private final SharedPreferences mSharedPreferences;
TilePreferenceHelper(@NonNull Context context) {
mSharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}
void setBoolean(@NonNull String key, boolean value) {
mSharedPreferences.edit().putBoolean(key, value).apply();
}
boolean getBoolean(@NonNull String key) {
return mSharedPreferences.getBoolean(key, false);
}
}

View File

@ -35,9 +35,10 @@ import com.topjohnwu.magisk.ReposFragment;
import com.topjohnwu.magisk.module.Module; import com.topjohnwu.magisk.module.Module;
import com.topjohnwu.magisk.module.Repo; import com.topjohnwu.magisk.module.Repo;
import com.topjohnwu.magisk.module.RepoHelper; import com.topjohnwu.magisk.module.RepoHelper;
import com.topjohnwu.magisk.receivers.PrivateBroadcastReceiver; import com.topjohnwu.magisk.tile.PrivateBroadcastReceiver;
import com.topjohnwu.magisk.services.MonitorService; import com.topjohnwu.magisk.services.MonitorService;
import com.topjohnwu.magisk.services.QuickSettingTileService; import com.topjohnwu.magisk.services.QuickSettingTileService;
import com.topjohnwu.magisk.tile.CustomTileHelper;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -69,12 +70,12 @@ import javax.crypto.spec.DESKeySpec;
public class Utils { public class Utils {
public static int magiskVersion, remoteMagiskVersion = -1, remoteAppVersion = -1; public static int magiskVersion, remoteMagiskVersion = -1, remoteAppVersion = -1;
private static String magiskLink, magiskChangelog, appChangelog, appLink, phhLink, supersuLink; public static String magiskLink, magiskChangelog, appChangelog, appLink, phhLink, supersuLink;
private static final String TAG = "Magisk"; private static final String TAG = "Magisk";
private static final String MAGISK_PATH = "/magisk"; public static final String MAGISK_PATH = "/magisk";
private static final String MAGISK_CACHE_PATH = "/cache/magisk"; public static final String MAGISK_CACHE_PATH = "/cache/magisk";
private static final String UPDATE_JSON = "https://raw.githubusercontent.com/topjohnwu/MagiskManager/updates/magisk_update.json"; public static final String UPDATE_JSON = "https://raw.githubusercontent.com/topjohnwu/MagiskManager/updates/magisk_update.json";
public static boolean fileExist(String path) { public static boolean fileExist(String path) {
List<String> ret; List<String> ret;
@ -195,15 +196,18 @@ public class Utils {
} }
public static void SetupQuickSettingsTile(Context mContext) { public static void SetupQuickSettingsTile(Context mContext) {
Log.d("Magisk","Utils: SetupQuickSettings called");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Intent serviceIntent = new Intent(mContext, QuickSettingTileService.class); Intent serviceIntent = new Intent(mContext, QuickSettingTileService.class);
mContext.startService(serviceIntent); mContext.startService(serviceIntent);
} }
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
Log.d("Magisk","Utils: Marshmallow build detected");
String mLabelString; String mLabelString;
int mRootIcon = R.drawable.root; int mRootIcon = R.drawable.root;
int mAutoRootIcon = R.drawable.ic_autoroot; int mAutoRootIcon = R.drawable.ic_autoroot;
int mRootsState = CheckRootsState(mContext); int mRootsState = CheckRootsState(mContext);
Log.d("Magisk","Utils: Root State returned as " + mRootsState);
final Intent enableBroadcast = new Intent(PrivateBroadcastReceiver.ACTION_ENABLEROOT); final Intent enableBroadcast = new Intent(PrivateBroadcastReceiver.ACTION_ENABLEROOT);
final Intent disableBroadcast = new Intent(PrivateBroadcastReceiver.ACTION_DISABLEROOT); final Intent disableBroadcast = new Intent(PrivateBroadcastReceiver.ACTION_DISABLEROOT);
final Intent autoBroadcast = new Intent(PrivateBroadcastReceiver.ACTION_AUTOROOT); final Intent autoBroadcast = new Intent(PrivateBroadcastReceiver.ACTION_AUTOROOT);
@ -232,12 +236,13 @@ public class Utils {
break; break;
} }
Intent tileConfigurationIntent = new BroadcastTileIntentBuilder(mContext, "com.magisk.ROOT_TILE") Intent tileConfigurationIntent = new BroadcastTileIntentBuilder(mContext, "ROOT")
.setLabel(mLabelString) .setLabel(mLabelString)
.setIconResource(mIcon) .setIconResource(mIcon)
.setOnClickBroadcast(intent) .setOnClickBroadcast(intent)
.build(); .build();
mContext.sendBroadcast(tileConfigurationIntent); mContext.sendBroadcast(tileConfigurationIntent);
} }
} }
@ -248,7 +253,7 @@ public class Utils {
if (autoRootEnabled(mContext)) { if (autoRootEnabled(mContext)) {
return 2; return 2;
} else { } else {
if (rootStatus()) { if (rootEnabled()) {
return 1; return 1;
} else { } else {
@ -557,21 +562,7 @@ public class Utils {
} }
} }
public static boolean rootStatus() {
try {
String rootStatus = Shell.su("getprop magisk.root").toString();
String fuckyeah = Shell.sh("which su").toString();
Log.d("Magisk", "Utils: Rootstatus Checked, " + rootStatus + " and " + fuckyeah);
if (rootStatus.contains("0") && !fuckyeah.contains("su")) {
return false;
} else {
return true;
}
} catch (NullPointerException e) {
e.printStackTrace();
return false;
}
}
public static boolean isMyServiceRunning(Class<?> serviceClass, Context context) { public static boolean isMyServiceRunning(Class<?> serviceClass, Context context) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);