Merge "IWallpaperServiceWrapper keep track of multiple engines" into udc-dev am: e427865078
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21482810 Change-Id: Ifc840b51baf1a268a21c3948290033a18a7e1f45 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -26,5 +26,5 @@ oneway interface IWallpaperService {
|
||||
void attach(IWallpaperConnection connection,
|
||||
IBinder windowToken, int windowType, boolean isPreview,
|
||||
int reqWidth, int reqHeight, in Rect padding, int displayId, int which);
|
||||
void detach();
|
||||
void detach(IBinder windowToken);
|
||||
}
|
||||
|
||||
@@ -68,9 +68,11 @@ import android.os.RemoteException;
|
||||
import android.os.SystemClock;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.Trace;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.ArraySet;
|
||||
import android.util.Log;
|
||||
import android.util.MergedConfiguration;
|
||||
import android.util.Slog;
|
||||
import android.view.Display;
|
||||
import android.view.DisplayCutout;
|
||||
import android.view.Gravity;
|
||||
@@ -102,7 +104,6 @@ import com.android.internal.view.BaseSurfaceHolder;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@@ -177,8 +178,7 @@ public abstract class WallpaperService extends Service {
|
||||
|
||||
private static final long DIMMING_ANIMATION_DURATION_MS = 300L;
|
||||
|
||||
private final ArrayList<Engine> mActiveEngines
|
||||
= new ArrayList<Engine>();
|
||||
private final ArrayMap<IBinder, IWallpaperEngineWrapper> mActiveEngines = new ArrayMap<>();
|
||||
|
||||
static final class WallpaperCommand {
|
||||
String action;
|
||||
@@ -2231,7 +2231,6 @@ public abstract class WallpaperService extends Service {
|
||||
final DisplayManager mDisplayManager;
|
||||
final Display mDisplay;
|
||||
final WallpaperManager mWallpaperManager;
|
||||
private final AtomicBoolean mDetached = new AtomicBoolean();
|
||||
|
||||
Engine mEngine;
|
||||
@SetWallpaperFlags int mWhich;
|
||||
@@ -2346,21 +2345,18 @@ public abstract class WallpaperService extends Service {
|
||||
mEngine.removeLocalColorsAreas(regions);
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
Message msg = mCaller.obtainMessage(DO_DETACH);
|
||||
mCaller.sendMessage(msg);
|
||||
}
|
||||
|
||||
public void detach() {
|
||||
mDetached.set(true);
|
||||
}
|
||||
|
||||
public void applyDimming(float dimAmount) throws RemoteException {
|
||||
Message msg = mCaller.obtainMessageI(MSG_UPDATE_DIMMING,
|
||||
Float.floatToIntBits(dimAmount));
|
||||
mCaller.sendMessage(msg);
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
Message msg = mCaller.obtainMessage(DO_DETACH);
|
||||
mCaller.getHandler().removeCallbacksAndMessages(null);
|
||||
mCaller.sendMessage(msg);
|
||||
}
|
||||
|
||||
public void resizePreview(Rect position) {
|
||||
Message msg = mCaller.obtainMessageO(MSG_RESIZE_PREVIEW, position);
|
||||
mCaller.sendMessage(msg);
|
||||
@@ -2383,25 +2379,27 @@ public abstract class WallpaperService extends Service {
|
||||
engine.detach();
|
||||
Log.w(TAG, "Wallpaper host disappeared", e);
|
||||
return;
|
||||
} catch (IllegalStateException e) {
|
||||
Log.w(TAG, "Connector instance already destroyed, "
|
||||
+ "can't attach engine to non existing connector", e);
|
||||
return;
|
||||
} finally {
|
||||
Trace.endSection();
|
||||
}
|
||||
mActiveEngines.add(engine);
|
||||
Trace.beginSection("WPMS.engine.attach");
|
||||
engine.attach(this);
|
||||
Trace.endSection();
|
||||
}
|
||||
|
||||
private void doDetachEngine() {
|
||||
mActiveEngines.remove(mEngine);
|
||||
mEngine.detach();
|
||||
// Some wallpapers will not trigger the rendering threads of the remaining engines even
|
||||
// if they are visible, so we need to toggle the state to get their attention.
|
||||
if (!mDetached.get()) {
|
||||
for (Engine eng : mActiveEngines) {
|
||||
if (eng.mVisible) {
|
||||
eng.doVisibilityChanged(false);
|
||||
eng.doVisibilityChanged(true);
|
||||
if (!mEngine.mDestroyed) {
|
||||
mEngine.detach();
|
||||
for (IWallpaperEngineWrapper engineWrapper : mActiveEngines.values()) {
|
||||
if (engineWrapper.mEngine != null && engineWrapper.mEngine.mVisible) {
|
||||
engineWrapper.mEngine.doVisibilityChanged(false);
|
||||
engineWrapper.mEngine.doVisibilityChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2409,12 +2407,6 @@ public abstract class WallpaperService extends Service {
|
||||
|
||||
@Override
|
||||
public void executeMessage(Message message) {
|
||||
if (mDetached.get()) {
|
||||
if (mActiveEngines.contains(mEngine)) {
|
||||
doDetachEngine();
|
||||
}
|
||||
return;
|
||||
}
|
||||
switch (message.what) {
|
||||
case DO_ATTACH: {
|
||||
Trace.beginSection("WPMS.DO_ATTACH");
|
||||
@@ -2525,7 +2517,6 @@ public abstract class WallpaperService extends Service {
|
||||
*/
|
||||
class IWallpaperServiceWrapper extends IWallpaperService.Stub {
|
||||
private final WallpaperService mTarget;
|
||||
private IWallpaperEngineWrapper mEngineWrapper;
|
||||
|
||||
public IWallpaperServiceWrapper(WallpaperService context) {
|
||||
mTarget = context;
|
||||
@@ -2536,14 +2527,27 @@ public abstract class WallpaperService extends Service {
|
||||
int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding,
|
||||
int displayId, @SetWallpaperFlags int which) {
|
||||
Trace.beginSection("WPMS.ServiceWrapper.attach");
|
||||
mEngineWrapper = new IWallpaperEngineWrapper(mTarget, conn, windowToken,
|
||||
windowType, isPreview, reqWidth, reqHeight, padding, displayId, which);
|
||||
IWallpaperEngineWrapper engineWrapper =
|
||||
new IWallpaperEngineWrapper(mTarget, conn, windowToken, windowType,
|
||||
isPreview, reqWidth, reqHeight, padding, displayId, which);
|
||||
mActiveEngines.put(windowToken, engineWrapper);
|
||||
if (DEBUG) {
|
||||
Slog.v(TAG, "IWallpaperServiceWrapper Attaching window token " + windowToken);
|
||||
}
|
||||
Trace.endSection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detach() {
|
||||
mEngineWrapper.detach();
|
||||
public void detach(IBinder windowToken) {
|
||||
IWallpaperEngineWrapper engineWrapper = mActiveEngines.remove(windowToken);
|
||||
if (engineWrapper == null) {
|
||||
Log.w(TAG, "Engine for window token " + windowToken + " already detached");
|
||||
return;
|
||||
}
|
||||
if (DEBUG) {
|
||||
Slog.v(TAG, "IWallpaperServiceWrapper Detaching window token " + windowToken);
|
||||
}
|
||||
engineWrapper.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2558,8 +2562,8 @@ public abstract class WallpaperService extends Service {
|
||||
public void onDestroy() {
|
||||
Trace.beginSection("WPMS.onDestroy");
|
||||
super.onDestroy();
|
||||
for (int i=0; i<mActiveEngines.size(); i++) {
|
||||
mActiveEngines.get(i).detach();
|
||||
for (IWallpaperEngineWrapper engineWrapper : mActiveEngines.values()) {
|
||||
engineWrapper.destroy();
|
||||
}
|
||||
mActiveEngines.clear();
|
||||
Trace.endSection();
|
||||
@@ -2586,8 +2590,12 @@ public abstract class WallpaperService extends Service {
|
||||
@Override
|
||||
protected void dump(FileDescriptor fd, PrintWriter out, String[] args) {
|
||||
out.print("State of wallpaper "); out.print(this); out.println(":");
|
||||
for (int i=0; i<mActiveEngines.size(); i++) {
|
||||
Engine engine = mActiveEngines.get(i);
|
||||
for (IWallpaperEngineWrapper engineWrapper : mActiveEngines.values()) {
|
||||
Engine engine = engineWrapper.mEngine;
|
||||
if (engine == null) {
|
||||
Slog.w(TAG, "Engine for wrapper " + engineWrapper + " not attached");
|
||||
continue;
|
||||
}
|
||||
out.print(" Engine "); out.print(engine); out.println(":");
|
||||
engine.dump(" ", fd, out, args);
|
||||
}
|
||||
|
||||
@@ -772,7 +772,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
|
||||
DisplayConnector connector =
|
||||
targetWallpaper.connection.getDisplayConnectorOrCreate(displayId);
|
||||
if (connector == null) return;
|
||||
connector.disconnectLocked();
|
||||
connector.disconnectLocked(targetWallpaper.connection);
|
||||
targetWallpaper.connection.removeDisplayConnector(displayId);
|
||||
mWallpaperDisplayHelper.removeDisplayData(displayId);
|
||||
}
|
||||
@@ -859,7 +859,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
|
||||
if (fallbackConnection.mDisplayConnector.size() != 0) {
|
||||
fallbackConnection.forEachDisplayConnector(connector -> {
|
||||
if (connector.mEngine != null) {
|
||||
connector.disconnectLocked();
|
||||
connector.disconnectLocked(fallbackConnection);
|
||||
}
|
||||
});
|
||||
fallbackConnection.mDisplayConnector.clear();
|
||||
@@ -940,16 +940,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
|
||||
t.traceEnd();
|
||||
}
|
||||
|
||||
void disconnectLocked() {
|
||||
void disconnectLocked(WallpaperConnection connection) {
|
||||
if (DEBUG) Slog.v(TAG, "Removing window token: " + mToken);
|
||||
mWindowManagerInternal.removeWindowToken(mToken, false/* removeWindows */,
|
||||
mDisplayId);
|
||||
try {
|
||||
if (mEngine != null) {
|
||||
mEngine.destroy();
|
||||
}
|
||||
connection.mService.detach(mToken);
|
||||
} catch (RemoteException e) {
|
||||
Slog.w(TAG, "Engine.destroy() threw a RemoteException");
|
||||
Slog.w(TAG, "connection.mService.destroy() threw a RemoteException");
|
||||
}
|
||||
mEngine = null;
|
||||
}
|
||||
@@ -1249,12 +1247,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
|
||||
synchronized (mLock) {
|
||||
final DisplayConnector connector = getDisplayConnectorOrCreate(displayId);
|
||||
if (connector == null) {
|
||||
try {
|
||||
engine.destroy();
|
||||
} catch (RemoteException e) {
|
||||
Slog.w(TAG, "Failed to destroy engine", e);
|
||||
}
|
||||
return;
|
||||
throw new IllegalStateException("Connector has already been destroyed");
|
||||
}
|
||||
connector.mEngine = engine;
|
||||
connector.ensureStatusHandled();
|
||||
@@ -3261,20 +3254,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
|
||||
}
|
||||
wallpaper.connection.mReply = null;
|
||||
}
|
||||
try {
|
||||
// It can be null if user switching happens before service connection.
|
||||
if (wallpaper.connection.mService != null) {
|
||||
wallpaper.connection.mService.detach();
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
Slog.w(TAG, "Failed detaching wallpaper service ", e);
|
||||
}
|
||||
try {
|
||||
mContext.unbindService(wallpaper.connection);
|
||||
} catch (IllegalArgumentException e) {
|
||||
Slog.w(TAG, "Attempted to unbind unregistered service");
|
||||
}
|
||||
wallpaper.connection.forEachDisplayConnector(DisplayConnector::disconnectLocked);
|
||||
wallpaper.connection.forEachDisplayConnector(
|
||||
connector -> connector.disconnectLocked(wallpaper.connection));
|
||||
wallpaper.connection.mService = null;
|
||||
wallpaper.connection.mDisplayConnector.clear();
|
||||
|
||||
@@ -3284,6 +3265,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
|
||||
mContext.getMainThreadHandler().removeCallbacks(
|
||||
wallpaper.connection.mTryToRebindRunnable);
|
||||
|
||||
mContext.unbindService(wallpaper.connection);
|
||||
wallpaper.connection = null;
|
||||
if (wallpaper == mLastWallpaper) {
|
||||
mLastWallpaper = null;
|
||||
|
||||
Reference in New Issue
Block a user