diff options
3 files changed, 25 insertions, 8 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java index 81a520661cfe..643f3bb917d1 100644 --- a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java +++ b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java @@ -30,6 +30,7 @@ import android.os.Looper; import android.os.Parcelable; import android.os.Trace; import android.util.ArrayMap; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -52,6 +53,8 @@ import javax.inject.Provider; public class FragmentHostManager { + private static final String TAG = "FragmentHostManager"; + private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Context mContext; private final HashMap<String, ArrayList<FragmentListener>> mListeners = new HashMap<>(); @@ -84,7 +87,7 @@ public class FragmentHostManager { FragmentHostManager create(View rootView); } - private void createFragmentHost(Parcelable savedState) { + private void createFragmentHost(@Nullable Parcelable savedState) { mFragments = FragmentController.createController(new HostCallbacks()); mFragments.attachHost(null); mLifecycleCallbacks = new FragmentLifecycleCallbacks() { @@ -115,12 +118,21 @@ public class FragmentHostManager { mFragments.dispatchResume(); } + @Nullable private Parcelable destroyFragmentHost() { - mFragments.dispatchPause(); - Parcelable p = mFragments.saveAllState(); - mFragments.dispatchStop(); - mFragments.dispatchDestroy(); - mFragments.getFragmentManager().unregisterFragmentLifecycleCallbacks(mLifecycleCallbacks); + Parcelable p = null; + try { + mFragments.dispatchPause(); + p = mFragments.saveAllState(); + mFragments.dispatchStop(); + mFragments.dispatchDestroy(); + mFragments + .getFragmentManager() + .unregisterFragmentLifecycleCallbacks(mLifecycleCallbacks); + } catch (IllegalStateException e) { + Log.e(TAG, "Failed to destroy fragment host. This is expected to happen only in " + + "tests when displays are added and removed quickly"); + } return p; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt index 70632b33f532..c748e28e60b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt @@ -188,7 +188,11 @@ constructor( finish.addListener( object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { - animationWindowView.removeView(currentAnimatedView!!.view) + if (!::animationWindowView.isInitialized) { + return + } + val animatedView = currentAnimatedView ?: return + animationWindowView.removeView(animatedView.view) } } ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProvider.kt index f7a9094e0337..7358c513eaff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/layout/StatusBarContentInsetsProvider.kt @@ -53,6 +53,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.io.PrintWriter import java.lang.Math.max +import java.util.concurrent.CopyOnWriteArraySet /** * Encapsulates logic that can solve for the left/right insets required for the status bar contents. @@ -163,7 +164,7 @@ constructor( // Limit cache size as potentially we may connect large number of displays // (e.g. network displays) private val insetsCache = LruCache<CacheKey, Rect>(MAX_CACHE_SIZE) - private val listeners = mutableSetOf<StatusBarContentInsetsChangedListener>() + private val listeners = CopyOnWriteArraySet<StatusBarContentInsetsChangedListener>() private val isPrivacyDotEnabled: Boolean by lazy(LazyThreadSafetyMode.PUBLICATION) { context.resources.getBoolean(R.bool.config_enablePrivacyDot) |