Merge "Adding the avility to have a PreviewSurfaceRenderer per screendID" into main

This commit is contained in:
Sebastián Franco
2023-10-19 17:57:31 +00:00
committed by Android (Google) Code Review
2 changed files with 44 additions and 11 deletions
@@ -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());
}
}
}
@@ -114,12 +114,17 @@ public class PreviewSurfaceRenderer {
mDisplay = context.getSystemService(DisplayManager.class)
.getDisplay(bundle.getInt(KEY_DISPLAY_ID));
mSurfaceControlViewHost = MAIN_EXECUTOR.submit(() -> new SurfaceControlViewHost(mContext,
context.getSystemService(DisplayManager.class).getDisplay(DEFAULT_DISPLAY),
mHostToken)).get(5, TimeUnit.SECONDS);
mSurfaceControlViewHost = MAIN_EXECUTOR.submit(() ->
new SurfaceControlViewHost(mContext, context.getSystemService(DisplayManager.class)
.getDisplay(DEFAULT_DISPLAY), mHostToken)
).get(5, TimeUnit.SECONDS);
mOnDestroyCallbacks.add(mSurfaceControlViewHost::release);
}
public int getDisplayId() {
return mDisplay.getDisplayId();
}
public IBinder getHostToken() {
return mHostToken;
}
@@ -225,7 +230,7 @@ public class PreviewSurfaceRenderer {
PreviewContext previewContext = new PreviewContext(inflationContext, idp);
// Copy existing data to preview DB
LauncherDbUtils.copyTable(LauncherAppState.getInstance(mContext)
.getModel().getModelDbController().getDb(),
.getModel().getModelDbController().getDb(),
TABLE_NAME,
LauncherAppState.getInstance(previewContext)
.getModel().getModelDbController().getDb(),