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 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"); }