Fix crash when changing preferences from the phone activity am: 4895c46357

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Car/tests/+/12700474

Change-Id: I41ee24f2b16b22fce688ba8e238ac4cff8335f7a
diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java
index 3c3eeb6..61b3a31 100644
--- a/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java
+++ b/TestMediaApp/src/com/android/car/media/testmediaapp/TmaBrowser.java
@@ -33,7 +33,9 @@
 import androidx.media.MediaBrowserServiceCompat;
 
 import com.android.car.media.testmediaapp.loader.TmaLoader;
+import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs;
 import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaAccountType;
+import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaBrowseNodeType;
 import com.android.car.media.testmediaapp.prefs.TmaEnumPrefs.TmaReplyDelay;
 import com.android.car.media.testmediaapp.prefs.TmaPrefs;
 
@@ -72,6 +74,10 @@
 
     private BrowserRoot mRoot;
 
+    public TmaBrowser() {
+        super();
+    }
+
     @Override
     public void onCreate() {
         super.onCreate();
@@ -91,14 +97,9 @@
         mediaSessionExtras.putString(BROWSE_SERVICE_FOR_SESSION_KEY, TmaBrowser.class.getName());
         mSession.setExtras(mediaSessionExtras);
 
-        mPrefs.mAccountType.registerChangeListener(
-                (oldValue, newValue) -> onAccountChanged(newValue));
-
-        mPrefs.mRootNodeType.registerChangeListener(
-                (oldValue, newValue) -> invalidateRoot());
-
-        mPrefs.mRootReplyDelay.registerChangeListener(
-                (oldValue, newValue) -> invalidateRoot());
+        mPrefs.mAccountType.registerChangeListener(mOnAccountChanged);
+        mPrefs.mRootNodeType.registerChangeListener(mOnRootNodeTypeChanged);
+        mPrefs.mRootReplyDelay.registerChangeListener(mOnReplyDelayChanged);
 
         Bundle browserRootExtras = new Bundle();
         browserRootExtras.putBoolean(SEARCH_SUPPORTED, true);
@@ -109,23 +110,33 @@
 
     @Override
     public void onDestroy() {
+        mPrefs.mAccountType.unregisterChangeListener(mOnAccountChanged);
+        mPrefs.mRootNodeType.unregisterChangeListener(mOnRootNodeTypeChanged);
+        mPrefs.mRootReplyDelay.unregisterChangeListener(mOnReplyDelayChanged);
         mSession.release();
         mHandler = null;
         mPrefs = null;
         super.onDestroy();
     }
 
-    private void onAccountChanged(TmaAccountType accountType) {
-        if (PLAYBACK_STATE_UPDATE_FIRST.equals(mPrefs.mLoginEventOrder.getValue())) {
-            updatePlaybackState(accountType);
-            invalidateRoot();
-        } else {
-            invalidateRoot();
-            (new Handler()).postDelayed(() -> {
-                updatePlaybackState(accountType);
-            }, 3000);
-        }
-    }
+    private final TmaPrefs.PrefValueChangedListener<TmaAccountType> mOnAccountChanged =
+            (oldValue, newValue) -> {
+                if (PLAYBACK_STATE_UPDATE_FIRST.equals(mPrefs.mLoginEventOrder.getValue())) {
+                    updatePlaybackState(newValue);
+                    invalidateRoot();
+                } else {
+                    invalidateRoot();
+                    (new Handler()).postDelayed(() -> {
+                        updatePlaybackState(newValue);
+                    }, 3000);
+                }
+            };
+
+    private final TmaPrefs.PrefValueChangedListener<TmaBrowseNodeType> mOnRootNodeTypeChanged =
+            (oldValue, newValue) -> invalidateRoot();
+
+    private final TmaPrefs.PrefValueChangedListener<TmaReplyDelay> mOnReplyDelayChanged =
+            (oldValue, newValue) -> invalidateRoot();
 
     private void updatePlaybackState(TmaAccountType accountType) {
         if (accountType == TmaAccountType.NONE) {
diff --git a/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefs.java b/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefs.java
index 8e9d89f..dd08cd2 100644
--- a/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefs.java
+++ b/TestMediaApp/src/com/android/car/media/testmediaapp/prefs/TmaPrefs.java
@@ -110,6 +110,14 @@
             mSharedPrefs.registerOnSharedPreferenceChangeListener(listenerWrapper);
             mListeners.put(listener, listenerWrapper);
         }
+
+        public void unregisterChangeListener(PrefValueChangedListener<T> listener) {
+            OnSharedPreferenceChangeListener listenerWrapper = mListeners.get(listener);
+            if (listenerWrapper != null) {
+                mSharedPrefs.unregisterOnSharedPreferenceChangeListener(listenerWrapper);
+                mListeners.remove(listener);
+            }
+        }
     }
 
 
diff --git a/build.gradle b/build.gradle
index 8ea89fa..5493299 100644
--- a/build.gradle
+++ b/build.gradle
@@ -22,7 +22,7 @@
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:4.0.0'
+        classpath 'com.android.tools.build:gradle:4.0.1'
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files