OSDN Git Service

Abstract logic for setting components enabled / disabled
[android-x86/packages-apps-Taskbar.git] / app / src / main / java / com / farmerbb / taskbar / util / U.java
index d6aa1f1..4d922d6 100644 (file)
@@ -26,9 +26,11 @@ import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.app.Service;
 import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
@@ -69,6 +71,7 @@ import com.farmerbb.taskbar.activity.InvisibleActivityFreeform;
 import com.farmerbb.taskbar.activity.MainActivity;
 import com.farmerbb.taskbar.activity.TouchAbsorberActivity;
 import com.farmerbb.taskbar.activity.dark.ContextMenuActivityDark;
+import com.farmerbb.taskbar.content.TaskbarIntent;
 import com.farmerbb.taskbar.service.DashboardService;
 import com.farmerbb.taskbar.service.NotificationService;
 import com.farmerbb.taskbar.service.PowerMenuService;
@@ -203,9 +206,7 @@ public class U {
     }
 
     public static void sendAccessibilityAction(Context context, int action, Runnable onComplete) {
-        ComponentName component = new ComponentName(context, PowerMenuService.class);
-        context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
-                PackageManager.DONT_KILL_APP);
+        setComponentEnabled(context, PowerMenuService.class, true);
 
         boolean isAccessibilityServiceEnabled = isAccessibilityServiceEnabled(context);
 
