Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cffdcf19 authored by Chris Göllner's avatar Chris Göllner Committed by Alina Zaidi
Browse files

Prevent a few crashes that occur when advancing the SB CD flag to staging

1. An IllegalStateException that occurs when reloading the fragments
   in FragmentHostManager
2. A ConcurrentModificationException in StatusBarContentInsetsProvider
   when notifying listeners.
3. A NPE in SystemEventChipAnimationControllerImpl when an animation
   finishes.

Test: advance the flag to staging
Bug: 362720336
Flag: EXEMPT trivial
Change-Id: I3a2479e29ef3260c3eb218f4786e962cf122772c
parent b4351c14
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -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() {
        Parcelable p = null;
        try {
            mFragments.dispatchPause();
        Parcelable p = mFragments.saveAllState();
            p = mFragments.saveAllState();
            mFragments.dispatchStop();
            mFragments.dispatchDestroy();
        mFragments.getFragmentManager().unregisterFragmentLifecycleCallbacks(mLifecycleCallbacks);
            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;
    }

+5 −1
Original line number Diff line number Diff line
@@ -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)
                }
            }
        )
+2 −1
Original line number Diff line number Diff line
@@ -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)