am 27d6e65b: Merge change I322b6ee7 into eclair

Merge commit '27d6e65b71f515deafbd93d5aa98732898c34ddf' into eclair-mr2

* commit '27d6e65b71f515deafbd93d5aa98732898c34ddf':
  Add support for making a LiveWallpaper the default
This commit is contained in:
Mike Cleron
2009-11-13 11:11:42 -08:00
committed by Android Git Automerger
2 changed files with 39 additions and 25 deletions

View File

@@ -214,4 +214,8 @@
it will be removed when the lower-level touch driver generates better it will be removed when the lower-level touch driver generates better
data. --> data. -->
<bool name="config_filterTouchEvents">false</bool> <bool name="config_filterTouchEvents">false</bool>
<!-- Component name of the default wallpaper. This will be ImageWallpaper if not
specified -->
<string name="default_wallpaper_component">@null</string>
</resources> </resources>

View File

@@ -164,7 +164,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
if ((mLastDiedTime+MIN_WALLPAPER_CRASH_TIME) if ((mLastDiedTime+MIN_WALLPAPER_CRASH_TIME)
< SystemClock.uptimeMillis()) { < SystemClock.uptimeMillis()) {
Log.w(TAG, "Reverting to built-in wallpaper!"); Log.w(TAG, "Reverting to built-in wallpaper!");
bindWallpaperComponentLocked(null); bindWallpaperComponentLocked(null, false);
} }
} }
} }
@@ -203,11 +203,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
public void systemReady() { public void systemReady() {
synchronized (mLock) { synchronized (mLock) {
try { try {
bindWallpaperComponentLocked(mWallpaperComponent); bindWallpaperComponentLocked(mWallpaperComponent, false);
} catch (RuntimeException e) { } catch (RuntimeException e) {
Log.w(TAG, "Failure starting previous wallpaper", e); Log.w(TAG, "Failure starting previous wallpaper", e);
try { try {
bindWallpaperComponentLocked(null); bindWallpaperComponentLocked(null, false);
} catch (RuntimeException e2) { } catch (RuntimeException e2) {
Log.w(TAG, "Failure starting default wallpaper", e2); Log.w(TAG, "Failure starting default wallpaper", e2);
clearWallpaperComponentLocked(); clearWallpaperComponentLocked();
@@ -224,7 +224,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
} }
final long ident = Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity();
try { try {
bindWallpaperComponentLocked(null); bindWallpaperComponentLocked(null, false);
} finally { } finally {
Binder.restoreCallingIdentity(ident); Binder.restoreCallingIdentity(ident);
} }
@@ -307,7 +307,8 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
try { try {
ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name); ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name);
if (pfd != null) { if (pfd != null) {
bindWallpaperComponentLocked(null); // Bind the wallpaper to an ImageWallpaper
bindWallpaperComponentLocked(null, true);
saveSettingsLocked(); saveSettingsLocked();
} }
return pfd; return pfd;
@@ -335,48 +336,57 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
synchronized (mLock) { synchronized (mLock) {
final long ident = Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity();
try { try {
bindWallpaperComponentLocked(name); bindWallpaperComponentLocked(name, false);
} finally { } finally {
Binder.restoreCallingIdentity(ident); Binder.restoreCallingIdentity(ident);
} }
} }
} }
void bindWallpaperComponentLocked(ComponentName name) { void bindWallpaperComponentLocked(ComponentName componentName, boolean isBitmap) {
// Has the component changed? // Has the component changed?
if (mWallpaperConnection != null) { if (mWallpaperConnection != null) {
if (mWallpaperComponent == null) { if (mWallpaperComponent == null) {
if (name == null) { if (componentName == null) {
// Still using default wallpaper. // Still using default wallpaper.
return; return;
} }
} else if (mWallpaperComponent.equals(name)) { } else if (mWallpaperComponent.equals(componentName)) {
// Changing to same wallpaper. // Changing to same wallpaper.
return; return;
} }
} }
try { try {
ComponentName realName = name; ComponentName realComponentName = componentName;
if (realName == null) { if (realComponentName == null) {
// The default component is our static image wallpaper. String defaultComponent =
realName = new ComponentName("android", mContext.getString(com.android.internal.R.string.default_wallpaper_component);
ImageWallpaper.class.getName()); if (defaultComponent != null && !isBitmap) {
//clearWallpaperComponentLocked(); // See if there is a default wallpaper component specified
//return; // Only look for this if the wallpaper is not being set to a bitmap
realComponentName = ComponentName.unflattenFromString(defaultComponent);
}
if (realComponentName == null) {
// Fall back to static image wallpaper
realComponentName = new ComponentName("android",
ImageWallpaper.class.getName());
//clearWallpaperComponentLocked();
//return;
}
} }
ServiceInfo si = mContext.getPackageManager().getServiceInfo(realName, ServiceInfo si = mContext.getPackageManager().getServiceInfo(realComponentName,
PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS); PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS);
if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) { if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) {
throw new SecurityException("Selected service does not require " throw new SecurityException("Selected service does not require "
+ android.Manifest.permission.BIND_WALLPAPER + android.Manifest.permission.BIND_WALLPAPER
+ ": " + realName); + ": " + realComponentName);
} }
WallpaperInfo wi = null; WallpaperInfo wi = null;
Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE); Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE);
if (name != null) { if (componentName != null) {
// Make sure the selected service is actually a wallpaper service. // Make sure the selected service is actually a wallpaper service.
List<ResolveInfo> ris = mContext.getPackageManager() List<ResolveInfo> ris = mContext.getPackageManager()
.queryIntentServices(intent, PackageManager.GET_META_DATA); .queryIntentServices(intent, PackageManager.GET_META_DATA);
@@ -396,13 +406,13 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
} }
if (wi == null) { if (wi == null) {
throw new SecurityException("Selected service is not a wallpaper: " throw new SecurityException("Selected service is not a wallpaper: "
+ realName); + realComponentName);
} }
} }
// Bind the service! // Bind the service!
WallpaperConnection newConn = new WallpaperConnection(wi); WallpaperConnection newConn = new WallpaperConnection(wi);
intent.setComponent(realName); intent.setComponent(realComponentName);
intent.putExtra(Intent.EXTRA_CLIENT_LABEL, intent.putExtra(Intent.EXTRA_CLIENT_LABEL,
com.android.internal.R.string.wallpaper_binding_label); com.android.internal.R.string.wallpaper_binding_label);
intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity( intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity(
@@ -413,11 +423,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
if (!mContext.bindService(intent, newConn, if (!mContext.bindService(intent, newConn,
Context.BIND_AUTO_CREATE)) { Context.BIND_AUTO_CREATE)) {
throw new IllegalArgumentException("Unable to bind service: " throw new IllegalArgumentException("Unable to bind service: "
+ name); + componentName);
} }
clearWallpaperComponentLocked(); clearWallpaperComponentLocked();
mWallpaperComponent = name; mWallpaperComponent = componentName;
mWallpaperConnection = newConn; mWallpaperConnection = newConn;
mLastDiedTime = SystemClock.uptimeMillis(); mLastDiedTime = SystemClock.uptimeMillis();
try { try {
@@ -428,7 +438,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
} }
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
throw new IllegalArgumentException("Unknown component " + name); throw new IllegalArgumentException("Unknown component " + componentName);
} }
} }
@@ -459,7 +469,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub {
mWidth, mHeight); mWidth, mHeight);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.w(TAG, "Failed attaching wallpaper; clearing", e); Log.w(TAG, "Failed attaching wallpaper; clearing", e);
bindWallpaperComponentLocked(null); bindWallpaperComponentLocked(null, false);
} }
} }