@@ -229,9 +230,9 @@ public class U {
             }
 
             new Handler().postDelayed(() -> {
-                Intent intent = new Intent("com.farmerbb.taskbar.ACCESSIBILITY_ACTION");
+                Intent intent = new Intent(TaskbarIntent.ACTION_ACCESSIBILITY_ACTION);
                 intent.putExtra("action", action);
-                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+                sendBroadcast(context, intent);
 
                 try {
                     Settings.Secure.putString(context.getContentResolver(),
@@ -242,9 +243,9 @@ public class U {
                 if(onComplete != null) onComplete.run();
             }, 100);
         } else if(isAccessibilityServiceEnabled) {
-            Intent intent = new Intent("com.farmerbb.taskbar.ACCESSIBILITY_ACTION");
+            Intent intent = new Intent(TaskbarIntent.ACTION_ACCESSIBILITY_ACTION);
             intent.putExtra("action", action);
-            LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+            sendBroadcast(context, intent);
 
             if(onComplete != null) onComplete.run();
         } else {
@@ -254,7 +255,7 @@ public class U {
                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
 
                 try {
-                    startActivityMaximized(context, intent);
+                    context.startActivity(intent, getActivityOptionsBundle(context, ApplicationType.APP_PORTRAIT, null));
                 } catch (IllegalArgumentException | SecurityException e) { /* Gracefully fail */ }
             });
         }
@@ -399,7 +400,7 @@ public class U {
     }
 
     public static void stopFreeformHack(Context context) {
-        LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.FINISH_FREEFORM_ACTIVITY"));
+        sendBroadcast(context, TaskbarIntent.ACTION_FINISH_FREEFORM_ACTIVITY);
 
         if(isOverridingFreeformHack(context, false)) {
             FreeformHackHelper helper = FreeformHackHelper.getInstance();
@@ -468,10 +469,11 @@ public class U {
                 launchShortcut(context, shortcut, bundle, onError);
         });
 
-        if(shouldCollapse(context, true))
-            LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_TASKBAR"));
-        else
-            LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
+        if(shouldCollapse(context, true)) {
+            sendBroadcast(context, TaskbarIntent.ACTION_HIDE_TASKBAR);
+        } else {
+            sendBroadcast(context, TaskbarIntent.ACTION_HIDE_START_MENU);
+        }
     }
 
     private static Bundle launchMode1(Context context, ApplicationType type, View view, int factor) {
@@ -579,7 +581,7 @@ public class U {
     }
 
     private static void prepareToStartActivity(Context context, boolean openInNewWindow, Runnable runnable) {
-        LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_CONTEXT_MENU"));
+        sendBroadcast(context, TaskbarIntent.ACTION_HIDE_CONTEXT_MENU);
 
         if(!FreeformHackHelper.getInstance().isTouchAbsorberActive()
                 && shouldLaunchTouchAbsorber(context)) {
@@ -1048,7 +1050,7 @@ public class U {
                 else
                     stackId = getFullscreenWindowModeId();
                 break;
-            case GAME:
+            case APP_FULLSCREEN:
                 stackId = getFullscreenWindowModeId();
                 break;
             case FREEFORM_HACK:
@@ -1142,7 +1144,7 @@ public class U {
     @SuppressLint("SwitchIntDef")
     private static ApplicationType getApplicationType(Context context, AppEntry entry) {
         if(isGame(context, entry.getPackageName()))
-            return ApplicationType.GAME;
+            return ApplicationType.APP_FULLSCREEN;
 
         try {
             ActivityInfo info = context.getPackageManager().getActivityInfo(
@@ -1204,15 +1206,7 @@ public class U {
         if(context.getPackageName().equals(BuildConfig.ANDROIDX86_APPLICATION_ID))
             return true;
 
-        PackageManager pm = context.getPackageManager();
-        try {
-            pm.getPackageInfo(BuildConfig.SUPPORT_APPLICATION_ID, 0);
-            return pm.checkSignatures(BuildConfig.SUPPORT_APPLICATION_ID, context.getPackageName()) == PackageManager.SIGNATURE_MATCH
-                    && context.getPackageName().equals(BuildConfig.BASE_APPLICATION_ID)
-                    && isSystemApp(context);
-        } catch (PackageManager.NameNotFoundException e) {
-            return false;
-        }
+        return hasSupportLibrary(context, 0);
     }
 
     public static boolean hasSupportLibrary(Context context, int minVersion) {
@@ -1295,7 +1289,7 @@ public class U {
             startTaskbarService(context, false);
         }
 
-        LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.RESTART"));
+        sendBroadcast(context, TaskbarIntent.ACTION_RESTART);
     }
 
     public static void restartNotificationService(Context context) {
@@ -1310,18 +1304,38 @@ public class U {
     }
 
     public static void showHideNavigationBar(Context context, boolean show) {
+        if(!isDesktopModeActive(context)
+                && !isBlissOs(context)
+                && !hasSupportLibrary(context, 7)) {
+            return;
+        }
+
+        int displayID = getDisplayID();
+        int value = show ? 0 : getNavbarHeight(context) * -1;
+
+        if(hasWriteSecureSettingsPermission(context)) {
+            try {
+                setOverscan(displayID, value);
+                return;
+            } catch (Exception e) {
+                // Fallback to next method
+            }
+        }
+
         if(hasSupportLibrary(context, 7)) {
             Intent intent = new Intent(BuildConfig.SUPPORT_APPLICATION_ID + ".CHANGE_OVERSCAN");
             intent.setPackage(BuildConfig.SUPPORT_APPLICATION_ID);
 
-            intent.putExtra("display_id", getDisplayID());
-            intent.putExtra("value", show ? 0 : getNavbarHeight(context) * -1);
+            intent.putExtra("display_id", displayID);
+            intent.putExtra("value", value);
 
             context.sendBroadcast(intent);
             return;
         }
 
         // Show or hide the system navigation bar on Bliss-x86
+        if(!isBlissOs(context)) return;
+
         try {
             if(getCurrentApiVersion() >= 28.0f)
                 Settings.Secure.putInt(context.getContentResolver(), "navigation_bar_visible", show ? 1 : 0);
@@ -1815,7 +1829,11 @@ public class U {
     }
 
     public static boolean isDesktopModeSupported(Context context) {
-        if(isLauncherPermanentlyEnabled(context)) return false;
+        if(isLauncherPermanentlyEnabled(context)
+                || isLibrary(context)
+                || !BuildConfig.DEBUG // TODO remove this line
+                || isChromeOs(context))
+            return false;
 
         return Build.VERSION.SDK_INT > Build.VERSION_CODES.P
                 && context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS);
@@ -1843,10 +1861,75 @@ public class U {
                 && !pref.getBoolean("launcher", false);
     }
 
+    // TODO remove this in favor of the existing getDisplayID method?
     public static int getExternalDisplayID(Context context) {
         DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
         Display[] displays = dm.getDisplays();
 
         return displays[displays.length - 1].getDisplayId();
     }
+
+    @SuppressLint("PrivateApi")
+    private static Object getWindowManagerService() throws Exception {
+        return Class.forName("android.view.WindowManagerGlobal")
+                .getMethod("getWindowManagerService")
+                .invoke(null);
+    }
+
+    @SuppressLint("PrivateApi")
+    private static void setDensity(int displayID, String value) throws Exception {
+        // From android.os.UserHandle
+        final int USER_CURRENT_OR_SELF = -3;
+
+        if(value.equals("reset")) {
+            Class.forName("android.view.IWindowManager")
+                    .getMethod("clearForcedDisplayDensityForUser", int.class, int.class)
+                    .invoke(getWindowManagerService(), displayID, USER_CURRENT_OR_SELF);
+        } else {
+            int density = Integer.parseInt(value);
+
+            Class.forName("android.view.IWindowManager")
+                    .getMethod("setForcedDisplayDensityForUser", int.class, int.class, int.class)
+                    .invoke(getWindowManagerService(), displayID, density, USER_CURRENT_OR_SELF);
+        }
+    }
+
+    @SuppressLint("PrivateApi")
+    private static void setOverscan(int displayID, int value) throws Exception {
+        Class.forName("android.view.IWindowManager")
+                .getMethod("setOverscan", int.class, int.class, int.class, int.class, int.class)
+                .invoke(getWindowManagerService(), displayID, 0, 0, 0, value);
+    }
+
+    public static void registerReceiver(Context context, BroadcastReceiver receiver, String... actions) {
+        unregisterReceiver(context, receiver);
+
+        IntentFilter intentFilter = new IntentFilter();
+        for(String action : actions) {
+            intentFilter.addAction(action);
+        }
+
+        LocalBroadcastManager.getInstance(context).registerReceiver(receiver, intentFilter);
+    }
+
+    public static void unregisterReceiver(Context context, BroadcastReceiver receiver) {
+        LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);
+    }
+
+    public static void sendBroadcast(Context context, String action) {
+       sendBroadcast(context, new Intent(action));
+    }
+
+    public static void sendBroadcast(Context context, Intent intent) {
+        LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+    }
+
+    @SuppressWarnings("rawtypes")
+    public static void setComponentEnabled(Context context, Class clazz, boolean enabled) {
+        ComponentName component = new ComponentName(context, clazz);
+        context.getPackageManager().setComponentEnabledSetting(component,
+                enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+                        : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                PackageManager.DONT_KILL_APP);
+    }
 }