[app] Remove INTERACT_ACROSS_USERS permission (#938)
This commit is contained in:
parent
da7d3e5b78
commit
f1fa90eb38
|
|
@ -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"))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue