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