From 6bb853059310a56148ddfa54b7f9a976b888d0f0 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Sun, 19 Apr 2020 06:42:00 +0530 Subject: [PATCH 1/3] Fix: Crash when exiting app while rotating the device --- app/src/main/AndroidManifest.xml | 2 +- .../core/blur/ShaderBlurDrawable.kt | 12 +++-- .../broadcast/PackageAddedRemovedHandler.java | 6 +-- .../core/customviews/DockGridLayout.kt | 3 +- .../core/customviews/HorizontalPager.java | 1 + .../customviews/InsettableScrollLayout.java | 1 + .../features/launcher/AppProvider.java | 15 ++++-- .../features/launcher/EventsObserverImpl.java | 3 +- .../features/launcher/LauncherActivity.java | 50 +++++++++++++------ 9 files changed, 62 insertions(+), 31 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f318c05204..a4ddcad26e 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -62,7 +62,7 @@ android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize" android:launchMode="singleTask" android:resumeWhilePausing="true" - android:screenOrientation="nosensor" + android:screenOrientation="portrait" android:stateNotNeeded="true" android:theme="@style/HomeScreenTheme" android:windowSoftInputMode="adjustPan"> diff --git a/app/src/main/java/foundation/e/blisslauncher/core/blur/ShaderBlurDrawable.kt b/app/src/main/java/foundation/e/blisslauncher/core/blur/ShaderBlurDrawable.kt index 2578758dfd..b025aebde7 100644 --- a/app/src/main/java/foundation/e/blisslauncher/core/blur/ShaderBlurDrawable.kt +++ b/app/src/main/java/foundation/e/blisslauncher/core/blur/ShaderBlurDrawable.kt @@ -50,8 +50,9 @@ class ShaderBlurDrawable internal constructor(private val blurWallpaperProvider: blurBitmap = blurWallpaperProvider.placeholder } blurBitmap = - if (blurBitmap!!.height > (blurBounds.bottom.toInt() - blurBounds.top.toInt())) { - + if (blurBitmap!!.height >= blurBounds.bottom && + blurBitmap!!.width >= blurBounds.right + ) { Bitmap.createBitmap( blurBitmap!!, blurBounds.left.toInt(), blurBounds.top.toInt(), @@ -91,8 +92,11 @@ class ShaderBlurDrawable internal constructor(private val blurWallpaperProvider: blurPath.reset() blurPath.addRect( - 0f, 0f, - blurBounds.right - blurBounds.left, blurBounds.bottom - blurBounds.top, Path.Direction.CW + 0f, + 0f, + blurBounds.right - blurBounds.left, + blurBounds.bottom - blurBounds.top, + Path.Direction.CW ) } diff --git a/app/src/main/java/foundation/e/blisslauncher/core/broadcast/PackageAddedRemovedHandler.java b/app/src/main/java/foundation/e/blisslauncher/core/broadcast/PackageAddedRemovedHandler.java index 8191b62a32..6e5280833b 100644 --- a/app/src/main/java/foundation/e/blisslauncher/core/broadcast/PackageAddedRemovedHandler.java +++ b/app/src/main/java/foundation/e/blisslauncher/core/broadcast/PackageAddedRemovedHandler.java @@ -35,7 +35,7 @@ public class PackageAddedRemovedHandler extends BroadcastReceiver { AppAddEvent event = new AppAddEvent(packageName, user); EventRelay.getInstance().push(event); - BlissLauncher.getApplication(ctx).getAppProvider().reload(); + BlissLauncher.getApplication(ctx).getAppProvider().reload(false); } if ("android.intent.action.PACKAGE_CHANGED".equalsIgnoreCase(action)) { @@ -49,12 +49,12 @@ public class PackageAddedRemovedHandler extends BroadcastReceiver { AppChangeEvent event = new AppChangeEvent(packageName, user); EventRelay.getInstance().push(event); - BlissLauncher.getApplication(ctx).getAppProvider().reload(); + BlissLauncher.getApplication(ctx).getAppProvider().reload(false); } if ("android.intent.action.PACKAGE_REMOVED".equals(action) && !replacing) { AppRemoveEvent event = new AppRemoveEvent(packageName, user); EventRelay.getInstance().push(event); - BlissLauncher.getApplication(ctx).getAppProvider().reload(); + BlissLauncher.getApplication(ctx).getAppProvider().reload(false); } if("android.intent.action.MEDIA_MOUNTED".equals(action)) { diff --git a/app/src/main/java/foundation/e/blisslauncher/core/customviews/DockGridLayout.kt b/app/src/main/java/foundation/e/blisslauncher/core/customviews/DockGridLayout.kt index 35d42e2109..1baf2cc796 100755 --- a/app/src/main/java/foundation/e/blisslauncher/core/customviews/DockGridLayout.kt +++ b/app/src/main/java/foundation/e/blisslauncher/core/customviews/DockGridLayout.kt @@ -73,7 +73,8 @@ class DockGridLayout @JvmOverloads constructor( } } - override fun setInsets(insets: WindowInsets) { + override fun setInsets(insets: WindowInsets?) { + if (insets == null) return val deviceProfile = BlissLauncher.getApplication(mContext).deviceProfile val lp = layoutParams as InsettableRelativeLayout.LayoutParams diff --git a/app/src/main/java/foundation/e/blisslauncher/core/customviews/HorizontalPager.java b/app/src/main/java/foundation/e/blisslauncher/core/customviews/HorizontalPager.java index 20805762d3..c7c3e81eba 100755 --- a/app/src/main/java/foundation/e/blisslauncher/core/customviews/HorizontalPager.java +++ b/app/src/main/java/foundation/e/blisslauncher/core/customviews/HorizontalPager.java @@ -543,6 +543,7 @@ public class HorizontalPager extends ViewGroup implements Insettable { @Override public void setInsets(WindowInsets insets) { + if(insets == null) return; InsettableRelativeLayout.LayoutParams lp = (InsettableRelativeLayout.LayoutParams) getLayoutParams(); lp.topMargin = insets.getSystemWindowInsetTop(); setLayoutParams(lp); diff --git a/app/src/main/java/foundation/e/blisslauncher/core/customviews/InsettableScrollLayout.java b/app/src/main/java/foundation/e/blisslauncher/core/customviews/InsettableScrollLayout.java index b052001cd3..725dbfa64a 100644 --- a/app/src/main/java/foundation/e/blisslauncher/core/customviews/InsettableScrollLayout.java +++ b/app/src/main/java/foundation/e/blisslauncher/core/customviews/InsettableScrollLayout.java @@ -24,6 +24,7 @@ public class InsettableScrollLayout extends ScrollView implements Insettable { @Override public void setInsets(WindowInsets insets) { + if(insets == null) return; int top = getPaddingTop(); int left = getPaddingLeft(); int right = getPaddingRight(); diff --git a/app/src/main/java/foundation/e/blisslauncher/features/launcher/AppProvider.java b/app/src/main/java/foundation/e/blisslauncher/features/launcher/AppProvider.java index 71cba2d5bb..882063d558 100644 --- a/app/src/main/java/foundation/e/blisslauncher/features/launcher/AppProvider.java +++ b/app/src/main/java/foundation/e/blisslauncher/features/launcher/AppProvider.java @@ -103,8 +103,11 @@ public class AppProvider { private boolean mStopped; private boolean isSdCardReady; + private AppsRepository appsRepository; + private AppProvider(Context context) { this.mContext = context; + this.appsRepository = AppsRepository.getAppsRepository(); isLoading = false; initialise(); } @@ -202,7 +205,7 @@ public class AppProvider { synchronized (AppProvider.class) { if (sInstance == null) { sInstance = new AppProvider(context); - sInstance.reload(); + sInstance.reload(true); } } } @@ -213,12 +216,12 @@ public class AppProvider { return mContext; } - public synchronized void reload() { + public synchronized void reload(boolean force) { Log.d(TAG, "reload() called"); isSdCardReady = Utilities.isBootCompleted(); - if (mLauncherItems != null && mLauncherItems.size() > 0) { + if (!force && mLauncherItems != null && mLauncherItems.size() > 0) { mAppsRepository.updateAppsRelay(mLauncherItems); } @@ -460,7 +463,6 @@ public class AppProvider { } private List prepareDefaultLauncherItems() { - Log.d(TAG, "prepareDefaultLauncherItems() called " + mApplicationItems.size()); List mLauncherItems = new ArrayList<>(); List pinnedItems = new ArrayList<>(); PackageManager pm = mContext.getPackageManager(); @@ -501,10 +503,13 @@ public class AppProvider { }); mLauncherItems.addAll(pinnedItems); - Log.i(TAG, "prepareDefaultLauncherItems: " + mLauncherItems.size()); return mLauncherItems; } + public AppsRepository getAppsRepository() { + return appsRepository; + } + public void clear() { this.sInstance = null; mLauncherItems = new ArrayList<>(); diff --git a/app/src/main/java/foundation/e/blisslauncher/features/launcher/EventsObserverImpl.java b/app/src/main/java/foundation/e/blisslauncher/features/launcher/EventsObserverImpl.java index 15d39b25c0..d1253e3a7d 100644 --- a/app/src/main/java/foundation/e/blisslauncher/features/launcher/EventsObserverImpl.java +++ b/app/src/main/java/foundation/e/blisslauncher/features/launcher/EventsObserverImpl.java @@ -4,7 +4,6 @@ import android.util.Log; import java.util.Calendar; -import foundation.e.blisslauncher.BlissLauncher; import foundation.e.blisslauncher.core.events.AppAddEvent; import foundation.e.blisslauncher.core.events.AppChangeEvent; import foundation.e.blisslauncher.core.events.AppRemoveEvent; @@ -44,7 +43,7 @@ public class EventsObserverImpl implements EventRelay.EventsObserver { launcherActivity.updateAllCalendarIcons(Calendar.getInstance()); break; case ForceReloadEvent.TYPE: - BlissLauncher.getApplication(launcherActivity).getAppProvider().reload(); + launcherActivity.forceReload(); break; } } diff --git a/app/src/main/java/foundation/e/blisslauncher/features/launcher/LauncherActivity.java b/app/src/main/java/foundation/e/blisslauncher/features/launcher/LauncherActivity.java index 601ed32d50..057b6d5b31 100755 --- a/app/src/main/java/foundation/e/blisslauncher/features/launcher/LauncherActivity.java +++ b/app/src/main/java/foundation/e/blisslauncher/features/launcher/LauncherActivity.java @@ -9,7 +9,6 @@ import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; -import android.app.Dialog; import android.app.WallpaperManager; import android.app.usage.UsageStats; import android.appwidget.AppWidgetManager; @@ -40,7 +39,6 @@ import android.os.UserManager; import android.provider.Settings; import android.text.Editable; import android.text.TextWatcher; -import android.util.Log; import android.view.DragEvent; import android.view.Gravity; import android.view.LayoutInflater; @@ -77,6 +75,7 @@ import com.jakewharton.rxbinding3.widget.RxTextView; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; +import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; @@ -245,6 +244,7 @@ public class LauncherActivity extends AppCompatActivity implements private Configuration oldConfig; private WallpaperChangeReceiver wallpaperChangeReceiver; private GestureDetectorCompat mDetector; + private AlertDialog enableLocationDialog; public static LauncherActivity getLauncher(Context context) { if (context instanceof LauncherActivity) { @@ -358,15 +358,18 @@ public class LauncherActivity extends AppCompatActivity implements private void createOrUpdateIconGrid() { getCompositeDisposable().add( - AppsRepository.getAppsRepository().getAppsRelay() + BlissLauncher.getApplication(this) + .getAppProvider() + .getAppsRepository() + .getAppsRelay() .distinctUntilChanged() .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableObserver>() { @Override public void onNext(List launcherItems) { if (launcherItems == null || launcherItems.size() <= 0) { - BlissLauncher.getApplication(LauncherActivity.this).getAppProvider().reload(); - } else if(!allAppsDisplayed) { + BlissLauncher.getApplication(LauncherActivity.this).getAppProvider().reload(true); + } else if (!allAppsDisplayed) { showApps(launcherItems); } } @@ -476,19 +479,36 @@ public class LauncherActivity extends AppCompatActivity implements @Override protected void onDestroy() { - super.onDestroy(); + // Unregister active receivers TimeChangeBroadcastReceiver.unregister(this, timeChangedReceiver); ManagedProfileBroadcastReceiver.unregister(this, managedProfileReceiver); LocalBroadcastManager.getInstance(this).unregisterReceiver(mWeatherReceiver); + + // Dispose CompositeDisposable getCompositeDisposable().dispose(); - events.unsubscribe(); + + // Unsubscribe to events + if (events != null) { + events.unsubscribe(); + } + + // Dismiss Dialog if currently visible to prevent view leakage. + if (enableLocationDialog != null && enableLocationDialog.isShowing()) { + enableLocationDialog.dismiss(); + } + + // Clear AppProvider BlissLauncher.getApplication(this).getAppProvider().clear(); + + // Handover to android system. + super.onDestroy(); } @Override public void onConfigurationChanged(Configuration newConfig) { - Log.d(TAG, "onConfigurationChanged() called with: newConfig = [" + newConfig + "]"); int diff = newConfig.diff(oldConfig); + + // Don't consider any other config changes as of now. if ((diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0) { recreate(); } @@ -968,7 +988,6 @@ public class LauncherActivity extends AppCompatActivity implements } private void subscribeToEvents() { - Log.d(TAG, "subscribeToEvents() called"); events = EventRelay.getInstance(); events.subscribe(new EventsObserverImpl(this)); } @@ -1279,7 +1298,6 @@ public class LauncherActivity extends AppCompatActivity implements } return false; }); - scrollView.post(() -> scrollView.setInsets(workspace.getRootWindowInsets())); currentPageNumber = 1; mHorizontalPager.setCurrentPage(currentPageNumber); @@ -1469,7 +1487,6 @@ public class LauncherActivity extends AppCompatActivity implements } else if (requestCode == STORAGE_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - Log.d(TAG, "Storage permission granted"); BlurWallpaperProvider.Companion.getInstance(getApplicationContext()).updateAsync(); } } @@ -1492,8 +1509,6 @@ public class LauncherActivity extends AppCompatActivity implements private void showLocationEnableDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); - final Dialog dialog; - // Build and show the dialog builder.setTitle(R.string.weather_retrieve_location_dialog_title); builder.setMessage(R.string.weather_retrieve_location_dialog_message); @@ -1506,8 +1521,8 @@ public class LauncherActivity extends AppCompatActivity implements startActivityForResult(intent, REQUEST_LOCATION_SOURCE_SETTING); }); builder.setNegativeButton(R.string.cancel, null); - dialog = builder.create(); - dialog.show(); + enableLocationDialog = builder.create(); + enableLocationDialog.show(); } @Override @@ -3316,6 +3331,11 @@ public class LauncherActivity extends AppCompatActivity implements } } + public void forceReload() { + allAppsDisplayed = false; + BlissLauncher.getApplication(this).getAppProvider().getAppsRepository().updateAppsRelay(Collections.emptyList()); + } + /** * Adapter for folder apps. */ -- GitLab From 1a8f4f96d7b425ff2f29e9664eac8052d2b581b9 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Sun, 19 Apr 2020 07:19:35 +0530 Subject: [PATCH 2/3] Update gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 5c038db904..4851e9d46e 100755 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,9 @@ build/ .idea/tasks.xml .idea/modules.xml .idea/assetWizardSettings.xml +.idea/markdown-navigator* +projectFilesBackup/ + gradle.xml .classpath -- GitLab From 04d817cf4f5557de3d307487f6cf8abf8606ddc8 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Sun, 19 Apr 2020 07:21:14 +0530 Subject: [PATCH 3/3] Update project style configuration --- .idea/codeStyles/Project.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 2e191f6759..c82ee7068f 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -12,9 +12,6 @@