diff options
Diffstat (limited to 'src/com/android/launcher3/graphics/GridCustomizationsProvider.java')
-rw-r--r-- | src/com/android/launcher3/graphics/GridCustomizationsProvider.java | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java index ae5d8d489a..18200f6447 100644 --- a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java +++ b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.android.launcher3.graphics; import static com.android.launcher3.LauncherPrefs.THEMED_ICONS; @@ -21,6 +36,7 @@ import android.os.Message; import android.os.Messenger; import android.util.ArrayMap; import android.util.Log; +import android.util.Pair; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.InvariantDeviceProfile.GridOption; @@ -70,7 +86,11 @@ public class GridCustomizationsProvider extends ContentProvider { private static final int MESSAGE_ID_UPDATE_PREVIEW = 1337; - private final ArrayMap<IBinder, PreviewLifecycleObserver> mActivePreviews = new ArrayMap<>(); + /** + * Here we use the IBinder and the screen ID as the key of the active previews. + */ + private final ArrayMap<Pair<IBinder, Integer>, PreviewLifecycleObserver> mActivePreviews = + new ArrayMap<>(); @Override public boolean onCreate() { @@ -176,11 +196,10 @@ public class GridCustomizationsProvider extends ContentProvider { try { PreviewSurfaceRenderer renderer = new PreviewSurfaceRenderer(getContext(), request); - // Destroy previous - destroyObserver(mActivePreviews.get(renderer.getHostToken())); - observer = new PreviewLifecycleObserver(renderer); - mActivePreviews.put(renderer.getHostToken(), observer); + // Destroy previous + destroyObserver(mActivePreviews.get(observer.getIdentifier())); + mActivePreviews.put(observer.getIdentifier(), observer); renderer.loadAsync(); renderer.getHostToken().linkToDeath(observer, 0); @@ -210,9 +229,9 @@ public class GridCustomizationsProvider extends ContentProvider { observer.destroyed = true; observer.renderer.getHostToken().unlinkToDeath(observer, 0); Executors.MAIN_EXECUTOR.execute(observer.renderer::destroy); - PreviewLifecycleObserver cached = mActivePreviews.get(observer.renderer.getHostToken()); + PreviewLifecycleObserver cached = mActivePreviews.get(observer.getIdentifier()); if (cached == observer) { - mActivePreviews.remove(observer.renderer.getHostToken()); + mActivePreviews.remove(observer.getIdentifier()); } } @@ -242,5 +261,14 @@ public class GridCustomizationsProvider extends ContentProvider { public void binderDied() { destroyObserver(this); } + + /** + * Returns a key that should make the PreviewSurfaceRenderer unique and if two of them have + * the same key they will be treated as the same PreviewSurfaceRenderer. Primary this is + * used to prevent memory leaks by removing the old PreviewSurfaceRenderer. + */ + public Pair<IBinder, Integer> getIdentifier() { + return new Pair<>(renderer.getHostToken(), renderer.getDisplayId()); + } } } |