OSDN Git Service

Continue work on standalone Android 10 Desktop Mode support
authorBraden Farmer <farmerbb@gmail.com>
Sat, 4 Apr 2020 05:47:37 +0000 (23:47 -0600)
committerBraden Farmer <farmerbb@gmail.com>
Sat, 4 Apr 2020 05:49:10 +0000 (23:49 -0600)
app/src/main/java/com/farmerbb/taskbar/fragment/DesktopModeFragment.java
app/src/main/java/com/farmerbb/taskbar/service/NotificationService.java
app/src/main/java/com/farmerbb/taskbar/ui/DashboardController.java
app/src/main/java/com/farmerbb/taskbar/ui/StartMenuController.java
app/src/main/java/com/farmerbb/taskbar/ui/TaskbarController.java
app/src/main/java/com/farmerbb/taskbar/ui/UIController.java
app/src/main/java/com/farmerbb/taskbar/util/U.java

index 127fd39..d729dc3 100644 (file)
@@ -24,6 +24,7 @@ import android.os.Bundle;
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.provider.Settings;
+import android.view.Display;
 
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
@@ -32,6 +33,9 @@ import com.farmerbb.taskbar.R;
 import com.farmerbb.taskbar.activity.HSLActivity;
 import com.farmerbb.taskbar.activity.HSLConfigActivity;
 import com.farmerbb.taskbar.activity.SecondaryHomeActivity;
