Skip to content

Commit

Permalink
feat: Init self hook & xpref
Browse files Browse the repository at this point in the history
* xpref still not usable
  • Loading branch information
deltazefiro committed Feb 19, 2024
1 parent e356fd4 commit 32279f8
Show file tree
Hide file tree
Showing 9 changed files with 157 additions and 35 deletions.
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@
android:value="93" />
<meta-data
android:name="xposedscope"
android:resource="@array/xposed_scope" />
android:value="android" />

</application>

Expand Down
1 change: 0 additions & 1 deletion app/src/main/java/deltazero/amarok/AmarokActivity.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package deltazero.amarok;

import android.content.Intent;
import android.os.Build;

import androidx.appcompat.app.AppCompatActivity;

Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/deltazero/amarok/AmarokApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import deltazero.amarok.receivers.ScreenStatusReceiver;
import deltazero.amarok.utils.AppCenterUtil;
import deltazero.amarok.utils.XHideUtil;
import jonathanfinerty.once.Once;

public class AmarokApplication extends Application {
Expand All @@ -31,6 +32,9 @@ public void onCreate() {
screenStatusIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(new ScreenStatusReceiver(), screenStatusIntentFilter);

// Initialise XHideUtil
XHideUtil.init(this);

// Start PanicButton service
QuickHideService.startService(this);

Expand Down
10 changes: 10 additions & 0 deletions app/src/main/java/deltazero/amarok/PrefMgr.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public static SharedPreferences getPrefs() {
public static final String SHOW_WELCOME = "showWelcome";
public static final String ENABLE_AUTO_HIDE = "enableAutoHide";
public static final String AUTO_HIDE_DELAY = "autoHideDelay";
public static final String ENABLE_X_HIDE = "enableXHide";

public static Set<String> getHideFilePath() {
return mPrefs.getStringSet(HIDE_FILE_PATH, new HashSet<>());
Expand Down Expand Up @@ -278,4 +279,13 @@ public static void setAutoHideDelay(int autoHideDelay) {
mPrefEditor.putInt(AUTO_HIDE_DELAY, autoHideDelay);
mPrefEditor.apply();
}

public static boolean isXHideEnabled() {
return mPrefs.getBoolean(ENABLE_X_HIDE, false);
}

public static void setXHideEnabled(boolean enableXHide) {
mPrefEditor.putBoolean(ENABLE_X_HIDE, enableXHide);
mPrefEditor.apply();
}
}
77 changes: 77 additions & 0 deletions app/src/main/java/deltazero/amarok/utils/XHideUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package deltazero.amarok.utils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

import java.util.Objects;

import deltazero.amarok.Hider;
import deltazero.amarok.PrefMgr;
import deltazero.amarok.xposed.utils.XPref;

public class XHideUtil {
private static final String TAG = "XHideUtil";

private static SharedPreferences xpref;
private static SharedPreferences.Editor xprefEditor;
private static SharedPreferences.OnSharedPreferenceChangeListener hidePkgNamesChangeListener;

public static boolean isModuleActive = false; /* Hooked by module */
public static boolean isAvailable = false;
public static int xposedVersion = 0; /* Hooked by module */

public static boolean isXHideAvailable() {
return isAvailable;
}

@SuppressLint("WorldReadableFiles")
public static void init(Context context) {

if (!isModuleActive) {
Log.i(TAG, "Xposed module not active");
return;
} else {
Log.i(TAG, "Xposed module active, version = " + xposedVersion);
}

try {
xpref = context.getSharedPreferences(XPref.XPREF_PATH, Context.MODE_WORLD_READABLE);
} catch (SecurityException ignored) {
// The new XSharedPreferences is not enabled or module's not loading
Log.w(TAG, "Unsupported Xposed framework. Disabling XHide");
return;
}

xprefEditor = xpref.edit();

// Initialize the XPref with the current values
xprefEditor.putStringSet(XPref.HIDE_PKG_NAMES, PrefMgr.getHideApps());
xprefEditor.putBoolean(XPref.IS_HIDDEN, Hider.getState() == Hider.State.HIDDEN);
xprefEditor.putBoolean(XPref.ENABLE_X_HIDE, PrefMgr.isXHideEnabled());
xprefEditor.commit();

// Setup listeners for changes in the preferences
hidePkgNamesChangeListener = (sharedPreferences, key) -> {
if (Objects.equals(key, PrefMgr.HIDE_PKG_NAMES)) {
Log.d(TAG, "Hide package name changed.");
xprefEditor.putStringSet(XPref.HIDE_PKG_NAMES, PrefMgr.getHideApps());
xprefEditor.commit();
} else if (Objects.equals(key, PrefMgr.ENABLE_X_HIDE)) {
Log.d(TAG, "XHide enabled changed.");
xprefEditor.putBoolean(XPref.ENABLE_X_HIDE, PrefMgr.isXHideEnabled());
xprefEditor.commit();
}
};
PrefMgr.getPrefs().registerOnSharedPreferenceChangeListener(hidePkgNamesChangeListener);
Hider.state.observeForever(state -> {
Log.d(TAG, "Hider state changed.");
xprefEditor.putBoolean(XPref.IS_HIDDEN, state == Hider.State.HIDDEN);
xprefEditor.commit();
});

Log.i(TAG, "Xposed module activated.");
isAvailable = true;
}
}
37 changes: 25 additions & 12 deletions app/src/main/java/deltazero/amarok/xposed/XposedEntry.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import deltazero.amarok.BuildConfig;
import deltazero.amarok.xposed.hooks.HookTarget33;
import deltazero.amarok.xposed.utils.ParceledListSliceUtil;
import deltazero.amarok.xposed.utils.XPref;
Expand All @@ -21,29 +24,39 @@ public class XposedEntry implements IXposedHookLoadPackage, IXposedHookZygoteIni

@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
if (!lpparam.packageName.equals("android")) return;
initUtils(lpparam);
loadHooks();
EzXHelper.initHandleLoadPackage(lpparam);
switch (lpparam.packageName) {
case BuildConfig.APPLICATION_ID -> loadSelfHooks(lpparam);
case "android" -> {
ParceledListSliceUtil.init();
XPref.init();
loadSystemHooks();
}
}
}

@Override
public void initZygote(StartupParam startupParam) {
EzXHelper.initZygote(startupParam);
}

private void initUtils(XC_LoadPackage.LoadPackageParam lpparam) {
EzXHelper.initHandleLoadPackage(lpparam);
EzXHelper.setLogTag(TAG);
EzXHelper.setToastTag(TAG);
ParceledListSliceUtil.init();
XPref.init();
}

private void loadHooks() {
Log.i("Loading hooks...", null);
private void loadSystemHooks() {
Log.i("Loading system hooks...", null);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
new HookTarget33().init();
} else {
Log.e("Unsupported Android version. Skip loading hooks.", null);
}
Log.i("Xposed hooks loaded.", null);
Log.i("System hooks loaded.", null);
}

public void loadSelfHooks(XC_LoadPackage.LoadPackageParam lpparam) {
Log.i("Loading self hooks...", null);
var c = XposedHelpers.findClass("deltazero.amarok.utils.XHideUtil", lpparam.classLoader);
XposedHelpers.setStaticBooleanField(c, "isModuleActive", true);
XposedHelpers.setStaticIntField(c, "xposedVersion", XposedBridge.getXposedVersion());
Log.i("Self hooks loaded.", null);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package deltazero.amarok.xposed.hooks;

import static deltazero.amarok.xposed.utils.XPref.isXHideEnabled;
import static deltazero.amarok.xposed.utils.XPref.isXHideActive;
import static deltazero.amarok.xposed.utils.XPref.shouldHide;

import android.content.pm.ApplicationInfo;
Expand Down Expand Up @@ -47,10 +47,12 @@ public final ParceledListSlice<PackageInfo> getInstalledPackages(

unhook1 = HookFactory.createMethodHook(m1, hookFactory -> hookFactory.after(param -> {
try {
if (!isXHideEnabled()) return;
boolean isXHideActive = isXHideActive();
long flags = (Long) param.args[0];
int userId = (Integer) param.args[1];
Log.i("getInstalledPackages called: flags = " + flags + ", userId = " + userId, null);
Log.i("getInstalledPackages called: flags = " + flags
+ ", isXHideActive = " + isXHideActive, null);

if (!isXHideActive) return;

List<PackageInfo> packages = ParceledListSliceUtil.sliceToList(param.getResult());
var filteredPackages = packages.stream()
Expand All @@ -74,10 +76,10 @@ public final ParceledListSlice<ApplicationInfo> getInstalledApplications(

unhook2 = HookFactory.createMethodHook(m2, hookFactory -> hookFactory.after(param -> {
try {
if (!isXHideEnabled()) return;
boolean isXHideActive = isXHideActive();
long flags = (Long) param.args[0];
int userId = (Integer) param.args[1];
Log.i("getInstalledApplications called: flags = " + flags + ", userId = " + userId, null);
Log.i("getInstalledApplications called: flags = " + flags
+ ", isXHideActive = " + isXHideActive, null);

List<ApplicationInfo> apps = ParceledListSliceUtil.sliceToList(param.getResult());
var filteredApps = apps.stream()
Expand Down
39 changes: 31 additions & 8 deletions app/src/main/java/deltazero/amarok/xposed/utils/XPref.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,54 @@
package deltazero.amarok.xposed.utils;

import com.github.kyuubiran.ezxhelper.Log;

import java.util.Collections;
import java.util.Set;

import de.robv.android.xposed.XSharedPreferences;
import deltazero.amarok.BuildConfig;

public class XPref {
public static final String XPREF_PATH = "deltazero.amarok.xposed.prefs";
private static XSharedPreferences pref;

public static final String HIDE_PKG_NAMES = "hidePkgNames";
public static final String IS_HIDDEN = "isHidden";
public static final String ENABLE_X_HIDE = "enableXHide";

private static XSharedPreferences pref;
private static Set<String> hidePkgNamesCache = Collections.emptySet();
private static boolean isHiddenCache = false;
private static boolean enableXHideCache = false;

public static void init() {
pref = new XSharedPreferences(BuildConfig.APPLICATION_ID, XPREF_PATH);
if (!pref.getFile().canRead()) pref = null;
if (!pref.getFile().canRead()) {
Log.w("No XPref found. Launch Amarok once and reboot to activate XHide.", null);
pref = null;
return;
}

assert pref != null;
//noinspection deprecation /* Supported since API 93 by LSPosed & EdXposed */
pref.registerOnSharedPreferenceChangeListener(
(sharedPreferences, ignore) -> {
Log.i("XPref changed. Refreshing cache.", null);
// Note that by design it is not possible to determine which particular preference changed
// and thus preference key in listener's callback invocation will always be null.
pref.reload();
enableXHideCache = pref.getBoolean(ENABLE_X_HIDE, false);
isHiddenCache = pref.getBoolean(IS_HIDDEN, false);
hidePkgNamesCache = pref.getStringSet(HIDE_PKG_NAMES, Collections.emptySet());
Log.i("XPref cache refreshed. isXHideActive = " + isXHideActive(), null);
}
);
}

public static boolean isXHideEnabled() {
if (pref == null) return false;
return pref.getBoolean(ENABLE_X_HIDE, false);
public static boolean isXHideActive() {
return isHiddenCache /*&& enableXHideCache*/;
}

public static boolean shouldHide(String pkgName) {
if (pref == null) return false;
return pref.getBoolean(ENABLE_X_HIDE, false)
&& pref.getStringSet(HIDE_PKG_NAMES, Collections.emptySet()).contains(pkgName);
return isHiddenCache /*&& enableXHideCache*/ && hidePkgNamesCache.contains(pkgName);
}
}
6 changes: 0 additions & 6 deletions app/src/main/res/values/arrays.xml

This file was deleted.

0 comments on commit 32279f8

Please sign in to comment.