WallpaperManagerService.java revision 3be63c09309b21c01b535271625d4c39045690e5
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.os.FileObserver.*; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.os.ParcelFileDescriptor.*; 21111bd4acdb378266221b430a284f88a3990a3958Christopher Tate 228cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.app.IWallpaperManager; 238cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.app.IWallpaperManagerCallback; 24111bd4acdb378266221b430a284f88a3990a3958Christopher Tateimport android.backup.BackupManager; 254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.ComponentName; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.ServiceConnection; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.pm.ResolveInfo; 314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.pm.ServiceInfo; 329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.content.pm.PackageManager.NameNotFoundException; 339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.content.res.Resources; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.IBinder; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileObserver; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteCallbackList; 404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.ServiceManager; 410cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackbornimport android.os.SystemClock; 424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperConnection; 434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperEngine; 444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperService; 454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.WallpaperService; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.util.Xml; 484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.IWindowManager; 494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManager; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.IOException; 529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.InputStream; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileInputStream; 569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileOutputStream; 574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport java.util.List; 589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParser; 609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParserException; 619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlSerializer; 629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 63f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackbornimport com.android.internal.service.wallpaper.ImageWallpaper; 649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport com.android.internal.util.FastXmlSerializer; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 668cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornclass WallpaperManagerService extends IWallpaperManager.Stub { 674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn static final String TAG = "WallpaperService"; 68cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn static final boolean DEBUG = false; 699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Object mLock = new Object(); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 720cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn /** 730cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn * Minimum time between crashes of a wallpaper service for us to consider 740cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn * restarting it vs. just reverting to the static wallpaper. 750cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn */ 760cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn static final long MIN_WALLPAPER_CRASH_TIME = 10000; 770cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn 780cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn static final File WALLPAPER_DIR = new File( 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "/data/data/com.android.settings/files"); 800cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn static final String WALLPAPER = "wallpaper"; 810cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn static final File WALLPAPER_FILE = new File(WALLPAPER_DIR, WALLPAPER); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of callbacks registered they should each be notified 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the wallpaper is changed. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 878cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn private final RemoteCallbackList<IWallpaperManagerCallback> mCallbacks 888cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn = new RemoteCallbackList<IWallpaperManagerCallback>(); 899bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Observes the wallpaper for changes and notifies all IWallpaperServiceCallbacks 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the wallpaper has changed. The CREATE is triggered when there is no 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wallpaper set and is created for the first time. The CLOSE_WRITE is triggered 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * everytime the wallpaper is changed. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final FileObserver mWallpaperObserver = new FileObserver( 979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato WALLPAPER_DIR.getAbsolutePath(), CREATE | CLOSE_WRITE | DELETE | DELETE_SELF) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onEvent(int event, String path) { 100e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato if (path == null) { 101e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato return; 102e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato } 1039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato synchronized (mLock) { 1049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato // changing the wallpaper means we'll need to back up the new one 1059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato long origId = Binder.clearCallingIdentity(); 1069bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato BackupManager bm = new BackupManager(mContext); 1079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato bm.dataChanged(); 1089bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato Binder.restoreCallingIdentity(origId); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato File changedFile = new File(WALLPAPER_DIR, path); 1119bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (WALLPAPER_FILE.equals(changedFile)) { 1129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato notifyCallbacksLocked(); 1139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final Context mContext; 1194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final IWindowManager mIWindowManager; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mWidth = -1; 1224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mHeight = -1; 1234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn String mName = ""; 1244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn ComponentName mWallpaperComponent; 1254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WallpaperConnection mWallpaperConnection; 1260cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn long mLastDiedTime; 1274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn class WallpaperConnection extends IWallpaperConnection.Stub 1294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn implements ServiceConnection { 1304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final Binder mToken = new Binder(); 1314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperService mService; 1324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperEngine mEngine; 1334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onServiceConnected(ComponentName name, IBinder service) { 1354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn synchronized (mLock) { 1364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (mWallpaperConnection == this) { 1374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mService = IWallpaperService.Stub.asInterface(service); 1384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn attachServiceLocked(this); 1394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onServiceDisconnected(ComponentName name) { 1444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn synchronized (mLock) { 1454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mService = null; 1464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mEngine = null; 1470cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn if (mWallpaperConnection == this) { 1480cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn Log.w(TAG, "Wallpaper service gone: " + mWallpaperComponent); 1490cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn if ((mLastDiedTime+MIN_WALLPAPER_CRASH_TIME) 1500cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn < SystemClock.uptimeMillis()) { 1510cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn Log.w(TAG, "Reverting to built-in wallpaper!"); 1520cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn bindWallpaperComponentLocked(null); 1530cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn } 1540cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn } 1554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void attachEngine(IWallpaperEngine engine) { 1594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mEngine = engine; 1604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public ParcelFileDescriptor setWallpaper(String name) { 1634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn synchronized (mLock) { 1644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (mWallpaperConnection == this) { 1654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name); 1664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (pfd != null) { 1674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn saveSettingsLocked(); 1684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return pfd; 1704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return null; 1724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1768cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public WallpaperManagerService(Context context) { 1774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (DEBUG) Log.d(TAG, "WallpaperService startup"); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mIWindowManager = IWindowManager.Stub.asInterface( 1804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn ServiceManager.getService(Context.WINDOW_SERVICE)); 181e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato WALLPAPER_DIR.mkdirs(); 1829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato loadSettingsLocked(); 183e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato mWallpaperObserver.startWatching(); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWallpaperObserver.stopWatching(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 192f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn public void systemReady() { 193f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn synchronized (mLock) { 194f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn try { 195f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn bindWallpaperComponentLocked(mWallpaperComponent); 196f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } catch (RuntimeException e) { 197f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn Log.w(TAG, "Failure starting previous wallpaper", e); 198f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn try { 199f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn bindWallpaperComponentLocked(null); 200f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } catch (RuntimeException e2) { 201f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn Log.w(TAG, "Failure starting default wallpaper", e2); 202f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn clearWallpaperComponentLocked(); 203f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 204f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 205f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 206f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 207f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearWallpaper() { 2099bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato synchronized (mLock) { 2109bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato File f = WALLPAPER_FILE; 2119bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (f.exists()) { 2129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato f.delete(); 2139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 2140cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn final long ident = Binder.clearCallingIdentity(); 2150cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn try { 2160cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn bindWallpaperComponentLocked(null); 2170cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn } finally { 2180cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn Binder.restoreCallingIdentity(ident); 2190cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDimensionHints(int width, int height) throws RemoteException { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkPermission(android.Manifest.permission.SET_WALLPAPER_HINTS); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (width <= 0 || height <= 0) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("width and height must be > 0"); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato synchronized (mLock) { 2319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (width != mWidth || height != mHeight) { 2329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mWidth = width; 2339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mHeight = height; 2349bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato saveSettingsLocked(); 2359bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWidthHint() throws RemoteException { 2409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato synchronized (mLock) { 2419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato return mWidth; 2429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHeightHint() throws RemoteException { 2469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato synchronized (mLock) { 2479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato return mHeight; 2489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2518cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public ParcelFileDescriptor getWallpaper(IWallpaperManagerCallback cb) { 2529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato synchronized (mLock) { 2539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato try { 2549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mCallbacks.register(cb); 2559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato File f = WALLPAPER_FILE; 2569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (!f.exists()) { 2579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato return null; 2589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 2599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato return ParcelFileDescriptor.open(f, MODE_READ_ONLY); 2609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (FileNotFoundException e) { 2619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato /* Shouldn't happen as we check to see if the file exists */ 2624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Log.w(TAG, "Error getting wallpaper", e); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato return null; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato public ParcelFileDescriptor setWallpaper(String name) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkPermission(android.Manifest.permission.SET_WALLPAPER); 2709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato synchronized (mLock) { 2710cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn final long ident = Binder.clearCallingIdentity(); 2720cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn try { 2730cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name); 2740cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn if (pfd != null) { 2750cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn bindWallpaperComponentLocked(null); 2760cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn saveSettingsLocked(); 2770cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn } 2780cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn return pfd; 2790cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn } finally { 2800cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn Binder.restoreCallingIdentity(ident); 2814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 2824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 2834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 2844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 2854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn ParcelFileDescriptor updateWallpaperBitmapLocked(String name) { 2864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (name == null) name = ""; 2874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn try { 2884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn ParcelFileDescriptor fd = ParcelFileDescriptor.open(WALLPAPER_FILE, 2894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn MODE_CREATE|MODE_READ_WRITE); 2909bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mName = name; 2914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return fd; 2924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } catch (FileNotFoundException e) { 2934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Log.w(TAG, "Error setting wallpaper", e); 2944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 2954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return null; 2964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 2974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 2984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void setWallpaperComponent(ComponentName name) { 2994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT); 3004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn synchronized (mLock) { 3014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 3029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato try { 303f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn bindWallpaperComponentLocked(name); 304f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } finally { 305f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn Binder.restoreCallingIdentity(ident); 306f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 307f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 308f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 309f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn 310f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn void bindWallpaperComponentLocked(ComponentName name) { 311f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn // Has the component changed? 312f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn if (mWallpaperConnection != null) { 313f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn if (mWallpaperComponent == null) { 314f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn if (name == null) { 315f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn // Still using default wallpaper. 316f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn return; 3174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 318f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } else if (mWallpaperComponent.equals(name)) { 319f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn // Changing to same wallpaper. 320f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn return; 321f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 322f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 323f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn 324f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn try { 325f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn ComponentName realName = name; 326f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn if (realName == null) { 327f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn // The default component is our static image wallpaper. 3287341d7a104b47996445d069a695e155a07184606Dianne Hackborn realName = new ComponentName("android", 3297341d7a104b47996445d069a695e155a07184606Dianne Hackborn ImageWallpaper.class.getName()); 3307341d7a104b47996445d069a695e155a07184606Dianne Hackborn //clearWallpaperComponentLocked(); 3317341d7a104b47996445d069a695e155a07184606Dianne Hackborn //return; 332f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 333f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn ServiceInfo si = mContext.getPackageManager().getServiceInfo(realName, 334f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS); 335f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) { 336f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn throw new SecurityException("Selected service does not require " 337f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn + android.Manifest.permission.BIND_WALLPAPER 338f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn + ": " + realName); 339f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 340f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn 341f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE); 342f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn if (name != null) { 3434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Make sure the selected service is actually a wallpaper service. 3444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn List<ResolveInfo> ris = mContext.getPackageManager() 3454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn .queryIntentServices(intent, 0); 3464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn for (int i=0; i<ris.size(); i++) { 3474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn ServiceInfo rsi = ris.get(i).serviceInfo; 3484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (rsi.name.equals(si.name) && 3494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn rsi.packageName.equals(si.packageName)) { 3504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn ris = null; 3514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn break; 3524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (ris != null) { 3554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn throw new SecurityException("Selected service is not a wallpaper: " 356f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn + realName); 3574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 359f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn 360f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn // Bind the service! 361f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn WallpaperConnection newConn = new WallpaperConnection(); 362f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn intent.setComponent(realName); 363f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn if (!mContext.bindService(intent, newConn, 364f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn Context.BIND_AUTO_CREATE)) { 365f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn throw new IllegalArgumentException("Unable to bind service: " 366f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn + name); 367f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 368f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn 369f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn clearWallpaperComponentLocked(); 370f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn mWallpaperComponent = name; 371f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn mWallpaperConnection = newConn; 3720cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn mLastDiedTime = SystemClock.uptimeMillis(); 373f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn try { 374f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn if (DEBUG) Log.v(TAG, "Adding window token: " + newConn.mToken); 375f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn mIWindowManager.addWindowToken(newConn.mToken, 376f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn WindowManager.LayoutParams.TYPE_WALLPAPER); 377f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } catch (RemoteException e) { 378f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } 379f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn 380f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 381f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn throw new IllegalArgumentException("Unknown component " + name); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 3854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn void clearWallpaperComponentLocked() { 3864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperComponent = null; 3874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (mWallpaperConnection != null) { 3884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (mWallpaperConnection.mEngine != null) { 3894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn try { 3904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperConnection.mEngine.destroy(); 3914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } catch (RemoteException e) { 3924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mContext.unbindService(mWallpaperConnection); 395e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn try { 396e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (DEBUG) Log.v(TAG, "Removing window token: " 397e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + mWallpaperConnection.mToken); 398e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn mIWindowManager.removeWindowToken(mWallpaperConnection.mToken); 399e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } catch (RemoteException e) { 400e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 4014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperConnection = null; 4024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn void attachServiceLocked(WallpaperConnection conn) { 4064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn try { 4073be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn conn.mService.attach(conn, conn.mToken, 4083be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowManager.LayoutParams.TYPE_WALLPAPER, false, 4093be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mWidth, mHeight); 4104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } catch (RemoteException e) { 4114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Log.w(TAG, "Failed attaching wallpaper; clearing", e); 412f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn bindWallpaperComponentLocked(null); 4134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato private void notifyCallbacksLocked() { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int n = mCallbacks.beginBroadcast(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < n; i++) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallbacks.getBroadcastItem(i).onWallpaperChanged(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The RemoteCallbackList will take care of removing 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the dead object for us. 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallbacks.finishBroadcast(); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void checkPermission(String permission) { 4339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (PackageManager.PERMISSION_GRANTED!= mContext.checkCallingOrSelfPermission(permission)) { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Access denied to process: " + Binder.getCallingPid() 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", must have permission " + permission); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 4399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato private static JournaledFile makeJournaledFile() { 4409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato final String base = "/data/system/wallpaper_info.xml"; 4419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato return new JournaledFile(new File(base), new File(base + ".tmp")); 4429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 4439bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 4449bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato private void saveSettingsLocked() { 4459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato JournaledFile journal = makeJournaledFile(); 4469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato FileOutputStream stream = null; 4479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato try { 4489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato stream = new FileOutputStream(journal.chooseForWrite(), false); 4499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato XmlSerializer out = new FastXmlSerializer(); 4509bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato out.setOutput(stream, "utf-8"); 4519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato out.startDocument(null, true); 4529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 4539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato out.startTag(null, "wp"); 4549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato out.attribute(null, "width", Integer.toString(mWidth)); 4559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato out.attribute(null, "height", Integer.toString(mHeight)); 4569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato out.attribute(null, "name", mName); 4574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (mWallpaperComponent != null) { 4584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn out.attribute(null, "component", 4594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperComponent.flattenToShortString()); 4604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato out.endTag(null, "wp"); 4629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 4639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato out.endDocument(); 4649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato stream.close(); 4659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato journal.commit(); 4669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (IOException e) { 4679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato try { 4689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (stream != null) { 4699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato stream.close(); 4709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 4719bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (IOException ex) { 4729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato // Ignore 4739bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 4749bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato journal.rollback(); 4759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 4769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 4779bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 4789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato private void loadSettingsLocked() { 4799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato JournaledFile journal = makeJournaledFile(); 4809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato FileInputStream stream = null; 4819bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato File file = journal.chooseForRead(); 4829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato boolean success = false; 4839bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato try { 4849bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato stream = new FileInputStream(file); 4859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato XmlPullParser parser = Xml.newPullParser(); 4869bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato parser.setInput(stream, null); 4879bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 4889bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato int type; 4899bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato do { 4909bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato type = parser.next(); 4919bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (type == XmlPullParser.START_TAG) { 4929bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato String tag = parser.getName(); 4939bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if ("wp".equals(tag)) { 4949bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mWidth = Integer.parseInt(parser.getAttributeValue(null, "width")); 4959bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mHeight = Integer.parseInt(parser.getAttributeValue(null, "height")); 4969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mName = parser.getAttributeValue(null, "name"); 4974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn String comp = parser.getAttributeValue(null, "component"); 4984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperComponent = comp != null 4994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn ? ComponentName.unflattenFromString(comp) 5004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn : null; 5019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } while (type != XmlPullParser.END_DOCUMENT); 5049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato success = true; 5059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (NullPointerException e) { 5062d9c9e3f6780b70fc98cfa0102824308e8ed28e9Joe Onorato Log.w(TAG, "failed parsing " + file + " " + e); 5079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (NumberFormatException e) { 5082d9c9e3f6780b70fc98cfa0102824308e8ed28e9Joe Onorato Log.w(TAG, "failed parsing " + file + " " + e); 5099bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (XmlPullParserException e) { 5102d9c9e3f6780b70fc98cfa0102824308e8ed28e9Joe Onorato Log.w(TAG, "failed parsing " + file + " " + e); 5119bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (IOException e) { 5122d9c9e3f6780b70fc98cfa0102824308e8ed28e9Joe Onorato Log.w(TAG, "failed parsing " + file + " " + e); 5139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (IndexOutOfBoundsException e) { 5142d9c9e3f6780b70fc98cfa0102824308e8ed28e9Joe Onorato Log.w(TAG, "failed parsing " + file + " " + e); 5159bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato try { 5179bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (stream != null) { 5189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato stream.close(); 5199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (IOException e) { 5219bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato // Ignore 5229bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5239bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5249bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (!success) { 5259bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mWidth = -1; 5269bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mHeight = -1; 5279bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mName = ""; 5289bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5299bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5309bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato void settingsRestored() { 5329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato boolean success = false; 5339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato synchronized (mLock) { 5349bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato loadSettingsLocked(); 5359bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato // If there's a wallpaper name, we use that. If that can't be loaded, then we 5369bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato // use the default. 5379bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if ("".equals(mName)) { 5389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato success = true; 5399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } else { 5409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato success = restoreNamedResourceLocked(); 5419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5439bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5449bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (!success) { 5459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato Log.e(TAG, "Failed to restore wallpaper: '" + mName + "'"); 5469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato mName = ""; 5479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato WALLPAPER_FILE.delete(); 5489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato saveSettingsLocked(); 5509bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato boolean restoreNamedResourceLocked() { 5539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (mName.length() > 4 && "res:".equals(mName.substring(0, 4))) { 5549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato String resName = mName.substring(4); 5559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato String pkg = null; 5579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato int colon = resName.indexOf(':'); 5589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (colon > 0) { 5599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato pkg = resName.substring(0, colon); 5609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato String ident = null; 5639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato int slash = resName.lastIndexOf('/'); 5649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (slash > 0) { 5659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato ident = resName.substring(slash+1); 5669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato String type = null; 5699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (colon > 0 && slash > 0 && (slash-colon) > 1) { 5709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato type = resName.substring(colon+1, slash); 5719bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5739bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (pkg != null && ident != null && type != null) { 5749bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato int resId = -1; 5759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato InputStream res = null; 5769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato FileOutputStream fos = null; 5779bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato try { 5789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato Context c = mContext.createPackageContext(pkg, Context.CONTEXT_RESTRICTED); 5799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato Resources r = c.getResources(); 5809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato resId = r.getIdentifier(resName, null, null); 5819bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (resId == 0) { 5829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato Log.e(TAG, "couldn't resolve identifier pkg=" + pkg + " type=" + type 5839bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato + " ident=" + ident); 5849bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato return false; 5859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5869bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5879bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato res = r.openRawResource(resId); 5889bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato fos = new FileOutputStream(WALLPAPER_FILE); 5899bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5909bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato byte[] buffer = new byte[32768]; 5919bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato int amt; 5929bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato while ((amt=res.read(buffer)) > 0) { 5939bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato fos.write(buffer, 0, amt); 5949bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 5959bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato // mWallpaperObserver will notice the close and send the change broadcast 5969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato 5979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato Log.d(TAG, "Restored wallpaper: " + resName); 5989bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato return true; 5999bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (NameNotFoundException e) { 6009bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato Log.e(TAG, "Package name " + pkg + " not found"); 6019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (Resources.NotFoundException e) { 6029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato Log.e(TAG, "Resource not found: " + resId); 6039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (IOException e) { 6049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato Log.e(TAG, "IOException while restoring wallpaper ", e); 6059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } finally { 6069bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (res != null) { 6079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato try { 6089bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato res.close(); 6099bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (IOException ex) {} 6109bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 6119bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato if (fos != null) { 6129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato try { 6139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato fos.close(); 6149bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } catch (IOException ex) {} 6159bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 6169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 6179bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 6189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 6199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato return false; 6209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 622