/* * Copyright (C) 2015 Peter Gregus for GravityBox Project (C3C076@xda) * 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 * * http://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 tk.wasdennnoch.androidn_ify.utils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import tk.wasdennnoch.androidn_ify.XposedHook; import static tk.wasdennnoch.androidn_ify.XposedHook.PACKAGE_OWN; import static tk.wasdennnoch.androidn_ify.XposedHook.PACKAGE_SYSTEMUI; public class PermissionGranter { public static final String TAG = "PermissionGranter"; private static final String CLASS_PACKAGE_MANAGER_SERVICE = "com.android.server.pm.PackageManagerService"; private static final String CLASS_PACKAGE_PARSER_PACKAGE = "android.content.pm.PackageParser.Package"; private static final String PERM_BATTERY_STATS = "android.permission.BATTERY_STATS"; private static final String PERM_MANAGE_USERS = "android.permission.MANAGE_USERS"; private static Map<String, List<String>> mPerms; static { mPerms = new HashMap<>(); List<String> systemUiPerms = new ArrayList<>(); systemUiPerms.add(PERM_BATTERY_STATS); mPerms.put(PACKAGE_SYSTEMUI, systemUiPerms); List<String> ownPerms = new ArrayList<>(); ownPerms.add(PERM_MANAGE_USERS); mPerms.put(PACKAGE_OWN, ownPerms); } public static void initAndroid(final ClassLoader classLoader) { try { final Class<?> pmServiceClass = XposedHelpers.findClass(CLASS_PACKAGE_MANAGER_SERVICE, classLoader); XposedHelpers.findAndHookMethod(pmServiceClass, "grantPermissionsLPw", CLASS_PACKAGE_PARSER_PACKAGE, boolean.class, String.class, new XC_MethodHook() { @SuppressWarnings("unchecked") @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { final String pkgName = (String) XposedHelpers.getObjectField(param.args[0], "packageName"); if (ConfigUtils.M && mPerms.containsKey(pkgName)) grantPermsMm(param, mPerms.get(pkgName)); } }); } catch (Throwable t) { XposedBridge.log(t); } } private static void grantPermsMm(XC_MethodHook.MethodHookParam param, List<String> neededPermissions) { final Object extras = XposedHelpers.getObjectField(param.args[0], "mExtras"); final Object ps = XposedHelpers.callMethod(extras, "getPermissionsState"); final Object settings = XposedHelpers.getObjectField(param.thisObject, "mSettings"); final Object permissions = XposedHelpers.getObjectField(settings, "mPermissions"); for (String perm : neededPermissions) { if (!(boolean) XposedHelpers.callMethod(ps, "hasInstallPermission", perm)) { final Object pAccessPerm = XposedHelpers.callMethod(permissions, "get", perm); int ret = (int) XposedHelpers.callMethod(ps, "grantInstallPermission", pAccessPerm); XposedHook.logD(TAG, "Permission added: " + pAccessPerm + "; ret=" + ret); } } } }