Avoid sending messages of destroyed Engine
And app can call notifyColorsChanged() on a destroyed engine, which would cause problems, given it doesn't have a surface anymore. The same is true to visibility notification, where the engine can be destroyed before it had the opportuinity of drawing its first frame (if it had to load large assets for example) Test: manually change wallpapers Test: WallpaperServiceTest (both CTS and internal) Fixes: 291053623 Change-Id: Iff83603695cff491f2045586d5b3f4658f7ae55a
This commit is contained in:
@@ -868,6 +868,11 @@ public abstract class WallpaperService extends Service {
|
||||
* This will trigger a {@link #onComputeColors()} call.
|
||||
*/
|
||||
public void notifyColorsChanged() {
|
||||
if (mDestroyed) {
|
||||
Log.i(TAG, "Ignoring notifyColorsChanged(), Engine has already been destroyed.");
|
||||
return;
|
||||
}
|
||||
|
||||
final long now = mClockFunction.get();
|
||||
if (now - mLastColorInvalidation < NOTIFY_COLORS_RATE_LIMIT_MS) {
|
||||
Log.w(TAG, "This call has been deferred. You should only call "
|
||||
@@ -2226,7 +2231,11 @@ public abstract class WallpaperService extends Service {
|
||||
}
|
||||
}
|
||||
|
||||
void detach() {
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@VisibleForTesting
|
||||
public void detach() {
|
||||
if (mDestroyed) {
|
||||
return;
|
||||
}
|
||||
@@ -2442,6 +2451,14 @@ public abstract class WallpaperService extends Service {
|
||||
}
|
||||
|
||||
public void reportShown() {
|
||||
if (mEngine == null) {
|
||||
Log.i(TAG, "Can't report null engine as shown.");
|
||||
return;
|
||||
}
|
||||
if (mEngine.mDestroyed) {
|
||||
Log.i(TAG, "Engine was destroyed before we could draw.");
|
||||
return;
|
||||
}
|
||||
if (!mShownReported) {
|
||||
mShownReported = true;
|
||||
Trace.beginSection("WPMS.mConnection.engineShown");
|
||||
|
||||
4
tests/Internal/src/android/service/wallpaper/OWNERS
Normal file
4
tests/Internal/src/android/service/wallpaper/OWNERS
Normal file
@@ -0,0 +1,4 @@
|
||||
dupin@google.com
|
||||
santie@google.com
|
||||
pomini@google.com
|
||||
poultney@google.com
|
||||
@@ -85,4 +85,17 @@ public class WallpaperServiceTest {
|
||||
assertEquals("onAmbientModeChanged should have been called", 2, zoomChangedCount[0]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotifyColorsOfDestroyedEngine_doesntCrash() {
|
||||
WallpaperService service = new WallpaperService() {
|
||||
@Override
|
||||
public Engine onCreateEngine() {
|
||||
return new Engine();
|
||||
}
|
||||
};
|
||||
WallpaperService.Engine engine = service.onCreateEngine();
|
||||
engine.detach();
|
||||
|
||||
engine.notifyColorsChanged();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user