diff --git a/core/java/android/app/WallpaperInfo.java b/core/java/android/app/WallpaperInfo.java index 74132a3783be4..e3a05af8fa354 100644 --- a/core/java/android/app/WallpaperInfo.java +++ b/core/java/android/app/WallpaperInfo.java @@ -142,9 +142,13 @@ public final class WallpaperInfo implements Parcelable { mShowMetadataInPreview = sa.getBoolean( com.android.internal.R.styleable.Wallpaper_showMetadataInPreview, false); + + // Watch wallpapers support ambient mode by default. + final boolean defSupportsAmbientMode = + pm.hasSystemFeature(PackageManager.FEATURE_WATCH); mSupportsAmbientMode = sa.getBoolean( com.android.internal.R.styleable.Wallpaper_supportsAmbientMode, - false); + defSupportsAmbientMode); mShouldUseDefaultUnfoldTransition = sa.getBoolean( com.android.internal.R.styleable .Wallpaper_shouldUseDefaultUnfoldTransition, true); diff --git a/core/java/android/service/wallpaper/IWallpaperService.aidl b/core/java/android/service/wallpaper/IWallpaperService.aidl index da56b4b2f5742..3262f3a9fdfb5 100644 --- a/core/java/android/service/wallpaper/IWallpaperService.aidl +++ b/core/java/android/service/wallpaper/IWallpaperService.aidl @@ -16,6 +16,7 @@ package android.service.wallpaper; +import android.app.WallpaperInfo; import android.graphics.Rect; import android.service.wallpaper.IWallpaperConnection; @@ -25,6 +26,7 @@ import android.service.wallpaper.IWallpaperConnection; oneway interface IWallpaperService { void attach(IWallpaperConnection connection, IBinder windowToken, int windowType, boolean isPreview, - int reqWidth, int reqHeight, in Rect padding, int displayId, int which); + int reqWidth, int reqHeight, in Rect padding, int displayId, int which, + in WallpaperInfo info); void detach(IBinder windowToken); } diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index dbc1be1415715..cc3a662870bb9 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -1606,8 +1606,13 @@ public abstract class WallpaperService extends Service { if (!mDestroyed) { mDisplayState = mDisplay == null ? Display.STATE_UNKNOWN : mDisplay.getCommittedState(); - boolean displayVisible = Display.isOnState(mDisplayState) && !mIsScreenTurningOn; - boolean visible = mVisible && displayVisible; + boolean displayFullyOn = Display.isOnState(mDisplayState) && !mIsScreenTurningOn; + boolean supportsAmbientMode = + mIWallpaperEngine.mInfo == null + ? false + : mIWallpaperEngine.mInfo.supportsAmbientMode(); + // Report visibility only if display is fully on or wallpaper supports ambient mode. + boolean visible = mVisible && (displayFullyOn || supportsAmbientMode); if (DEBUG) { Log.v( TAG, @@ -2060,7 +2065,7 @@ public abstract class WallpaperService extends Service { } private void updateFrozenState(boolean frozenRequested) { - if (mIWallpaperEngine.mWallpaperManager.getWallpaperInfo() == null + if (mIWallpaperEngine.mInfo == null // Procees the unfreeze command in case the wallaper became static while // being paused. && frozenRequested) { @@ -2355,6 +2360,7 @@ public abstract class WallpaperService extends Service { final DisplayManager mDisplayManager; final Display mDisplay; final WallpaperManager mWallpaperManager; + @Nullable final WallpaperInfo mInfo; Engine mEngine; @SetWallpaperFlags int mWhich; @@ -2362,7 +2368,7 @@ public abstract class WallpaperService extends Service { IWallpaperEngineWrapper(WallpaperService service, IWallpaperConnection conn, IBinder windowToken, int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding, - int displayId, @SetWallpaperFlags int which) { + int displayId, @SetWallpaperFlags int which, @Nullable WallpaperInfo info) { mWallpaperManager = getSystemService(WallpaperManager.class); mCaller = new HandlerCaller(service, service.onProvideEngineLooper(), this, true); mConnection = conn; @@ -2374,6 +2380,7 @@ public abstract class WallpaperService extends Service { mDisplayPadding.set(padding); mDisplayId = displayId; mWhich = which; + mInfo = info; // Create a display context before onCreateEngine. mDisplayManager = getSystemService(DisplayManager.class); @@ -2447,8 +2454,7 @@ public abstract class WallpaperService extends Service { Trace.beginSection("WPMS.mConnection.engineShown"); try { mConnection.engineShown(this); - Log.d(TAG, "Wallpaper has updated the surface:" - + mWallpaperManager.getWallpaperInfo()); + Log.d(TAG, "Wallpaper has updated the surface:" + mInfo); } catch (RemoteException e) { Log.w(TAG, "Wallpaper host disappeared", e); } @@ -2702,11 +2708,11 @@ public abstract class WallpaperService extends Service { @Override public void attach(IWallpaperConnection conn, IBinder windowToken, int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding, - int displayId, @SetWallpaperFlags int which) { + int displayId, @SetWallpaperFlags int which, @Nullable WallpaperInfo info) { Trace.beginSection("WPMS.ServiceWrapper.attach"); IWallpaperEngineWrapper engineWrapper = new IWallpaperEngineWrapper(mTarget, conn, windowToken, windowType, - isPreview, reqWidth, reqHeight, padding, displayId, which); + isPreview, reqWidth, reqHeight, padding, displayId, which, info); synchronized (mActiveEngines) { mActiveEngines.put(windowToken, engineWrapper); } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 11d1126c9ae40..17b460b511054 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -955,7 +955,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub try { connection.mService.attach(connection, mToken, TYPE_WALLPAPER, false, wpdData.mWidth, wpdData.mHeight, - wpdData.mPadding, mDisplayId, wallpaper.mWhich); + wpdData.mPadding, mDisplayId, wallpaper.mWhich, connection.mInfo); } catch (RemoteException e) { Slog.w(TAG, "Failed attaching wallpaper on display", e); if (wallpaper != null && !wallpaper.wallpaperUpdating @@ -3588,7 +3588,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub final int hasPrivilege = mIPackageManager.checkPermission( android.Manifest.permission.AMBIENT_WALLPAPER, wi.getPackageName(), serviceUserId); - if (hasPrivilege != PERMISSION_GRANTED) { + // All watch wallpapers support ambient mode by default. + if (hasPrivilege != PERMISSION_GRANTED + && !mIPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH, 0)) { String msg = "Selected service does not have " + android.Manifest.permission.AMBIENT_WALLPAPER + ": " + componentName;