From 480ac2c76bbf18a4e06e1e860d33772933ac73c2 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Wed, 17 Mar 2021 21:31:27 +0530 Subject: [PATCH] Lawnchair: Fix icon size and label size reload, implement launcher restart --- AndroidManifest.xml | 1 + lawnchair/AndroidManifest.xml | 2 +- lawnchair/src/app/lawnchair/FeedBridge.kt | 2 + .../app/lawnchair/{ui => }/LawnchairApp.kt | 12 ++-- .../src/app/lawnchair/LawnchairLauncher.java | 13 ----- .../src/app/lawnchair/LawnchairLauncher.kt | 55 +++++++++++++++++++ .../lawnchair/LawnchairLauncherQuickstep.java | 13 ----- .../lawnchair/LawnchairLauncherQuickstep.kt | 55 +++++++++++++++++++ .../src/app/lawnchair/util/LawnchairUtils.kt | 39 ++++++++++++- .../src/app/lawnchair/util/SingletonHolder.kt | 2 - .../util/preferences/LawnchairPreferences.kt | 11 ++++ quickstep/AndroidManifest-launcher.xml | 1 + src/com/android/launcher3/DeviceProfile.java | 17 +++++- .../launcher3/InvariantDeviceProfile.java | 7 --- src/com/android/launcher3/Launcher.java | 1 + .../android/launcher3/LauncherAppState.java | 19 ++++++- .../util/MainThreadInitializedObject.java | 3 + 17 files changed, 207 insertions(+), 46 deletions(-) rename lawnchair/src/app/lawnchair/{ui => }/LawnchairApp.kt (96%) delete mode 100644 lawnchair/src/app/lawnchair/LawnchairLauncher.java create mode 100644 lawnchair/src/app/lawnchair/LawnchairLauncher.kt delete mode 100644 lawnchair/src/app/lawnchair/LawnchairLauncherQuickstep.java create mode 100644 lawnchair/src/app/lawnchair/LawnchairLauncherQuickstep.kt diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f819d05a3d..7a81663f7e 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -27,6 +27,7 @@ --> - + . */ -package app.lawnchair.ui +package app.lawnchair import android.app.Activity import android.app.Application @@ -25,6 +25,7 @@ import android.os.Build import android.os.Bundle import android.util.Log import androidx.annotation.Keep +import app.lawnchair.util.restartLauncher import com.android.launcher3.Utilities import com.android.quickstep.RecentsActivity @@ -35,9 +36,6 @@ class LawnchairApp : Application() { val recentsEnabled by lazy { checkRecentsComponent() } val TAG = "LawnchairApp" - init { - } - fun onLauncherAppStateCreated() { registerActivityLifecycleCallbacks(activityHandler) } @@ -45,9 +43,9 @@ class LawnchairApp : Application() { fun restart(recreateLauncher: Boolean = true) { if (recreateLauncher) { activityHandler.finishAll() - } /*else { - Utilities.restartLauncher(this) - }*/ + } else { + restartLauncher(this) + } } class ActivityHandler : ActivityLifecycleCallbacks { diff --git a/lawnchair/src/app/lawnchair/LawnchairLauncher.java b/lawnchair/src/app/lawnchair/LawnchairLauncher.java deleted file mode 100644 index 98193af432..0000000000 --- a/lawnchair/src/app/lawnchair/LawnchairLauncher.java +++ /dev/null @@ -1,13 +0,0 @@ -package app.lawnchair; - -import com.android.launcher3.Launcher; -import com.android.systemui.plugins.shared.LauncherOverlayManager; - -import app.lawnchair.nexuslauncher.OverlayCallbackImpl; - -public class LawnchairLauncher extends Launcher { - @Override - protected LauncherOverlayManager getDefaultOverlay() { - return new OverlayCallbackImpl(this); - } -} diff --git a/lawnchair/src/app/lawnchair/LawnchairLauncher.kt b/lawnchair/src/app/lawnchair/LawnchairLauncher.kt new file mode 100644 index 0000000000..b883c4be2f --- /dev/null +++ b/lawnchair/src/app/lawnchair/LawnchairLauncher.kt @@ -0,0 +1,55 @@ +package app.lawnchair + +import android.content.Context +import android.content.ContextWrapper +import com.android.launcher3.Launcher +import com.android.systemui.plugins.shared.LauncherOverlayManager +import app.lawnchair.nexuslauncher.OverlayCallbackImpl +import app.lawnchair.util.restartLauncher +import com.android.launcher3.LauncherAppState + +open class LawnchairLauncher : Launcher() { + private var paused = false + + override fun getDefaultOverlay(): LauncherOverlayManager { + return OverlayCallbackImpl(this) + } + + override fun onResume() { + super.onResume() + + restartIfPending() + + paused = false + } + + override fun onPause() { + super.onPause() + + paused = true + } + + open fun restartIfPending() { + if (sRestart) { + lawnchairApp.restart(false) + } + } + + fun scheduleRestart() { + if (paused) { + sRestart = true + } else { + restartLauncher(this) + } + } + + companion object { + var sRestart = false + @JvmStatic + fun getLauncher(context: Context): LawnchairLauncher { + return context as? LawnchairLauncher + ?: (context as ContextWrapper).baseContext as? LawnchairLauncher + ?: LauncherAppState.getInstance(context).launcher as LawnchairLauncher + } + } +} \ No newline at end of file diff --git a/lawnchair/src/app/lawnchair/LawnchairLauncherQuickstep.java b/lawnchair/src/app/lawnchair/LawnchairLauncherQuickstep.java deleted file mode 100644 index 187e72b23d..0000000000 --- a/lawnchair/src/app/lawnchair/LawnchairLauncherQuickstep.java +++ /dev/null @@ -1,13 +0,0 @@ -package app.lawnchair; - -import com.android.launcher3.uioverrides.QuickstepLauncher; -import com.android.systemui.plugins.shared.LauncherOverlayManager; - -import app.lawnchair.nexuslauncher.OverlayCallbackImpl; - -public class LawnchairLauncherQuickstep extends QuickstepLauncher { - @Override - protected LauncherOverlayManager getDefaultOverlay() { - return new OverlayCallbackImpl(this); - } -} diff --git a/lawnchair/src/app/lawnchair/LawnchairLauncherQuickstep.kt b/lawnchair/src/app/lawnchair/LawnchairLauncherQuickstep.kt new file mode 100644 index 0000000000..511904bd60 --- /dev/null +++ b/lawnchair/src/app/lawnchair/LawnchairLauncherQuickstep.kt @@ -0,0 +1,55 @@ +package app.lawnchair + +import android.content.Context +import android.content.ContextWrapper +import com.android.launcher3.uioverrides.QuickstepLauncher +import com.android.systemui.plugins.shared.LauncherOverlayManager +import app.lawnchair.nexuslauncher.OverlayCallbackImpl +import app.lawnchair.util.restartLauncher +import com.android.launcher3.LauncherAppState + +open class LawnchairLauncherQuickstep : QuickstepLauncher() { + private var paused = false + + override fun getDefaultOverlay(): LauncherOverlayManager { + return OverlayCallbackImpl(this) + } + + override fun onResume() { + super.onResume() + + restartIfPending() + + paused = false + } + + override fun onPause() { + super.onPause() + + paused = true + } + + open fun restartIfPending() { + if (sRestart) { + lawnchairApp.restart(false) + } + } + + fun scheduleRestart() { + if (paused) { + sRestart = true + } else { + restartLauncher(this) + } + } + + companion object { + var sRestart = false + @JvmStatic + fun getLauncher(context: Context): LawnchairLauncherQuickstep { + return context as? LawnchairLauncherQuickstep + ?: (context as ContextWrapper).baseContext as? LawnchairLauncherQuickstep + ?: LauncherAppState.getInstance(context).launcher as LawnchairLauncherQuickstep + } + } +} \ No newline at end of file diff --git a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt index 6f8e244acf..f4fc53a206 100644 --- a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt +++ b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt @@ -15,14 +15,21 @@ * along with Lawnchair Launcher. If not, see . */ -package app.lawnchair +package app.lawnchair.util +import android.app.AlarmManager +import android.app.PendingIntent import android.content.Context +import android.content.Intent import android.os.Looper + import com.android.launcher3.util.Executors.MAIN_EXECUTOR + import java.util.concurrent.Callable import java.util.concurrent.ExecutionException +import kotlin.system.exitProcess + fun ensureOnMainThread(creator: (A) -> T): (A) -> T { return { it -> @@ -43,4 +50,34 @@ fun ensureOnMainThread(creator: (A) -> T): (A) -> T { fun useApplicationContext(creator: (Context) -> T): (Context) -> T { return { it -> creator(it.applicationContext) } +} + +fun restartLauncher(context: Context) { + val pm = context.packageManager + var intent: Intent? = Intent(Intent.ACTION_MAIN) + intent!!.addCategory(Intent.CATEGORY_HOME) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + val componentName = intent.resolveActivity(pm) + if (context.packageName != componentName.packageName) { + intent = pm.getLaunchIntentForPackage(context.packageName) + intent!!.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + } + restartLauncher(context, intent) +} + +fun restartLauncher(context: Context, intent: Intent?) { + context.startActivity(intent) + + // Create a pending intent so the application is restarted after System.exit(0) was called. + // We use an AlarmManager to call this intent in 100ms + val mPendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT) + val mgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager + mgr[AlarmManager.RTC, System.currentTimeMillis() + 100] = mPendingIntent + + // Kill the application + killLauncher() +} + +fun killLauncher() { + exitProcess(0) } \ No newline at end of file diff --git a/lawnchair/src/app/lawnchair/util/SingletonHolder.kt b/lawnchair/src/app/lawnchair/util/SingletonHolder.kt index 6f13ea06e2..bc9269e8b0 100644 --- a/lawnchair/src/app/lawnchair/util/SingletonHolder.kt +++ b/lawnchair/src/app/lawnchair/util/SingletonHolder.kt @@ -18,8 +18,6 @@ package app.lawnchair.util import android.content.Context -import app.lawnchair.ensureOnMainThread -import app.lawnchair.useApplicationContext // Source: https://medium.com/@BladeCoder/kotlin-singletons-with-argument-194ef06edd9e open class SingletonHolder(creator: (A) -> T) { diff --git a/lawnchair/src/app/lawnchair/util/preferences/LawnchairPreferences.kt b/lawnchair/src/app/lawnchair/util/preferences/LawnchairPreferences.kt index ff2a4c21e4..b1fde8ae40 100644 --- a/lawnchair/src/app/lawnchair/util/preferences/LawnchairPreferences.kt +++ b/lawnchair/src/app/lawnchair/util/preferences/LawnchairPreferences.kt @@ -2,6 +2,9 @@ package app.lawnchair.util.preferences import android.content.Context import android.content.SharedPreferences +import app.lawnchair.LawnchairLauncher +import app.lawnchair.LawnchairLauncherQuickstep +import com.android.launcher3.BuildConfig import com.android.launcher3.LauncherAppState import com.android.launcher3.Utilities @@ -21,6 +24,14 @@ class LawnchairPreferences(val context: Context) { LauncherAppState.getInstance(context).invariantDeviceProfile.reInitGrid() LauncherAppState.getInstance(context).model.forceReload() } + + TEXT_SIZE_FACTOR, ICON_SIZE_FACTOR, ALL_APPS_ICON_SIZE_FACTOR, ALL_APPS_TEXT_SIZE_FACTOR -> { + if (BuildConfig.FLAVOR_recents == "withQuickstep") { + LawnchairLauncherQuickstep.getLauncher(context).scheduleRestart() + } else { + LawnchairLauncher.getLauncher(context).scheduleRestart() + } + } } } diff --git a/quickstep/AndroidManifest-launcher.xml b/quickstep/AndroidManifest-launcher.xml index 4fc2f5ddb4..22f0d067f3 100644 --- a/quickstep/AndroidManifest-launcher.xml +++ b/quickstep/AndroidManifest-launcher.xml @@ -27,6 +27,7 @@ --> implements Launche super.onCreate(savedInstanceState); LauncherAppState app = LauncherAppState.getInstance(this); + app.setLauncher(this); mOldConfig = new Configuration(getResources().getConfiguration()); mModel = app.getModel(); diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index 53e5274c0c..ccbcad5e89 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -45,13 +45,21 @@ import com.android.launcher3.util.SecureSettingsObserver; import com.android.launcher3.util.SimpleBroadcastReceiver; import com.android.launcher3.widget.custom.CustomWidgetManager; +import app.lawnchair.LawnchairAppKt; + public class LauncherAppState { public static final String ACTION_FORCE_ROLOAD = "force-reload-launcher"; // We do not need any synchronization for this variable as its only written on UI thread. public static final MainThreadInitializedObject INSTANCE = - new MainThreadInitializedObject<>(LauncherAppState::new); + new MainThreadInitializedObject(LauncherAppState::new) { + @Override + protected void onPostInit(Context context) { + super.onPostInit(context); + LawnchairAppKt.getLawnchairApp(context).onLauncherAppStateCreated(); + } + }; private final Context mContext; private final LauncherModel mModel; @@ -65,6 +73,7 @@ public class LauncherAppState { private SimpleBroadcastReceiver mModelChangeReceiver; private SafeCloseable mCalendarChangeTracker; private SafeCloseable mUserChangeListener; + private Launcher mLauncher; public static LauncherAppState getInstance(final Context context) { return INSTANCE.get(context); @@ -177,6 +186,14 @@ public class LauncherAppState { } } + public void setLauncher(Launcher launcher) { + mLauncher = launcher; + } + + public Launcher getLauncher() { + return mLauncher; + } + public IconCache getIconCache() { return mIconCache; } diff --git a/src/com/android/launcher3/util/MainThreadInitializedObject.java b/src/com/android/launcher3/util/MainThreadInitializedObject.java index f6003dd7bf..486050b157 100644 --- a/src/com/android/launcher3/util/MainThreadInitializedObject.java +++ b/src/com/android/launcher3/util/MainThreadInitializedObject.java @@ -48,6 +48,7 @@ public class MainThreadInitializedObject { if (Looper.myLooper() == Looper.getMainLooper()) { mValue = TraceHelper.allowIpcs("main.thread.object", () -> mProvider.get(context.getApplicationContext())); + onPostInit(context); } else { try { return MAIN_EXECUTOR.submit(() -> get(context)).get(); @@ -59,6 +60,8 @@ public class MainThreadInitializedObject { return mValue; } + protected void onPostInit(Context context) { } + public T getNoCreate() { return mValue; }