diff options
| -rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 4 | ||||
| -rw-r--r-- | core/java/android/app/WallpaperManager.java | 71 | ||||
| -rw-r--r-- | core/java/android/os/Build.java | 43 | ||||
| -rw-r--r-- | core/java/android/provider/Settings.java | 5 | ||||
| -rw-r--r-- | core/java/android/transition/Fade.java | 12 | ||||
| -rw-r--r-- | core/java/android/transition/Visibility.java | 3 | ||||
| -rwxr-xr-x | services/core/java/com/android/server/pm/PackageManagerService.java | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wallpaper/WallpaperManagerService.java | 9 | ||||
| -rw-r--r-- | services/java/com/android/server/SystemServer.java | 5 |
9 files changed, 128 insertions, 26 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 41afa3921a27..1780e03fea19 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -51,6 +51,7 @@ #include "BootAnimation.h" +#define OEM_BOOTANIMATION_FILE "/oem/media/bootanimation.zip" #define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip" #define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip" #define EXIT_PROP_NAME "service.bootanim.exit" @@ -283,6 +284,9 @@ status_t BootAnimation::readyToRun() { (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE)) != NULL)) || + ((access(OEM_BOOTANIMATION_FILE, R_OK) == 0) && + ((zipFile = ZipFileRO::open(OEM_BOOTANIMATION_FILE)) != NULL)) || + ((access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(SYSTEM_BOOTANIMATION_FILE)) != NULL))) { mZip = zipFile; diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index e6e0f350e74b..f08097b65f81 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -16,6 +16,7 @@ package android.app; +import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -44,10 +45,14 @@ import android.os.Looper; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.SystemProperties; +import android.text.TextUtils; import android.util.Log; import android.view.WindowManagerGlobal; import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -65,6 +70,11 @@ public class WallpaperManager { private float mWallpaperXStep = -1; private float mWallpaperYStep = -1; + /** {@hide} */ + private static final String PROP_WALLPAPER = "ro.config.wallpaper"; + /** {@hide} */ + private static final String PROP_WALLPAPER_COMPONENT = "ro.config.wallpaper_component"; + /** * Activity Action: Show settings for choosing wallpaper. Do not use directly to construct * an intent; instead, use {@link #getCropAndSetWallpaperIntent}. @@ -298,8 +308,7 @@ public class WallpaperManager { private Bitmap getDefaultWallpaperLocked(Context context) { try { - InputStream is = context.getResources().openRawResource( - com.android.internal.R.drawable.default_wallpaper); + InputStream is = openDefaultWallpaper(context); if (is != null) { int width = mService.getWidthHint(); int height = mService.getHeightHint(); @@ -403,8 +412,7 @@ public class WallpaperManager { horizontalAlignment = Math.max(0, Math.min(1, horizontalAlignment)); verticalAlignment = Math.max(0, Math.min(1, verticalAlignment)); - InputStream is = new BufferedInputStream( - resources.openRawResource(com.android.internal.R.drawable.default_wallpaper)); + InputStream is = new BufferedInputStream(openDefaultWallpaper(mContext)); if (is == null) { Log.e(TAG, "default wallpaper input stream is null"); @@ -429,8 +437,7 @@ public class WallpaperManager { } } - is = new BufferedInputStream(resources.openRawResource( - com.android.internal.R.drawable.default_wallpaper)); + is = new BufferedInputStream(openDefaultWallpaper(mContext)); RectF cropRectF; @@ -479,8 +486,7 @@ public class WallpaperManager { if (crop == null) { // BitmapRegionDecoder has failed, try to crop in-memory - is = new BufferedInputStream(resources.openRawResource( - com.android.internal.R.drawable.default_wallpaper)); + is = new BufferedInputStream(openDefaultWallpaper(mContext)); Bitmap fullSize = null; if (is != null) { BitmapFactory.Options options = new BitmapFactory.Options(); @@ -1009,6 +1015,53 @@ public class WallpaperManager { * wallpaper. */ public void clear() throws IOException { - setResource(com.android.internal.R.drawable.default_wallpaper); + setStream(openDefaultWallpaper(mContext)); + } + + /** + * Open stream representing the default static image wallpaper. + * + * @hide + */ + public static InputStream openDefaultWallpaper(Context context) { + final String path = SystemProperties.get(PROP_WALLPAPER); + if (!TextUtils.isEmpty(path)) { + final File file = new File(path); + if (file.exists()) { + try { + return new FileInputStream(file); + } catch (IOException e) { + // Ignored, fall back to platform default below + } + } + } + return context.getResources().openRawResource( + com.android.internal.R.drawable.default_wallpaper); + } + + /** + * Return {@link ComponentName} of the default live wallpaper, or + * {@code null} if none is defined. + * + * @hide + */ + public static ComponentName getDefaultWallpaperComponent(Context context) { + String flat = SystemProperties.get(PROP_WALLPAPER_COMPONENT); + if (!TextUtils.isEmpty(flat)) { + final ComponentName cn = ComponentName.unflattenFromString(flat); + if (cn != null) { + return cn; + } + } + + flat = context.getString(com.android.internal.R.string.default_wallpaper_component); + if (!TextUtils.isEmpty(flat)) { + final ComponentName cn = ComponentName.unflattenFromString(flat); + if (cn != null) { + return cn; + } + } + + return null; } } diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 11e379523bc2..0336dd659ce1 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -16,12 +16,17 @@ package android.os; +import android.text.TextUtils; +import android.util.Slog; + import com.android.internal.telephony.TelephonyProperties; /** * Information about the current build, extracted from system properties. */ public class Build { + private static final String TAG = "Build"; + /** Value used for when a build property is unknown. */ public static final String UNKNOWN = "unknown"; @@ -509,7 +514,43 @@ public class Build { public static final String TAGS = getString("ro.build.tags"); /** A string that uniquely identifies this build. Do not attempt to parse this value. */ - public static final String FINGERPRINT = getString("ro.build.fingerprint"); + public static final String FINGERPRINT = deriveFingerprint(); + + /** + * Some devices split the fingerprint components between multiple + * partitions, so we might derive the fingerprint at runtime. + */ + private static String deriveFingerprint() { + String finger = SystemProperties.get("ro.build.fingerprint"); + if (TextUtils.isEmpty(finger)) { + finger = getString("ro.product.brand") + '/' + + getString("ro.product.name") + '/' + + getString("ro.product.device") + ':' + + getString("ro.build.version.release") + '/' + + getString("ro.build.id") + '/' + + getString("ro.build.version.incremental") + ':' + + getString("ro.build.type") + '/' + + getString("ro.build.tags"); + } + return finger; + } + + /** + * Ensure that raw fingerprint system property is defined. If it was derived + * dynamically by {@link #deriveFingerprint()} this is where we push the + * derived value into the property service. + * + * @hide + */ + public static void ensureFingerprintProperty() { + if (TextUtils.isEmpty(SystemProperties.get("ro.build.fingerprint"))) { + try { + SystemProperties.set("ro.build.fingerprint", FINGERPRINT); + } catch (IllegalArgumentException e) { + Slog.e(TAG, "Failed to set fingerprint property", e); + } + } + } // The following properties only make sense for internal engineering builds. public static final long TIME = getLong("ro.build.date.utc") * 1000; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index b578b48692be..ab0623080993 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -764,6 +764,11 @@ public final class Settings { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_ZEN_MODE_SETTINGS = "android.settings.ZEN_MODE_SETTINGS"; + /** {@hide} */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String + ACTION_SHOW_REGULATORY_INFO = "android.settings.SHOW_REGULATORY_INFO"; + // End of Intent actions for Settings /** diff --git a/core/java/android/transition/Fade.java b/core/java/android/transition/Fade.java index 08e27d33ff47..e70dc0cc7961 100644 --- a/core/java/android/transition/Fade.java +++ b/core/java/android/transition/Fade.java @@ -105,7 +105,7 @@ public class Fade extends Visibility { if (DBG) { Log.d(LOG_TAG, "Created animator " + anim); } - FadeAnimatorListener listener = new FadeAnimatorListener(view, endAlpha); + FadeAnimatorListener listener = new FadeAnimatorListener(view); anim.addListener(listener); anim.addPauseListener(listener); return anim; @@ -138,13 +138,11 @@ public class Fade extends Visibility { private static class FadeAnimatorListener extends AnimatorListenerAdapter { private final View mView; - private final float mEndAlpha; private boolean mCanceled = false; - private float mPausedAlpha; + private float mPausedAlpha = -1; - public FadeAnimatorListener(View view, float endAlpha) { + public FadeAnimatorListener(View view) { mView = view; - mEndAlpha = endAlpha; } @Override @@ -158,14 +156,14 @@ public class Fade extends Visibility { @Override public void onAnimationEnd(Animator animator) { if (!mCanceled) { - mView.setTransitionAlpha(mEndAlpha); + mView.setTransitionAlpha(1); } } @Override public void onAnimationPause(Animator animator) { mPausedAlpha = mView.getTransitionAlpha(); - mView.setTransitionAlpha(mEndAlpha); + mView.setTransitionAlpha(1); } @Override diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java index 526803a6e554..6e6496cd1431 100644 --- a/core/java/android/transition/Visibility.java +++ b/core/java/android/transition/Visibility.java @@ -347,10 +347,11 @@ public abstract class Visibility extends Transition { } if (viewToKeep != null) { + int originalVisibility = viewToKeep.getVisibility(); viewToKeep.setVisibility(View.VISIBLE); Animator animator = onDisappear(sceneRoot, viewToKeep, startValues, endValues); if (animator == null) { - viewToKeep.setVisibility(finalVisibility); + viewToKeep.setVisibility(originalVisibility); } else { final View finalViewToKeep = viewToKeep; animator.addListener(new AnimatorListenerAdapter() { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index c401efb215e8..2c623b5f958e 100755 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5439,7 +5439,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (FileUtils.contains(Environment.getRootDirectory(), codePath)) { codeRoot = Environment.getRootDirectory(); } else if (FileUtils.contains(Environment.getOemDirectory(), codePath)) { - codeRoot = Environment.getRootDirectory(); + codeRoot = Environment.getOemDirectory(); } else if (FileUtils.contains(Environment.getVendorDirectory(), codePath)) { codeRoot = Environment.getVendorDirectory(); } else { diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 87953fe8554c..3eb2d5ff29f3 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -25,6 +25,7 @@ import android.app.IWallpaperManager; import android.app.IWallpaperManagerCallback; import android.app.PendingIntent; import android.app.WallpaperInfo; +import android.app.WallpaperManager; import android.app.backup.BackupManager; import android.app.backup.WallpaperBackupHelper; import android.content.BroadcastReceiver; @@ -844,13 +845,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { try { if (componentName == null) { - String defaultComponent = - mContext.getString(com.android.internal.R.string.default_wallpaper_component); - if (defaultComponent != null) { - // See if there is a default wallpaper component specified - componentName = ComponentName.unflattenFromString(defaultComponent); - if (DEBUG) Slog.v(TAG, "Use default component wallpaper:" + componentName); - } + componentName = WallpaperManager.getDefaultWallpaperComponent(mContext); if (componentName == null) { // Fall back to static image wallpaper componentName = IMAGE_WALLPAPER; diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 00d5468c84b9..08b1eba274b7 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -29,6 +29,7 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.media.AudioService; +import android.os.Build; import android.os.Environment; import android.os.FactoryTest; import android.os.Handler; @@ -201,6 +202,10 @@ public final class SystemServer { // as efficient as possible with its memory usage. VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); + // Some devices rely on runtime fingerprint generation, so make sure + // we've defined it before booting further. + Build.ensureFingerprintProperty(); + // Within the system server, it is an error to access Environment paths without // explicitly specifying a user. Environment.setUserRequired(true); |