diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 64edb782..97acfcbf 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -195,7 +195,7 @@ dependencies {
implementation("dev.rikka.rikkax.widget:borderview:1.0.1")
implementation("dev.rikka.rikkax.widget:switchbar:1.0.2")
implementation("dev.rikka.rikkax.layoutinflater:layoutinflater:1.0.1")
- implementation("me.zhanghai.android.appiconloader:appiconloader-glide:1.3.1")
+ implementation("me.zhanghai.android.appiconloader:appiconloader:1.3.1")
implementation("org.lsposed.hiddenapibypass:hiddenapibypass:2.0")
implementation(project(":manager-service"))
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e9b0eacf..54d34093 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,9 +23,6 @@
package="org.lsposed.manager">
-
@@ -57,7 +54,7 @@
+ android:process=":error" />
diff --git a/app/src/main/java/org/lsposed/manager/util/AppIconModelLoader.java b/app/src/main/java/org/lsposed/manager/util/AppIconModelLoader.java
new file mode 100644
index 00000000..50eb729b
--- /dev/null
+++ b/app/src/main/java/org/lsposed/manager/util/AppIconModelLoader.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.lsposed.manager.util;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.graphics.Bitmap;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.Px;
+
+import com.bumptech.glide.Priority;
+import com.bumptech.glide.load.DataSource;
+import com.bumptech.glide.load.Options;
+import com.bumptech.glide.load.data.DataFetcher;
+import com.bumptech.glide.load.model.ModelLoader;
+import com.bumptech.glide.load.model.ModelLoaderFactory;
+import com.bumptech.glide.load.model.MultiModelLoaderFactory;
+import com.bumptech.glide.signature.ObjectKey;
+
+import me.zhanghai.android.appiconloader.AppIconLoader;
+
+public class AppIconModelLoader implements ModelLoader {
+ @NonNull
+ private final AppIconLoader mLoader;
+ @NonNull
+ private final Context mContext;
+
+ private static final int PER_USER_RANGE = 100000;
+
+ private AppIconModelLoader(@Px int iconSize, boolean shrinkNonAdaptiveIcons,
+ @NonNull Context context) {
+ mLoader = new AppIconLoader(iconSize, shrinkNonAdaptiveIcons, context);
+ mContext = context;
+ }
+
+ @Override
+ public boolean handles(@NonNull PackageInfo model) {
+ return true;
+ }
+
+ @Nullable
+ @Override
+ public LoadData buildLoadData(@NonNull PackageInfo model, int width, int height,
+ @NonNull Options options) {
+ var warpApplicationInfo = new ApplicationInfo(model.applicationInfo);
+ warpApplicationInfo.uid = warpApplicationInfo.uid % PER_USER_RANGE;
+ var warpPackageInfo = new PackageInfo();
+ warpPackageInfo.applicationInfo = warpApplicationInfo;
+ warpPackageInfo.versionCode = model.versionCode;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ warpPackageInfo.setLongVersionCode(model.getLongVersionCode());
+ }
+ return new LoadData<>(new ObjectKey(AppIconLoader.getIconKey(warpPackageInfo, mContext)),
+ new Fetcher(mLoader, warpApplicationInfo));
+ }
+
+ private static class Fetcher implements DataFetcher {
+ @NonNull
+ private final AppIconLoader mLoader;
+ @NonNull
+ private final ApplicationInfo mApplicationInfo;
+
+ public Fetcher(@NonNull AppIconLoader loader, @NonNull ApplicationInfo applicationInfo) {
+ mLoader = loader;
+ mApplicationInfo = applicationInfo;
+ }
+
+ @Override
+ public void loadData(@NonNull Priority priority,
+ @NonNull DataCallback super Bitmap> callback) {
+ try {
+ Bitmap icon = mLoader.loadIcon(mApplicationInfo);
+ callback.onDataReady(icon);
+ } catch (Exception e) {
+ callback.onLoadFailed(e);
+ }
+ }
+
+ @Override
+ public void cleanup() {
+ }
+
+ @Override
+ public void cancel() {
+ }
+
+ @NonNull
+ @Override
+ public Class getDataClass() {
+ return Bitmap.class;
+ }
+
+ @NonNull
+ @Override
+ public DataSource getDataSource() {
+ return DataSource.LOCAL;
+ }
+ }
+
+ public static class Factory implements ModelLoaderFactory {
+ @Px
+ private final int mIconSize;
+ private final boolean mShrinkNonAdaptiveIcons;
+ @NonNull
+ private final Context mContext;
+
+ public Factory(@Px int iconSize, boolean shrinkNonAdaptiveIcons, @NonNull Context context) {
+ mIconSize = iconSize;
+ mShrinkNonAdaptiveIcons = shrinkNonAdaptiveIcons;
+ mContext = context.getApplicationContext();
+ }
+
+ @NonNull
+ @Override
+ public ModelLoader build(
+ @NonNull MultiModelLoaderFactory multiFactory) {
+ return new AppIconModelLoader(mIconSize, mShrinkNonAdaptiveIcons, mContext);
+ }
+
+ @Override
+ public void teardown() {
+ }
+ }
+}
diff --git a/app/src/main/java/org/lsposed/manager/util/AppModule.java b/app/src/main/java/org/lsposed/manager/util/AppModule.java
index fad14d6a..6fb90c74 100644
--- a/app/src/main/java/org/lsposed/manager/util/AppModule.java
+++ b/app/src/main/java/org/lsposed/manager/util/AppModule.java
@@ -34,8 +34,6 @@ import com.bumptech.glide.module.AppGlideModule;
import org.lsposed.manager.R;
-import me.zhanghai.android.appiconloader.glide.AppIconModelLoader;
-
@GlideModule
public class AppModule extends AppGlideModule {
@Override
diff --git a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java
index acdd3972..4c636730 100644
--- a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java
+++ b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java
@@ -85,7 +85,6 @@ import java.util.zip.ZipFile;
public class ConfigManager {
private static final String[] MANAGER_PERMISSIONS_TO_GRANT = new String[]{
- "android.permission.INTERACT_ACROSS_USERS",
"android.permission.WRITE_SECURE_SETTINGS"
};
@@ -327,6 +326,7 @@ public class ConfigManager {
if (info != null) {
managerUid = info.applicationInfo.uid;
manager = info.packageName;
+ grantManagerPermission();
} else {
Log.w(TAG, "manager is not installed");
}
@@ -938,7 +938,7 @@ public class ConfigManager {
return miscPath + File.separator + "prefs" + (userId == 0 ? "" : String.valueOf(userId)) + File.separator + fileName;
}
- public static void grantManagerPermission() {
+ private void grantManagerPermission() {
String managerPackageName = readText(managerPath, BuildConfig.DEFAULT_MANAGER_PACKAGE_NAME);
Arrays.stream(MANAGER_PERMISSIONS_TO_GRANT).forEach(permission -> {
try {
diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java
index 55815d62..50acf6ec 100644
--- a/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java
+++ b/core/src/main/java/org/lsposed/lspd/service/LSPosedService.java
@@ -171,7 +171,6 @@ public class LSPosedService extends ILSPosedService.Stub {
Log.d(TAG, "Manager updated");
try {
ConfigManager.getInstance().updateManager();
- ConfigManager.grantManagerPermission();
} catch (Throwable e) {
Log.e(TAG, Log.getStackTraceString(e));
}
diff --git a/core/src/main/java/org/lsposed/lspd/service/ServiceManager.java b/core/src/main/java/org/lsposed/lspd/service/ServiceManager.java
index 9ca25aa1..5a152304 100644
--- a/core/src/main/java/org/lsposed/lspd/service/ServiceManager.java
+++ b/core/src/main/java/org/lsposed/lspd/service/ServiceManager.java
@@ -115,12 +115,6 @@ public class ServiceManager {
}
});
- try {
- ConfigManager.grantManagerPermission();
- } catch (Throwable e) {
- Log.e(TAG, Log.getStackTraceString(e));
- }
-
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}