diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index f6733047d9656..02cd406547e51 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -2855,21 +2855,62 @@ public class WallpaperManager { } } - // Check if the package exists - if (cn != null) { - try { - final PackageManager packageManager = context.getPackageManager(); - packageManager.getPackageInfo(cn.getPackageName(), - PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE); - } catch (PackageManager.NameNotFoundException e) { - cn = null; - } + if (!isComponentExist(context, cn)) { + cn = null; } return cn; } + /** + * Return {@link ComponentName} of the CMF default wallpaper, or + * {@link #getDefaultWallpaperComponent(Context)} if none is defined. + * + * @hide + */ + public static ComponentName getCmfDefaultWallpaperComponent(Context context) { + ComponentName cn = null; + String[] cmfWallpaperMap = context.getResources().getStringArray( + com.android.internal.R.array.cmf_default_wallpaper_component); + if (cmfWallpaperMap == null || cmfWallpaperMap.length == 0) { + Log.d(TAG, "No CMF wallpaper config"); + return getDefaultWallpaperComponent(context); + } + + for (String entry : cmfWallpaperMap) { + String[] cmfWallpaper; + if (!TextUtils.isEmpty(entry)) { + cmfWallpaper = entry.split(","); + if (cmfWallpaper != null && cmfWallpaper.length == 2 && VALUE_CMF_COLOR.equals( + cmfWallpaper[0]) && !TextUtils.isEmpty(cmfWallpaper[1])) { + cn = ComponentName.unflattenFromString(cmfWallpaper[1]); + break; + } + } + } + + if (!isComponentExist(context, cn)) { + cn = null; + } + + return cn; + } + + private static boolean isComponentExist(Context context, ComponentName cn) { + if (cn == null) { + return false; + } + try { + final PackageManager packageManager = context.getPackageManager(); + packageManager.getPackageInfo(cn.getPackageName(), + PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE); + } catch (PackageManager.NameNotFoundException e) { + return false; + } + return true; + } + /** * Register a callback for lock wallpaper observation. Only the OS may use this. * diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 50aec835cc31b..3be216ee83793 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1825,6 +1825,16 @@ specified --> @null + + + + + @null diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 218bbc24bbe60..0e72d1839e920 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2110,6 +2110,7 @@ + diff --git a/services/core/java/com/android/server/WallpaperUpdateReceiver.java b/services/core/java/com/android/server/WallpaperUpdateReceiver.java index 99178920cc528..2812233815a63 100644 --- a/services/core/java/com/android/server/WallpaperUpdateReceiver.java +++ b/services/core/java/com/android/server/WallpaperUpdateReceiver.java @@ -88,7 +88,7 @@ public class WallpaperUpdateReceiver extends BroadcastReceiver { } else { //live wallpaper ComponentName currCN = info.getComponent(); - ComponentName defaultCN = WallpaperManager.getDefaultWallpaperComponent(context); + ComponentName defaultCN = WallpaperManager.getCmfDefaultWallpaperComponent(context); if (!currCN.equals(defaultCN)) { return true; } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 4c8f5132e00e5..5b616c56ab46f 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1583,7 +1583,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub mShuttingDown = false; mImageWallpaper = ComponentName.unflattenFromString( context.getResources().getString(R.string.image_wallpaper_component)); - mDefaultWallpaperComponent = WallpaperManager.getDefaultWallpaperComponent(context); + mDefaultWallpaperComponent = WallpaperManager.getCmfDefaultWallpaperComponent(context); mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class); mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); mIPackageManager = AppGlobals.getPackageManager(); diff --git a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java index f8955edab1d74..3d0163d849297 100644 --- a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java @@ -172,12 +172,12 @@ public class WallpaperManagerServiceTests { sImageWallpaperComponentName = ComponentName.unflattenFromString( sContext.getResources().getString(R.string.image_wallpaper_component)); // Mock default wallpaper as image wallpaper if there is no pre-defined default wallpaper. - sDefaultWallpaperComponent = WallpaperManager.getDefaultWallpaperComponent(sContext); + sDefaultWallpaperComponent = WallpaperManager.getCmfDefaultWallpaperComponent(sContext); if (sDefaultWallpaperComponent == null) { sDefaultWallpaperComponent = sImageWallpaperComponentName; doReturn(sImageWallpaperComponentName).when(() -> - WallpaperManager.getDefaultWallpaperComponent(any())); + WallpaperManager.getCmfDefaultWallpaperComponent(any())); } else { sContext.addMockService(sDefaultWallpaperComponent, sWallpaperService); }