+import com.farmerbb.taskbar.util.ApplicationType;
+import com.farmerbb.taskbar.util.LauncherHelper;
+import com.farmerbb.taskbar.util.TaskbarIntent;
 import com.farmerbb.taskbar.util.U;
 
 public class DesktopModeFragment extends SettingsFragment {
@@ -108,13 +112,13 @@ public class DesktopModeFragment extends SettingsFragment {
     public boolean onPreferenceClick(final Preference p) {
         switch(p.getKey()) {
             case "desktop_mode":
-                U.setComponentEnabled(getActivity(), SecondaryHomeActivity.class,
-                        ((CheckBoxPreference) p).isChecked());
+                boolean isChecked = ((CheckBoxPreference) p).isChecked();
 
-                U.setComponentEnabled(getActivity(), HSLActivity.class,
-                        ((CheckBoxPreference) p).isChecked());
+                U.setComponentEnabled(getActivity(), SecondaryHomeActivity.class, isChecked);
+                U.setComponentEnabled(getActivity(), HSLActivity.class, isChecked);
+                startStopDesktopMode(isChecked);
 
-               break;
+                break;
             case "set_launcher_default":
                 try {
                     startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));
@@ -134,4 +138,24 @@ public class DesktopModeFragment extends SettingsFragment {
 
         return super.onPreferenceClick(p);
     }
+
+    @TargetApi(29)
+    private void startStopDesktopMode(boolean start) {
+        if(!start) {
+            U.sendBroadcast(getActivity(), TaskbarIntent.ACTION_KILL_HOME_ACTIVITY);
+            return;
+        }
+
+        int displayId = U.getExternalDisplayID(getActivity());
+
+        LauncherHelper helper = LauncherHelper.getInstance();
+        if(displayId == Display.DEFAULT_DISPLAY || helper.isOnSecondaryHomeScreen()) return;
+
+        helper.setOnSecondaryHomeScreen(true, displayId);
+
+        Intent intent = new Intent(getActivity(), SecondaryHomeActivity.class);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+
+        startActivity(intent, U.getActivityOptions(getActivity(), ApplicationType.APP_FULLSCREEN, null).toBundle());
+    }
 }
\ No newline at end of file
index d750eb0..32460f4 100644 (file)
@@ -27,29 +27,21 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
-import android.hardware.display.DisplayManager;
 import android.os.Build;
-import android.os.Handler;
 import android.os.IBinder;
 import android.service.quicksettings.TileService;
-import android.view.Display;
-
 import androidx.core.app.NotificationCompat;
 import androidx.core.content.ContextCompat;
 import com.farmerbb.taskbar.activity.MainActivity;
-import com.farmerbb.taskbar.activity.SecondaryHomeActivity;
 import com.farmerbb.taskbar.R;
 import com.farmerbb.taskbar.util.TaskbarIntent;
-import com.farmerbb.taskbar.util.ApplicationType;
 import com.farmerbb.taskbar.util.DependencyUtils;
 import com.farmerbb.taskbar.util.IconCache;
-import com.farmerbb.taskbar.util.LauncherHelper;
 import com.farmerbb.taskbar.util.U;
 
 public class NotificationService extends Service {
 
     private boolean isHidden = true;
-    private boolean desktopModeStarted = false;
 
     @Override
     public IBinder onBind(Intent intent) {
@@ -87,21 +79,6 @@ public class NotificationService extends Service {
         }
     };
 
-    DisplayManager.DisplayListener listener = new DisplayManager.DisplayListener() {
-        @Override
-        public void onDisplayAdded(int displayId) {
-            startDesktopMode(displayId, true);
-        }
-
-        @Override
-        public void onDisplayChanged(int displayId) {}
-
-        @Override
-        public void onDisplayRemoved(int displayId) {
-            stopDesktopMode();
-        }
-    };
-
     @TargetApi(Build.VERSION_CODES.M)
     @Override
     public void onCreate() {
@@ -179,13 +156,6 @@ public class NotificationService extends Service {
                     registerReceiver(userForegroundReceiver, new IntentFilter(Intent.ACTION_USER_FOREGROUND));
                     registerReceiver(userBackgroundReceiver, new IntentFilter(Intent.ACTION_USER_BACKGROUND));
                 }
-
-                if(U.shouldStartDesktopMode(this)) {
-                    startDesktopMode(U.getExternalDisplayID(this), false);
-
-                    DisplayManager manager = (DisplayManager) getSystemService(DISPLAY_SERVICE);
-                    manager.registerDisplayListener(listener, null);
-                }
             } else {
                 pref.edit().putBoolean("taskbar_active", false).apply();
 
@@ -217,38 +187,5 @@ public class NotificationService extends Service {
             unregisterReceiver(userForegroundReceiver);
             unregisterReceiver(userBackgroundReceiver);
         }
-
-        if(desktopModeStarted) {
-            DisplayManager manager = (DisplayManager) getSystemService(DISPLAY_SERVICE);
-            manager.unregisterDisplayListener(listener);
-
-            stopDesktopMode();
-        }
-    }
-
-    private void startDesktopMode(int displayId, boolean shouldDelay) {
-        LauncherHelper helper = LauncherHelper.getInstance();
-        if(displayId == Display.DEFAULT_DISPLAY || helper.isOnSecondaryHomeScreen()) return;
-
-        Runnable desktopModeLaunch = () -> {
-            helper.setOnSecondaryHomeScreen(true, displayId);
-
-            Intent intent = new Intent(this, SecondaryHomeActivity.class);
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
-            startActivity(intent, U.getActivityOptions(this, ApplicationType.APP_FULLSCREEN, null).toBundle());
-        };
-
-        if(shouldDelay)
-            new Handler().postDelayed(desktopModeLaunch, 500);
-        else
-            desktopModeLaunch.run();
-
-        desktopModeStarted = true;
-    }
-
-    private void stopDesktopMode() {
-        U.sendBroadcast(this, TaskbarIntent.ACTION_KILL_HOME_ACTIVITY);
-        desktopModeStarted = false;
     }
 }
index 2593dc8..30ee1e0 100644 (file)
@@ -56,6 +56,7 @@ import android.widget.Toast;
 
 import com.farmerbb.taskbar.R;
 import com.farmerbb.taskbar.activity.DashboardActivity;
+import com.farmerbb.taskbar.activity.SecondaryHomeActivity;
 import com.farmerbb.taskbar.activity.dark.DashboardActivityDark;
 import com.farmerbb.taskbar.util.TaskbarIntent;
 import com.farmerbb.taskbar.util.TaskbarPosition;
@@ -76,12 +77,11 @@ import static com.farmerbb.taskbar.util.TaskbarPosition.POSITION_TOP_RIGHT;
 import static com.farmerbb.taskbar.util.TaskbarPosition.POSITION_TOP_VERTICAL_LEFT;
 import static com.farmerbb.taskbar.util.TaskbarPosition.POSITION_TOP_VERTICAL_RIGHT;
 
-public class DashboardController implements UIController {
+public class DashboardController extends UIController {
 
     private AppWidgetManager mAppWidgetManager;
     private AppWidgetHost mAppWidgetHost;
 
-    private Context context;
     private LinearLayout layout;
 
     private SparseArray<DashboardCell> cells = new SparseArray<>();
@@ -164,24 +164,17 @@ public class DashboardController implements UIController {
     };
 
     public DashboardController(Context context) {
-        this.context = context;
+        super(context);
     }
 
     @TargetApi(Build.VERSION_CODES.M)
     @Override
     public void onCreateHost(UIHost host) {
         SharedPreferences pref = U.getSharedPreferences(context);
-        if(pref.getBoolean("dashboard", context.getResources().getBoolean(R.bool.tb_def_dashboard))) {
-            if(pref.getBoolean("taskbar_active", false) || LauncherHelper.getInstance().isOnHomeScreen()) {
-                if(U.canDrawOverlays(context))
-                    drawDashboard(host);
-                else {
-                    pref.edit().putBoolean("taskbar_active", false).apply();
-
-                    host.terminate();
-                }
-            } else host.terminate();
-        } else host.terminate();
+        if(pref.getBoolean("dashboard", context.getResources().getBoolean(R.bool.tb_def_dashboard)))
+            init(context, host, () -> drawDashboard(host));
+        else
+            host.terminate();
     }
 
     @SuppressLint("RtlHardcoded")
index 91c5531..6b19ac4 100644 (file)
@@ -57,6 +57,7 @@ import android.widget.TextView;
 import com.farmerbb.taskbar.R;
 import com.farmerbb.taskbar.activity.InvisibleActivity;
 import com.farmerbb.taskbar.activity.InvisibleActivityAlt;
+import com.farmerbb.taskbar.activity.SecondaryHomeActivity;
 import com.farmerbb.taskbar.adapter.StartMenuAdapter;
 import com.farmerbb.taskbar.util.TaskbarIntent;
 import com.farmerbb.taskbar.util.TaskbarPosition;
@@ -85,9 +86,8 @@ import static com.farmerbb.taskbar.util.TaskbarPosition.POSITION_TOP_RIGHT;
 import static com.farmerbb.taskbar.util.TaskbarPosition.POSITION_TOP_VERTICAL_LEFT;
 import static com.farmerbb.taskbar.util.TaskbarPosition.POSITION_TOP_VERTICAL_RIGHT;
 
-public class StartMenuController implements UIController {
+public class StartMenuController extends UIController {
 
-    private Context context;
     private StartMenuLayout layout;
     private GridView startMenu;
     private SearchView searchView;
@@ -169,7 +169,7 @@ public class StartMenuController implements UIController {
     };
 
     public StartMenuController(Context context) {
-        this.context = context;
+        super(context);
     }
 
     @TargetApi(Build.VERSION_CODES.M)
@@ -177,16 +177,7 @@ public class StartMenuController implements UIController {
     public void onCreateHost(UIHost host) {
         hasHardwareKeyboard = context.getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS;
 
-        SharedPreferences pref = U.getSharedPreferences(context);
-        if(pref.getBoolean("taskbar_active", false) || LauncherHelper.getInstance().isOnHomeScreen()) {
-            if(U.canDrawOverlays(context))
-                drawStartMenu(host);
-            else {
-                pref.edit().putBoolean("taskbar_active", false).apply();
-
-                host.terminate();
-            }
-        } else host.terminate();
+        init(context, host, () -> drawStartMenu(host));
     }
 
     @SuppressLint("RtlHardcoded")
index ab998d0..f9e5339 100644 (file)
@@ -114,9 +114,8 @@ import static com.farmerbb.taskbar.util.TaskbarPosition.POSITION_TOP_RIGHT;
 import static com.farmerbb.taskbar.util.TaskbarPosition.POSITION_TOP_VERTICAL_LEFT;
 import static com.farmerbb.taskbar.util.TaskbarPosition.POSITION_TOP_VERTICAL_RIGHT;
 
-public class TaskbarController implements UIController {
+public class TaskbarController extends UIController {
 
-    private Context context;
     private LinearLayout layout;
     private ImageView startButton;
     private LinearLayout taskbar;
@@ -223,22 +222,13 @@ public class TaskbarController implements UIController {
     };
 
     public TaskbarController(Context context) {
-        this.context = context;
+        super(context);
     }
 
     @TargetApi(Build.VERSION_CODES.M)
     @Override
     public void onCreateHost(UIHost host) {
-        SharedPreferences pref = U.getSharedPreferences(context);
-        if(pref.getBoolean("taskbar_active", false) || LauncherHelper.getInstance().isOnHomeScreen()) {
-            if(U.canDrawOverlays(context))
-                drawTaskbar(host);
-            else {
-                pref.edit().putBoolean("taskbar_active", false).apply();
-
-                host.terminate();
-            }
-        } else host.terminate();
+        init(context, host, () -> drawTaskbar(host));
     }
 
     @SuppressLint("RtlHardcoded")
index 1aa2d4d..ae28df0 100644 (file)
 
 package com.farmerbb.taskbar.ui;
 
-public interface UIController {
-    void onCreateHost(UIHost host);
-    void onRecreateHost(UIHost host);
-    void onDestroyHost(UIHost host);
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import com.farmerbb.taskbar.activity.SecondaryHomeActivity;
+import com.farmerbb.taskbar.util.LauncherHelper;
+import com.farmerbb.taskbar.util.U;
+
+public abstract class UIController {
+    protected Context context;
+
+    public UIController(Context context) {
+        this.context = context;
+    }
+
+    abstract void onCreateHost(UIHost host);
+    abstract void onRecreateHost(UIHost host);
+    abstract void onDestroyHost(UIHost host);
+
+    protected void init(Context context, UIHost host, Runnable runnable) {
+        SharedPreferences pref = U.getSharedPreferences(context);
+        LauncherHelper helper = LauncherHelper.getInstance();
+
+        boolean shouldProceed;
+        if(helper.isOnSecondaryHomeScreen())
+            shouldProceed = host instanceof SecondaryHomeActivity;
+        else
+            shouldProceed = true;
+
+        if(shouldProceed && (pref.getBoolean("taskbar_active", false)
+                || helper.isOnHomeScreen())) {
+            if(U.canDrawOverlays(context))
+                runnable.run();
+            else {
+                pref.edit().putBoolean("taskbar_active", false).apply();
+                host.terminate();
+            }
+        } else
+            host.terminate();
+    }
 }
\ No newline at end of file
index c99dbe3..484e679 100644 (file)
@@ -1225,7 +1225,7 @@ public class U {
             return;
         }
 
-        int displayID = getDisplayID();
+        int displayID = getTaskbarDisplayID();
         int value = show ? 0 : getNavbarHeight(context) * -1;
 
         if(hasWriteSecureSettingsPermission(context)) {
@@ -1331,7 +1331,7 @@ public class U {
 
     public static DisplayInfo getDisplayInfo(Context context, boolean fromTaskbar) {
         context = context.getApplicationContext();
-        int displayID = getDisplayID();
+        int displayID = getTaskbarDisplayID();
 
         DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
         Display currentDisplay = null;
@@ -1384,7 +1384,7 @@ public class U {
         return info;
     }
 
-    private static int getDisplayID() {
+    private static int getTaskbarDisplayID() {
         LauncherHelper helper = LauncherHelper.getInstance();
 
         if(helper.isOnSecondaryHomeScreen())
@@ -1776,7 +1776,6 @@ 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();