[app] Remove INTERACT_ACROSS_USERS permission (#938)

This commit is contained in:
vvb2060 2021-08-18 23:40:10 +08:00 committed by GitHub
parent da7d3e5b78
commit f1fa90eb38
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 146 additions and 16 deletions

View File

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

View File

@ -23,9 +23,6 @@
package="org.lsposed.manager">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.INTERACT_ACROSS_USERS"
tools:ignore="ProtectedPermissions" />
<uses-permission
android:name="android.permission.WRITE_SECURE_SETTINGS"
tools:ignore="ProtectedPermissions" />
@ -57,7 +54,7 @@
</activity>
<activity
android:name=".ui.activity.CrashReportActivity"
android:process=":error_activity" />
android:process=":error" />
<receiver android:name=".receivers.ServiceReceiver" />

View File

@ -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<PackageInfo, Bitmap> {
@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<Bitmap> 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<Bitmap> {
@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<Bitmap> getDataClass() {
return Bitmap.class;
}
@NonNull
@Override
public DataSource getDataSource() {
return DataSource.LOCAL;
}
}
public static class Factory implements ModelLoaderFactory<PackageInfo, Bitmap> {
@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<PackageInfo, Bitmap> build(
@NonNull MultiModelLoaderFactory multiFactory) {
return new AppIconModelLoader(mIconSize, mShrinkNonAdaptiveIcons, mContext);
}
@Override
public void teardown() {
}
}
}

View File

@ -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

View File

@ -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 {

View File

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

View File

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