WallpaperManagerService.java revision 8bdf5935c0db4a66ab33a10b43398d2523cfa15d
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;
24dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackbornimport android.app.PendingIntent;
25eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.app.WallpaperInfo;
264528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tateimport android.app.backup.BackupManager;
274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.ComponentName;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.ServiceConnection;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.pm.ResolveInfo;
334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.pm.ServiceInfo;
349bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.content.pm.PackageManager.NameNotFoundException;
359bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.content.res.Resources;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
37284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackbornimport android.os.Bundle;
388bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils;
394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.IBinder;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileObserver;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteCallbackList;
444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.ServiceManager;
450cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackbornimport android.os.SystemClock;
464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperConnection;
474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperEngine;
484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperService;
494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.WallpaperService;
508a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.util.Xml;
524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.IWindowManager;
534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManager;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport java.io.FileDescriptor;
569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.IOException;
579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.InputStream;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileInputStream;
619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileOutputStream;
62eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport java.io.PrintWriter;
634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport java.util.List;
649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParser;
669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParserException;
679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlSerializer;
689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
6921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport com.android.internal.content.PackageMonitor;
70f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackbornimport com.android.internal.service.wallpaper.ImageWallpaper;
712269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.FastXmlSerializer;
721afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport com.android.internal.util.JournaledFile;
7321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport com.android.server.DevicePolicyManagerService.ActiveAdmin;
7421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport com.android.server.DevicePolicyManagerService.MyPackageMonitor;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
768cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornclass WallpaperManagerService extends IWallpaperManager.Stub {
774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    static final String TAG = "WallpaperService";
78cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn    static final boolean DEBUG = false;
799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    Object mLock = new Object();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
820cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    /**
830cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     * Minimum time between crashes of a wallpaper service for us to consider
840cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     * restarting it vs. just reverting to the static wallpaper.
850cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     */
860cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final long MIN_WALLPAPER_CRASH_TIME = 10000;
870cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn
880cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final File WALLPAPER_DIR = new File(
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "/data/data/com.android.settings/files");
900cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final String WALLPAPER = "wallpaper";
910cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final File WALLPAPER_FILE = new File(WALLPAPER_DIR, WALLPAPER);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * List of callbacks registered they should each be notified
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when the wallpaper is changed.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
978cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    private final RemoteCallbackList<IWallpaperManagerCallback> mCallbacks
988cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            = new RemoteCallbackList<IWallpaperManagerCallback>();
999bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Observes the wallpaper for changes and notifies all IWallpaperServiceCallbacks
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the wallpaper has changed. The CREATE is triggered when there is no
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wallpaper set and is created for the first time. The CLOSE_WRITE is triggered
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * everytime the wallpaper is changed.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final FileObserver mWallpaperObserver = new FileObserver(
1079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            WALLPAPER_DIR.getAbsolutePath(), CREATE | CLOSE_WRITE | DELETE | DELETE_SELF) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void onEvent(int event, String path) {
110e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato                    if (path == null) {
111e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato                        return;
112e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato                    }
1139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    synchronized (mLock) {
1149bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        // changing the wallpaper means we'll need to back up the new one
1159bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        long origId = Binder.clearCallingIdentity();
1169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        BackupManager bm = new BackupManager(mContext);
1179bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        bm.dataChanged();
1189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        Binder.restoreCallingIdentity(origId);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        File changedFile = new File(WALLPAPER_DIR, path);
1219bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        if (WALLPAPER_FILE.equals(changedFile)) {
1229bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                            notifyCallbacksLocked();
1239bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final Context mContext;
1294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final IWindowManager mIWindowManager;
13021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    final MyPackageMonitor mMonitor;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    int mWidth = -1;
1334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    int mHeight = -1;
134a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
135a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron    /**
136a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron     * Resource name if using a picture from the wallpaper gallery
137a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron     */
1384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    String mName = "";
139d6c0b844a0eb128a9429aa01d23d15ce095ef479Mike Cleron
140d6c0b844a0eb128a9429aa01d23d15ce095ef479Mike Cleron    /**
141a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron     * The component name of the currently set live wallpaper.
142d6c0b844a0eb128a9429aa01d23d15ce095ef479Mike Cleron     */
1434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    ComponentName mWallpaperComponent;
144a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
145a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron    /**
146a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron     * The component name of the wallpaper that should be set next.
147a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron     */
148a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron    ComponentName mNextWallpaperComponent;
149a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
150a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron    /**
151a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron     * Name of the component used to display bitmap wallpapers from either the gallery or
152a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron     * built-in wallpapers.
153a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron     */
154a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron    ComponentName mImageWallpaperComponent = new ComponentName("android",
155a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            ImageWallpaper.class.getName());
156a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
1574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    WallpaperConnection mWallpaperConnection;
1580cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    long mLastDiedTime;
15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    boolean mWallpaperUpdating;
1604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    class WallpaperConnection extends IWallpaperConnection.Stub
1624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            implements ServiceConnection {
163eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        final WallpaperInfo mInfo;
1644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final Binder mToken = new Binder();
1654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperService mService;
1664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperEngine mEngine;
1674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
168eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        public WallpaperConnection(WallpaperInfo info) {
169eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            mInfo = info;
170eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
171eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
1724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onServiceConnected(ComponentName name, IBinder service) {
1734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
1744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (mWallpaperConnection == this) {
17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    mLastDiedTime = SystemClock.uptimeMillis();
1764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mService = IWallpaperService.Stub.asInterface(service);
1774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    attachServiceLocked(this);
178eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // XXX should probably do saveSettingsLocked() later
179eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // when we have an engine, but I'm not sure about
180eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // locking there and anyway we always need to be able to
181eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // recover if there is something wrong.
182eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    saveSettingsLocked();
1834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
1854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onServiceDisconnected(ComponentName name) {
1884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
1894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mService = null;
1904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mEngine = null;
1910cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                if (mWallpaperConnection == this) {
1928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Wallpaper service gone: " + mWallpaperComponent);
19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    if (!mWallpaperUpdating && (mLastDiedTime+MIN_WALLPAPER_CRASH_TIME)
19421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                                > SystemClock.uptimeMillis()) {
1958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Reverting to built-in wallpaper!");
196a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        bindWallpaperComponentLocked(null);
1970cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                    }
1980cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                }
1994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
2014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
2024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void attachEngine(IWallpaperEngine engine) {
2034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mEngine = engine;
2044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
2054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
2064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public ParcelFileDescriptor setWallpaper(String name) {
2074c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
2084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (mWallpaperConnection == this) {
209eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    return updateWallpaperBitmapLocked(name);
2104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
2114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                return null;
2124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
2144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
2154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
21621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    class MyPackageMonitor extends PackageMonitor {
21721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
21821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onPackageUpdateFinished(String packageName, int uid) {
21921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            synchronized (mLock) {
22021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                if (mWallpaperComponent != null &&
22121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        mWallpaperComponent.getPackageName().equals(packageName)) {
22221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    mWallpaperUpdating = false;
22321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    ComponentName comp = mWallpaperComponent;
22421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    clearWallpaperComponentLocked();
22521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    bindWallpaperComponentLocked(comp);
22621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
22721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
22821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
22921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
23021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
23121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onPackageUpdateStarted(String packageName, int uid) {
23221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            synchronized (mLock) {
23321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                if (mWallpaperComponent != null &&
23421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        mWallpaperComponent.getPackageName().equals(packageName)) {
23521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    mWallpaperUpdating = true;
23621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
23721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
23821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
23921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
24021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
24121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
24221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return doPackagesChanged(doit);
24321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
24421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
24521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
24621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onSomePackagesChanged() {
24721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            doPackagesChanged(true);
24821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
24921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
25021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        boolean doPackagesChanged(boolean doit) {
25121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            boolean changed = false;
25221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            synchronized (mLock) {
25321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                if (mWallpaperComponent != null) {
25421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    int change = isPackageDisappearing(mWallpaperComponent.getPackageName());
25521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    if (change == PACKAGE_PERMANENT_CHANGE
25621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                            || change == PACKAGE_TEMPORARY_CHANGE) {
25721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        changed = true;
25821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        if (doit) {
2598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.w(TAG, "Wallpaper uninstalled, removing: " + mWallpaperComponent);
26021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                            clearWallpaperLocked();
26121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        }
26221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    }
26321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
26421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                if (mNextWallpaperComponent != null) {
26521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    int change = isPackageDisappearing(mNextWallpaperComponent.getPackageName());
26621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    if (change == PACKAGE_PERMANENT_CHANGE
26721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                            || change == PACKAGE_TEMPORARY_CHANGE) {
26821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        mNextWallpaperComponent = null;
26921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    }
27021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
27121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                if (mWallpaperComponent != null
27221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        && isPackageModified(mWallpaperComponent.getPackageName())) {
27321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    try {
27421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        mContext.getPackageManager().getServiceInfo(
27521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                                mWallpaperComponent, 0);
27621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    } catch (NameNotFoundException e) {
2778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Wallpaper component gone, removing: " + mWallpaperComponent);
27821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        clearWallpaperLocked();
27921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    }
28021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
28121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                if (mNextWallpaperComponent != null
28221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        && isPackageModified(mNextWallpaperComponent.getPackageName())) {
28321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    try {
28421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        mContext.getPackageManager().getServiceInfo(
28521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                                mNextWallpaperComponent, 0);
28621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    } catch (NameNotFoundException e) {
28721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                        mNextWallpaperComponent = null;
28821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    }
28921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
29021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
29121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return changed;
29221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
29321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
29421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
2958cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public WallpaperManagerService(Context context) {
2968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "WallpaperService startup");
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
2984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        mIWindowManager = IWindowManager.Stub.asInterface(
2994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                ServiceManager.getService(Context.WINDOW_SERVICE));
30021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        mMonitor = new MyPackageMonitor();
30121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        mMonitor.register(context, true);
302e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato        WALLPAPER_DIR.mkdirs();
3039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        loadSettingsLocked();
304e712ee3fe1b9ec950dbe5d77993751c2b7b1011cJoe Onorato        mWallpaperObserver.startWatching();
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.finalize();
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWallpaperObserver.stopWatching();
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
313f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    public void systemReady() {
3148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "systemReady");
315f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        synchronized (mLock) {
316f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            try {
317a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                bindWallpaperComponentLocked(mNextWallpaperComponent);
318f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            } catch (RuntimeException e) {
3198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Failure starting previous wallpaper", e);
320f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                try {
321a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    bindWallpaperComponentLocked(null);
322f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                } catch (RuntimeException e2) {
3238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Failure starting default wallpaper", e2);
324f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                    clearWallpaperComponentLocked();
325f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                }
326f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
327f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
328f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    }
329f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() {
3318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "clearWallpaper");
3329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
33321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            clearWallpaperLocked();
33421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
33521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
33621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
33721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    public void clearWallpaperLocked() {
33821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        File f = WALLPAPER_FILE;
33921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (f.exists()) {
34021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            f.delete();
34121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
34221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        final long ident = Binder.clearCallingIdentity();
34321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        try {
34421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            bindWallpaperComponentLocked(null);
345c9421ba1f46d9f9aeee833e1fde2cc263b058411Dianne Hackborn        } catch (IllegalArgumentException e) {
346c9421ba1f46d9f9aeee833e1fde2cc263b058411Dianne Hackborn            // This can happen if the default wallpaper component doesn't
347c9421ba1f46d9f9aeee833e1fde2cc263b058411Dianne Hackborn            // exist.  This should be a system configuration problem, but
348c9421ba1f46d9f9aeee833e1fde2cc263b058411Dianne Hackborn            // let's not let it crash the system and just live with no
349c9421ba1f46d9f9aeee833e1fde2cc263b058411Dianne Hackborn            // wallpaper.
350c9421ba1f46d9f9aeee833e1fde2cc263b058411Dianne Hackborn            Slog.e(TAG, "Default wallpaper component not found!", e);
35121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        } finally {
35221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            Binder.restoreCallingIdentity(ident);
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDimensionHints(int width, int height) throws RemoteException {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkPermission(android.Manifest.permission.SET_WALLPAPER_HINTS);
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (width <= 0 || height <= 0) {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("width and height must be > 0");
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
3649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (width != mWidth || height != mHeight) {
3659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                mWidth = width;
3669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                mHeight = height;
3679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                saveSettingsLocked();
368284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (mWallpaperConnection != null) {
369284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    if (mWallpaperConnection.mEngine != null) {
370284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        try {
371284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                            mWallpaperConnection.mEngine.setDesiredSize(
372284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                                    width, height);
373284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        } catch (RemoteException e) {
374284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        }
375284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        notifyCallbacksLocked();
376284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    }
377284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
3789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWidthHint() throws RemoteException {
3839bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
3849bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            return mWidth;
3859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getHeightHint() throws RemoteException {
3899bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
3909bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            return mHeight;
3919bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
394284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn    public ParcelFileDescriptor getWallpaper(IWallpaperManagerCallback cb,
395284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            Bundle outParams) {
3969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
3979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
398284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (outParams != null) {
399284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    outParams.putInt("width", mWidth);
400284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    outParams.putInt("height", mHeight);
401284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
4029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                mCallbacks.register(cb);
4039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                File f = WALLPAPER_FILE;
4049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (!f.exists()) {
4059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    return null;
4069bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
4079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                return ParcelFileDescriptor.open(f, MODE_READ_ONLY);
4089bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } catch (FileNotFoundException e) {
4099bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                /* Shouldn't happen as we check to see if the file exists */
4108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Error getting wallpaper", e);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            return null;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
416eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public WallpaperInfo getWallpaperInfo() {
417eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        synchronized (mLock) {
418eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            if (mWallpaperConnection != null) {
419eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                return mWallpaperConnection.mInfo;
420eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
421eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return null;
422eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
423eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
424eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
4259bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    public ParcelFileDescriptor setWallpaper(String name) {
4268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "setWallpaper");
427a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkPermission(android.Manifest.permission.SET_WALLPAPER);
4299bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
4300cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            final long ident = Binder.clearCallingIdentity();
4310cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            try {
4320cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name);
4330cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                if (pfd != null) {
434322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    // Bind the wallpaper to an ImageWallpaper
435a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    bindWallpaperComponentLocked(mImageWallpaperComponent);
4360cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                    saveSettingsLocked();
4370cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                }
4380cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                return pfd;
4390cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            } finally {
4400cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                Binder.restoreCallingIdentity(ident);
4414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
4424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
4434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
4444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
4454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    ParcelFileDescriptor updateWallpaperBitmapLocked(String name) {
4464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        if (name == null) name = "";
4474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        try {
4484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            ParcelFileDescriptor fd = ParcelFileDescriptor.open(WALLPAPER_FILE,
4494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    MODE_CREATE|MODE_READ_WRITE);
4509bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            mName = name;
4514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            return fd;
4524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        } catch (FileNotFoundException e) {
4538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Error setting wallpaper", e);
4544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
4554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return null;
4564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
4574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
4584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public void setWallpaperComponent(ComponentName name) {
4598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "setWallpaperComponent name=" + name);
4604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT);
4614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        synchronized (mLock) {
4624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            final long ident = Binder.clearCallingIdentity();
4639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
464a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                bindWallpaperComponentLocked(name);
465f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            } finally {
466f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                Binder.restoreCallingIdentity(ident);
467f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
468f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
469f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    }
470f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
471a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron    void bindWallpaperComponentLocked(ComponentName componentName) {
4728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: componentName=" + componentName);
473a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
474f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        // Has the component changed?
475f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        if (mWallpaperConnection != null) {
476f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            if (mWallpaperComponent == null) {
477322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                if (componentName == null) {
4788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: still using default");
479f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                    // Still using default wallpaper.
480f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                    return;
4814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
482322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron            } else if (mWallpaperComponent.equals(componentName)) {
483f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                // Changing to same wallpaper.
4848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG) Slog.v(TAG, "same wallpaper");
485f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                return;
486f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
487f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
488f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
489f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        try {
490a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            if (componentName == null) {
491322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                String defaultComponent =
492322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    mContext.getString(com.android.internal.R.string.default_wallpaper_component);
493a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (defaultComponent != null) {
494322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    // See if there is a default wallpaper component specified
495a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    componentName = ComponentName.unflattenFromString(defaultComponent);
4968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "Use default component wallpaper:" + componentName);
497322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                }
498a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (componentName == null) {
499322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    // Fall back to static image wallpaper
500a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    componentName = mImageWallpaperComponent;
501322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    //clearWallpaperComponentLocked();
502322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    //return;
5038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "Using image wallpaper");
504322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                }
505f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
506a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            ServiceInfo si = mContext.getPackageManager().getServiceInfo(componentName,
507f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                    PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS);
508f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) {
509f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                throw new SecurityException("Selected service does not require "
510f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                        + android.Manifest.permission.BIND_WALLPAPER
511a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        + ": " + componentName);
512f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
513f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
514eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            WallpaperInfo wi = null;
515eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
516f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE);
517a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            if (componentName != null && !componentName.equals(mImageWallpaperComponent)) {
5184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // Make sure the selected service is actually a wallpaper service.
5194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                List<ResolveInfo> ris = mContext.getPackageManager()
520eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        .queryIntentServices(intent, PackageManager.GET_META_DATA);
5214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                for (int i=0; i<ris.size(); i++) {
5224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    ServiceInfo rsi = ris.get(i).serviceInfo;
5234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    if (rsi.name.equals(si.name) &&
5244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            rsi.packageName.equals(si.packageName)) {
525eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        try {
526eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            wi = new WallpaperInfo(mContext, ris.get(i));
527eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        } catch (XmlPullParserException e) {
528eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            throw new IllegalArgumentException(e);
529eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        } catch (IOException e) {
530eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            throw new IllegalArgumentException(e);
531eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        }
5324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        break;
5334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
5344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
535eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                if (wi == null) {
5364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    throw new SecurityException("Selected service is not a wallpaper: "
537a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                            + componentName);
5384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
5399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
540f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
541f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            // Bind the service!
5428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG) Slog.v(TAG, "Binding to:" + componentName);
543eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            WallpaperConnection newConn = new WallpaperConnection(wi);
544a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            intent.setComponent(componentName);
545dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn            intent.putExtra(Intent.EXTRA_CLIENT_LABEL,
546dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn                    com.android.internal.R.string.wallpaper_binding_label);
547dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn            intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivity(
548eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    mContext, 0,
549eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER),
550eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            mContext.getText(com.android.internal.R.string.chooser_wallpaper)),
551eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            0));
552f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            if (!mContext.bindService(intent, newConn,
553f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                    Context.BIND_AUTO_CREATE)) {
554f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                throw new IllegalArgumentException("Unable to bind service: "
555322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                        + componentName);
556f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
557f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
558f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            clearWallpaperComponentLocked();
559322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron            mWallpaperComponent = componentName;
560f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            mWallpaperConnection = newConn;
5610cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            mLastDiedTime = SystemClock.uptimeMillis();
562f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            try {
5638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG) Slog.v(TAG, "Adding window token: " + newConn.mToken);
564f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                mIWindowManager.addWindowToken(newConn.mToken,
565f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                        WindowManager.LayoutParams.TYPE_WALLPAPER);
566f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            } catch (RemoteException e) {
567f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
568f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
569f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        } catch (PackageManager.NameNotFoundException e) {
570322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron            throw new IllegalArgumentException("Unknown component " + componentName);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
5744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    void clearWallpaperComponentLocked() {
5754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        mWallpaperComponent = null;
5764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        if (mWallpaperConnection != null) {
5774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (mWallpaperConnection.mEngine != null) {
5784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                try {
5794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mWallpaperConnection.mEngine.destroy();
5804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                } catch (RemoteException e) {
5814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
5824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
5834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mContext.unbindService(mWallpaperConnection);
584e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            try {
5858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG) Slog.v(TAG, "Removing window token: "
586e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        + mWallpaperConnection.mToken);
587e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                mIWindowManager.removeWindowToken(mWallpaperConnection.mToken);
588e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            } catch (RemoteException e) {
589e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            }
5904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mWallpaperConnection = null;
5914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
5924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
5934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
5944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    void attachServiceLocked(WallpaperConnection conn) {
5954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        try {
5963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            conn.mService.attach(conn, conn.mToken,
5973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    WindowManager.LayoutParams.TYPE_WALLPAPER, false,
5983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    mWidth, mHeight);
5994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        } catch (RemoteException e) {
6008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed attaching wallpaper; clearing", e);
60121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            if (!mWallpaperUpdating) {
60221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                bindWallpaperComponentLocked(null);
60321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
6044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
6054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
6064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
6079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    private void notifyCallbacksLocked() {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int n = mCallbacks.beginBroadcast();
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < n; i++) {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCallbacks.getBroadcastItem(i).onWallpaperChanged();
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The RemoteCallbackList will take care of removing
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the dead object for us.
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbacks.finishBroadcast();
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.sendBroadcast(intent);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void checkPermission(String permission) {
6249bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (PackageManager.PERMISSION_GRANTED!= mContext.checkCallingOrSelfPermission(permission)) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", must have permission " + permission);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6299bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
6309bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    private static JournaledFile makeJournaledFile() {
6319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        final String base = "/data/system/wallpaper_info.xml";
6329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        return new JournaledFile(new File(base), new File(base + ".tmp"));
6339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
6349bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
6359bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    private void saveSettingsLocked() {
6369bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        JournaledFile journal = makeJournaledFile();
6379bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        FileOutputStream stream = null;
6389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
6399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream = new FileOutputStream(journal.chooseForWrite(), false);
6409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            XmlSerializer out = new FastXmlSerializer();
6419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.setOutput(stream, "utf-8");
6429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.startDocument(null, true);
6439bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
6449bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.startTag(null, "wp");
6459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.attribute(null, "width", Integer.toString(mWidth));
6469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.attribute(null, "height", Integer.toString(mHeight));
6479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.attribute(null, "name", mName);
6484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (mWallpaperComponent != null) {
6494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                out.attribute(null, "component",
6504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        mWallpaperComponent.flattenToShortString());
6514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
6529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.endTag(null, "wp");
6539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
6549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.endDocument();
6559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream.close();
6569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            journal.commit();
6579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
6589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
6599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (stream != null) {
6609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    stream.close();
6619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
6629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } catch (IOException ex) {
6639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                // Ignore
6649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
6659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            journal.rollback();
6669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
6679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
6689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
6699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    private void loadSettingsLocked() {
6708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "loadSettingsLocked");
671a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
6729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        JournaledFile journal = makeJournaledFile();
6739bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        FileInputStream stream = null;
6749bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        File file = journal.chooseForRead();
6759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        boolean success = false;
6769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
6779bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream = new FileInputStream(file);
6789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            XmlPullParser parser = Xml.newPullParser();
6799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            parser.setInput(stream, null);
6809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
6819bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int type;
6829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            do {
6839bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                type = parser.next();
6849bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (type == XmlPullParser.START_TAG) {
6859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    String tag = parser.getName();
6869bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if ("wp".equals(tag)) {
6879bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        mWidth = Integer.parseInt(parser.getAttributeValue(null, "width"));
6889bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        mHeight = Integer.parseInt(parser.getAttributeValue(null, "height"));
6899bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        mName = parser.getAttributeValue(null, "name");
6904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        String comp = parser.getAttributeValue(null, "component");
691a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        mNextWallpaperComponent = comp != null
6924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                ? ComponentName.unflattenFromString(comp)
6934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                : null;
694a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
695a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        if (DEBUG) {
6968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.v(TAG, "mWidth:" + mWidth);
6978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.v(TAG, "mHeight:" + mHeight);
6988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.v(TAG, "mName:" + mName);
6998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.v(TAG, "mNextWallpaperComponent:" + mNextWallpaperComponent);
700a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        }
7019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
7029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
7039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } while (type != XmlPullParser.END_DOCUMENT);
7049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            success = true;
7059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (NullPointerException e) {
7068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
7079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (NumberFormatException e) {
7088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
7099bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (XmlPullParserException e) {
7108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
7119bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
7128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
7139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IndexOutOfBoundsException e) {
7148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
7159bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
7169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
7179bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (stream != null) {
7189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                stream.close();
7199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
7209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
7219bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            // Ignore
7229bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
7239bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
7249bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (!success) {
7259bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            mWidth = -1;
7269bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            mHeight = -1;
7279bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            mName = "";
7289bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
7299bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
7309bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
731194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick    // Called by SystemBackupAgent after files are restored to disk.
7329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    void settingsRestored() {
7338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "settingsRestored");
734194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick
7359bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        boolean success = false;
7369bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
7379bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            loadSettingsLocked();
738a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            if (mNextWallpaperComponent != null &&
739a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    !mNextWallpaperComponent.equals(mImageWallpaperComponent)) {
740e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                try {
741e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    bindWallpaperComponentLocked(mNextWallpaperComponent);
742e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                } catch (IllegalArgumentException e) {
743e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // No such live wallpaper or other failure; fall back to the default
744e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // live wallpaper (since the profile being restored indicated that the
745e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // user had selected a live rather than static one).
746e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    bindWallpaperComponentLocked(null);
747e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                }
7489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                success = true;
7499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } else {
750a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                // If there's a wallpaper name, we use that.  If that can't be loaded, then we
751a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                // use the default.
752a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if ("".equals(mName)) {
7538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "settingsRestored: name is empty");
754a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    success = true;
755a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                } else {
7568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "settingsRestored: attempting to restore named resource");
757a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    success = restoreNamedResourceLocked();
758a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                }
7598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG) Slog.v(TAG, "settingsRestored: success=" + success);
760a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (success) {
761a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    bindWallpaperComponentLocked(mImageWallpaperComponent);
762a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                }
7639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
7649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
7659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
7669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (!success) {
7678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.e(TAG, "Failed to restore wallpaper: '" + mName + "'");
7689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            mName = "";
7699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            WALLPAPER_FILE.delete();
7709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
771194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick
772194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick        synchronized (mLock) {
773194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick            saveSettingsLocked();
774194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick        }
7759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
7769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
7779bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    boolean restoreNamedResourceLocked() {
7789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (mName.length() > 4 && "res:".equals(mName.substring(0, 4))) {
7799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String resName = mName.substring(4);
7809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
7819bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String pkg = null;
7829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int colon = resName.indexOf(':');
7839bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (colon > 0) {
7849bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                pkg = resName.substring(0, colon);
7859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
7869bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
7879bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String ident = null;
7889bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int slash = resName.lastIndexOf('/');
7899bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (slash > 0) {
7909bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                ident = resName.substring(slash+1);
7919bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
7929bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
7939bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String type = null;
7949bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (colon > 0 && slash > 0 && (slash-colon) > 1) {
7959bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                type = resName.substring(colon+1, slash);
7969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
7979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
7989bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (pkg != null && ident != null && type != null) {
7999bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                int resId = -1;
8009bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                InputStream res = null;
8019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                FileOutputStream fos = null;
8029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                try {
8039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    Context c = mContext.createPackageContext(pkg, Context.CONTEXT_RESTRICTED);
8049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    Resources r = c.getResources();
8059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    resId = r.getIdentifier(resName, null, null);
8069bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (resId == 0) {
8078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.e(TAG, "couldn't resolve identifier pkg=" + pkg + " type=" + type
8089bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                                + " ident=" + ident);
8099bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        return false;
8109bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
8119bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
8129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    res = r.openRawResource(resId);
8131afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    if (WALLPAPER_FILE.exists()) {
8141afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                        WALLPAPER_FILE.delete();
8151afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    }
8169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    fos = new FileOutputStream(WALLPAPER_FILE);
8179bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
8189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    byte[] buffer = new byte[32768];
8199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    int amt;
8209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    while ((amt=res.read(buffer)) > 0) {
8219bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        fos.write(buffer, 0, amt);
8229bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
8239bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    // mWallpaperObserver will notice the close and send the change broadcast
8249bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
8258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Restored wallpaper: " + resName);
8269bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    return true;
8279bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (NameNotFoundException e) {
8288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "Package name " + pkg + " not found");
8299bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (Resources.NotFoundException e) {
8308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "Resource not found: " + resId);
8319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (IOException e) {
8328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "IOException while restoring wallpaper ", e);
8339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } finally {
8349bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (res != null) {
8359bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        try {
8369bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                            res.close();
8379bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        } catch (IOException ex) {}
8389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
8399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (fos != null) {
8408bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn                        FileUtils.sync(fos);
8419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        try {
8429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                            fos.close();
8439bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        } catch (IOException ex) {}
8449bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
8459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
8469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
8479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
8489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        return false;
8499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
850eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
851eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    @Override
852eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
853eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
854eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                != PackageManager.PERMISSION_GRANTED) {
855eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
856eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println("Permission Denial: can't dump wallpaper service from from pid="
857eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + Binder.getCallingPid()
858eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + ", uid=" + Binder.getCallingUid());
859eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return;
860eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
861eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
862eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        synchronized (mLock) {
863eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println("Current Wallpaper Service state:");
864eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.print("  mWidth="); pw.print(mWidth);
865eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    pw.print(" mHeight="); pw.println(mHeight);
866eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.print("  mName="); pw.println(mName);
867eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.print("  mWallpaperComponent="); pw.println(mWallpaperComponent);
868eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            if (mWallpaperConnection != null) {
869eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                WallpaperConnection conn = mWallpaperConnection;
870eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                pw.print("  Wallpaper connection ");
871eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        pw.print(conn); pw.println(":");
872eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                pw.print("    mInfo.component="); pw.println(conn.mInfo.getComponent());
873eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                pw.print("    mToken="); pw.println(conn.mToken);
874eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                pw.print("    mService="); pw.println(conn.mService);
875eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                pw.print("    mEngine="); pw.println(conn.mEngine);
876eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                pw.print("    mLastDiedTime=");
877eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        pw.println(mLastDiedTime - SystemClock.uptimeMillis());
878eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
879eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
880eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
882