package me.piebridge.brevent.override; import android.app.ActivityManager; import android.app.AppOpsManager; import android.hardware.usb.UsbManager; import android.os.Process; import android.os.UserHandle; import android.provider.Settings; import android.util.Log; import java.util.List; /** * Created by thom on 2017/2/22. */ public class HideApiOverride { private static final String TAG = "BreventServer"; /** * deprecated in n */ public static final int USER_OWNER = getUserOwner(); public static final int OP_NONE = getOpNone(); public static final int OP_ACTIVATE_VPN = getOpActivateVpn(); public static final String ACTION_USB_STATE = getActionUsbState(); public static final String USB_CONNECTED = getUsbConnected(); public static final String SMS_DEFAULT_APPLICATION = getSmsDefaultApplication(); private static final int ROOT_UID = getRootUid(); private static final int SHELL_UID = getShellUid(); private static final int FLAG_PERSISTENT = getFlagPersistent(); private static final int PROCESS_STATE_CACHED_ACTIVITY = getProcessStateCachedActivity(); private static int processStateBoundForegroundService; private static int processStateForegroundService; private static final int PROCESS_STATE_SERVICE = getProcessStateService(); private static final int PROCESS_STATE_RECEIVER = getProcessStateReceiver(); private static final int PROCESS_STATE_TOP = getProcessStateTop(); private static final int RECENT_IGNORE_HOME_STACK_TASKS = getRecentIgnoreHomeStackTasks(); private static final int RECENT_INCLUDE_PROFILES = getRecentIncludeProfiles(); private HideApiOverride() { } public static int uidForData(int uid) { if (uid == ROOT_UID) { return SHELL_UID; } else { return uid; } } public static int getUserId() { return UserHandle.myUserId(); } public static int getUserId(int uid) { return UserHandle.getUserId(uid); } public static int myPpid() { return Process.myPpid(); } public static boolean isRoot(int uid) { return uid == ROOT_UID; } public static boolean isShell(int uid) { return uid == SHELL_UID; } public static int getCurrentUser() { return ActivityManager.getCurrentUser(); } public static int getProcessState(ActivityManager.RunningAppProcessInfo process) { return process.processState; } public static boolean isPersistent(ActivityManager.RunningAppProcessInfo process) { return (process.flags & FLAG_PERSISTENT) == FLAG_PERSISTENT; } public static boolean isCached(int processState) { return processState >= PROCESS_STATE_CACHED_ACTIVITY; } public static boolean isService(int processState) { return processState == getProcessStateBoundForegroundService() || processState == getProcessStateForegroundService() || processState == PROCESS_STATE_SERVICE || processState == PROCESS_STATE_RECEIVER; } public static boolean isServiceL(int processState) { return processState == PROCESS_STATE_SERVICE || processState == PROCESS_STATE_RECEIVER; } public static boolean isTop(int processState) { return processState == PROCESS_STATE_TOP; } public static long getLastActiveTime(ActivityManager.RecentTaskInfo taskInfo) { return taskInfo.lastActiveTime; } public static int getRecentFlags() { return RECENT_IGNORE_HOME_STACK_TASKS | ActivityManager.RECENT_IGNORE_UNAVAILABLE | RECENT_INCLUDE_PROFILES | getRecentIngoreDockedStackTopTask() | getRecentIngorePinnedStackTasks(); } public static int getRecentFlagsM() { return RECENT_IGNORE_HOME_STACK_TASKS | ActivityManager.RECENT_IGNORE_UNAVAILABLE | RECENT_INCLUDE_PROFILES; } public static boolean isForegroundService(int processState) { return processState == getProcessStateForegroundService(); } public static int getPackageOpsUid(Object packageOps) { return ((AppOpsManager.PackageOps) packageOps).getUid(); } public static List getPackageOpsOps(Object packageOps) { return ((AppOpsManager.PackageOps) packageOps).getOps(); } public static String getPackageOpsPackageName(Object packageOps) { return ((AppOpsManager.PackageOps) packageOps).getPackageName(); } public static int getOpEntryMode(Object opEntry) { return ((AppOpsManager.OpEntry) opEntry).getMode(); } public static long getOpEntryTime(Object opEntry) { return ((AppOpsManager.OpEntry) opEntry).getTime(); } private static int getUserOwner() { try { return UserHandle.USER_OWNER; } catch (LinkageError e) { Log.w(TAG, "Can't find UserHandle.USER_OWNER"); return 0; } } private static int getOpNone() { try { return AppOpsManager.OP_NONE; } catch (LinkageError e) { Log.w(TAG, "Can't find AppOpsManager.OP_NONE"); return -1; } } private static int getOpActivateVpn() { try { return AppOpsManager.OP_ACTIVATE_VPN; } catch (LinkageError e) { Log.w(TAG, "Can't find AppOpsManager.OP_ACTIVATE_VPN"); return 47; } } private static String getActionUsbState() { try { return UsbManager.ACTION_USB_STATE; } catch (LinkageError e) { Log.w(TAG, "Can't find UsbManager.ACTION_USB_STATE"); return "android.hardware.usb.action.USB_STATE"; } } private static String getUsbConnected() { try { return UsbManager.USB_CONNECTED; } catch (LinkageError e) { Log.w(TAG, "Can't find UsbManager.USB_CONNECTED"); return "connected"; } } private static String getCallMethodUserKey() { try { return Settings.CALL_METHOD_USER_KEY; } catch (LinkageError e) { Log.w(TAG, "Can't find Settings.CALL_METHOD_USER_KEY"); return "_user"; } } private static String getCallMethodGetSecure() { try { return Settings.CALL_METHOD_GET_SECURE; } catch (LinkageError e) { Log.w(TAG, "Can't find Settings.CALL_METHOD_GET_SECURE"); return "GET_secure"; } } private static String getCallMethodGetGlobal() { try { return Settings.CALL_METHOD_GET_GLOBAL; } catch (LinkageError e) { Log.w(TAG, "Can't find Settings.CALL_METHOD_GET_GLOBAL"); return "GET_global"; } } private static String getSmsDefaultApplication() { try { return Settings.Secure.SMS_DEFAULT_APPLICATION; } catch (LinkageError e) { Log.w(TAG, "Can't find Settings.Secure.SMS_DEFAULT_APPLICATION"); return "sms_default_application"; } } public static String getDialerDefaultApplication() { try { return Settings.Secure.DIALER_DEFAULT_APPLICATION; } catch (LinkageError e) { Log.w(TAG, "Can't find Settings.Secure.DIALER_DEFAULT_APPLICATION"); return "dialer_default_application"; } } public static String getAssistant() { try { return Settings.Secure.ASSISTANT; } catch (LinkageError e) { Log.w(TAG, "Can't find Settings.Secure.ASSISTANT"); return "assistant"; } } public static String getVoiceInteractionService() { try { return Settings.Secure.VOICE_INTERACTION_SERVICE; } catch (LinkageError e) { Log.w(TAG, "Can't find Settings.Secure.VOICE_INTERACTION_SERVICE"); return "voice_interaction_service"; } } private static int getRootUid() { try { return Process.ROOT_UID; } catch (LinkageError e) { Log.w(TAG, "Can't find Process.ROOT_UID"); return 0; } } private static int getShellUid() { try { return Process.SHELL_UID; } catch (LinkageError e) { Log.w(TAG, "Can't find Process.SHELL_UID"); return 2000; } } private static int getFlagPersistent() { try { return ActivityManager.RunningAppProcessInfo.FLAG_PERSISTENT; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.FLAG_PERSISTENT"); return 1 << 1; } } private static int getProcessStateCachedActivity() { try { return ActivityManager.PROCESS_STATE_CACHED_ACTIVITY; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.PROCESS_STATE_CACHED_ACTIVITY"); return 14; } } private static int getProcessStateBoundForegroundService() { if (processStateBoundForegroundService == 0) { processStateBoundForegroundService = getProcessStateBoundForegroundServiceM(); } return processStateBoundForegroundService; } private static int getProcessStateBoundForegroundServiceM() { try { return ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE"); return 3; } } private static int getProcessStateForegroundService() { if (processStateForegroundService == 0) { processStateForegroundService = getProcessStateForegroundServiceM(); } return processStateForegroundService; } private static int getProcessStateForegroundServiceM() { try { return ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE"); return 4; } } private static int getProcessStateService() { try { return ActivityManager.PROCESS_STATE_SERVICE; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.PROCESS_STATE_SERVICE"); return 10; } } private static int getProcessStateReceiver() { try { return ActivityManager.PROCESS_STATE_RECEIVER; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.PROCESS_STATE_RECEIVER"); return 11; } } private static int getProcessStateTop() { try { return ActivityManager.PROCESS_STATE_TOP; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.PROCESS_STATE_TOP"); return 2; } } private static int getRecentIgnoreHomeStackTasks() { try { return ActivityManager.RECENT_IGNORE_HOME_STACK_TASKS; } catch (LinkageError e) { // do nothing } try { return ActivityManager.RECENT_IGNORE_HOME_AND_RECENTS_STACK_TASKS; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.RECENT_IGNORE_HOME_STACK_TASKS" + " nor ActivityManager.RECENT_IGNORE_HOME_AND_RECENTS_STACK_TASKS"); } return 0x0008; } private static int getRecentIncludeProfiles() { try { return ActivityManager.RECENT_INCLUDE_PROFILES; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.RECENT_INCLUDE_PROFILES"); return 0x0004; } } private static int getRecentIngorePinnedStackTasks() { try { return ActivityManager.RECENT_INGORE_PINNED_STACK_TASKS; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.RECENT_INGORE_PINNED_STACK_TASKS"); return 0x0020; } } private static int getRecentIngoreDockedStackTopTask() { try { return ActivityManager.RECENT_INGORE_DOCKED_STACK_TOP_TASK; } catch (LinkageError e) { Log.w(TAG, "Can't find ActivityManager.RECENT_INGORE_DOCKED_STACK_TOP_TASK"); return 0x0010; } } }