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.ParcelFileDescriptor.*;
20111bd4acdb378266221b430a284f88a3990a3958Christopher Tate
215dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.app.ActivityManagerNative;
224e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasaniimport android.app.AppGlobals;
235dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.app.IUserSwitchObserver;
248cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.app.IWallpaperManager;
258cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.app.IWallpaperManagerCallback;
26dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackbornimport android.app.PendingIntent;
27eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.app.WallpaperInfo;
284528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tateimport android.app.backup.BackupManager;
2937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasaniimport android.app.backup.WallpaperBackupHelper;
30135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.content.BroadcastReceiver;
314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.ComponentName;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
34135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.content.IntentFilter;
354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.ServiceConnection;
364e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasaniimport android.content.pm.IPackageManager;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.pm.ResolveInfo;
394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.content.pm.ServiceInfo;
409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.content.pm.PackageManager.NameNotFoundException;
416474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasaniimport android.content.pm.UserInfo;
429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.content.res.Resources;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
44284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackbornimport android.os.Bundle;
45135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.os.Environment;
468bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils;
474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.IBinder;
485dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.os.IRemoteCallback;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileObserver;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteCallbackList;
53554cb0c290406f5bba34908489db5382a69d0a9arpcraigimport android.os.SELinux;
544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.ServiceManager;
550cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackbornimport android.os.SystemClock;
56f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
576474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasaniimport android.os.UserManager;
584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperConnection;
594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperEngine;
604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperService;
614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.WallpaperService;
628a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
6337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasaniimport android.util.SparseArray;
649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.util.Xml;
6544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornimport android.view.Display;
664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.IWindowManager;
674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManager;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport java.io.FileDescriptor;
709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.IOException;
719bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.InputStream;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
749bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileInputStream;
759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileOutputStream;
76eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport java.io.PrintWriter;
774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport java.util.List;
789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParser;
809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParserException;
819bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlSerializer;
829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
8321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport com.android.internal.content.PackageMonitor;
842269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.FastXmlSerializer;
851afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport com.android.internal.util.JournaledFile;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
878cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornclass WallpaperManagerService extends IWallpaperManager.Stub {
884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    static final String TAG = "WallpaperService";
89cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn    static final boolean DEBUG = false;
909bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
91407ec78b828173257b0c5dae221649a4ccd8b058Romain Guy    final Object mLock = new Object[0];
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
930cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    /**
940cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     * Minimum time between crashes of a wallpaper service for us to consider
950cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     * restarting it vs. just reverting to the static wallpaper.
960cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     */
970cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final long MIN_WALLPAPER_CRASH_TIME = 10000;
980cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final String WALLPAPER = "wallpaper";
9937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    static final String WALLPAPER_INFO = "wallpaper_info.xml";
1009bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
102bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn     * Name of the component used to display bitmap wallpapers from either the gallery or
103bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn     * built-in wallpapers.
104bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn     */
105bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn    static final ComponentName IMAGE_WALLPAPER = new ComponentName("com.android.systemui",
106bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn            "com.android.systemui.ImageWallpaper");
107bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn
108bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Observes the wallpaper for changes and notifies all IWallpaperServiceCallbacks
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the wallpaper has changed. The CREATE is triggered when there is no
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wallpaper set and is created for the first time. The CLOSE_WRITE is triggered
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * everytime the wallpaper is changed.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private class WallpaperObserver extends FileObserver {
11537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
11637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final WallpaperData mWallpaper;
11737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final File mWallpaperDir;
11837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final File mWallpaperFile;
11937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
12037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        public WallpaperObserver(WallpaperData wallpaper) {
12137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            super(getWallpaperDir(wallpaper.userId).getAbsolutePath(),
12237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    CLOSE_WRITE | DELETE | DELETE_SELF);
12337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaperDir = getWallpaperDir(wallpaper.userId);
12437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaper = wallpaper;
12537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaperFile = new File(mWallpaperDir, WALLPAPER);
12637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
12737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
12837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        @Override
12937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        public void onEvent(int event, String path) {
13037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (path == null) {
13137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                return;
13237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
13337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            synchronized (mLock) {
13437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                // changing the wallpaper means we'll need to back up the new one
13537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                long origId = Binder.clearCallingIdentity();
13637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                BackupManager bm = new BackupManager(mContext);
13737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                bm.dataChanged();
13837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                Binder.restoreCallingIdentity(origId);
13937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
14037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                File changedFile = new File(mWallpaperDir, path);
14137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaperFile.equals(changedFile)) {
14237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    notifyCallbacksLocked(mWallpaper);
14337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (mWallpaper.wallpaperComponent == null || event != CLOSE_WRITE
14437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            || mWallpaper.imageWallpaperPending) {
14537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        if (event == CLOSE_WRITE) {
14637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            mWallpaper.imageWallpaperPending = false;
1479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        }
148bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                        bindWallpaperComponentLocked(IMAGE_WALLPAPER, true,
1495dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                                false, mWallpaper, null);
15037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        saveSettingsLocked(mWallpaper);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
15437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
15537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
15637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
1574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final Context mContext;
1584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final IWindowManager mIWindowManager;
1594e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani    final IPackageManager mIPackageManager;
16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    final MyPackageMonitor mMonitor;
16137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    WallpaperData mLastWallpaper;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    SparseArray<WallpaperData> mWallpaperMap = new SparseArray<WallpaperData>();
16407213e6d8895af10951851435adf96a779863f6cDianne Hackborn
16537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    int mCurrentUserId;
16637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
16737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    static class WallpaperData {
16837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
16937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        int userId;
17037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
17137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File wallpaperFile;
17237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
17337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
17437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * Client is currently writing a new image wallpaper.
17537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
17637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        boolean imageWallpaperPending;
17737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
17837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
17937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * Resource name if using a picture from the wallpaper gallery
18037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
18137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        String name = "";
18237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
18337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
18437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * The component name of the currently set live wallpaper.
18537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
18637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        ComponentName wallpaperComponent;
18737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
18837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
18937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * The component name of the wallpaper that should be set next.
19037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
19137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        ComponentName nextWallpaperComponent;
19237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
19337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperConnection connection;
19437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        long lastDiedTime;
19537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        boolean wallpaperUpdating;
19637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperObserver wallpaperObserver;
19737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
19837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
19937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * List of callbacks registered they should each be notified when the wallpaper is changed.
20037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
20137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        private RemoteCallbackList<IWallpaperManagerCallback> callbacks
20237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                = new RemoteCallbackList<IWallpaperManagerCallback>();
20337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
20437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        int width = -1;
20537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        int height = -1;
20637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
20737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData(int userId) {
20837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            this.userId = userId;
20937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaperFile = new File(getWallpaperDir(userId), WALLPAPER);
21037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
21137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
21207213e6d8895af10951851435adf96a779863f6cDianne Hackborn
2134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    class WallpaperConnection extends IWallpaperConnection.Stub
2144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            implements ServiceConnection {
215eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        final WallpaperInfo mInfo;
2164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final Binder mToken = new Binder();
2174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperService mService;
2184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperEngine mEngine;
21937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData mWallpaper;
2205dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        IRemoteCallback mReply;
2214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
22237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        public WallpaperConnection(WallpaperInfo info, WallpaperData wallpaper) {
223eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            mInfo = info;
22437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaper = wallpaper;
225eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
2265dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
2275dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onServiceConnected(ComponentName name, IBinder service) {
2294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
23037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaper.connection == this) {
23137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    mWallpaper.lastDiedTime = SystemClock.uptimeMillis();
2324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mService = IWallpaperService.Stub.asInterface(service);
23337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    attachServiceLocked(this, mWallpaper);
234eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // XXX should probably do saveSettingsLocked() later
235eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // when we have an engine, but I'm not sure about
236eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // locking there and anyway we always need to be able to
237eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // recover if there is something wrong.
23837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    saveSettingsLocked(mWallpaper);
2394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
2404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2435dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onServiceDisconnected(ComponentName name) {
2454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
2464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mService = null;
2474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mEngine = null;
24837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaper.connection == this) {
24937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    Slog.w(TAG, "Wallpaper service gone: " + mWallpaper.wallpaperComponent);
25037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (!mWallpaper.wallpaperUpdating
25137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && (mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME)
25237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                > SystemClock.uptimeMillis()
25337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && mWallpaper.userId == mCurrentUserId) {
2548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Reverting to built-in wallpaper!");
2555dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        clearWallpaperLocked(true, mWallpaper.userId, null);
2560cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                    }
2570cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                }
2584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
26037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
2615dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void attachEngine(IWallpaperEngine engine) {
2635dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            synchronized (mLock) {
2645dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                mEngine = engine;
2655dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
2665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
2675dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
2685dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2695dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        public void engineShown(IWallpaperEngine engine) {
2705dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            synchronized (mLock) {
2715dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (mReply != null) {
2725dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    long ident = Binder.clearCallingIdentity();
2735dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    try {
2745dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        mReply.sendResult(null);
2755dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    } catch (RemoteException e) {
2765dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        Binder.restoreCallingIdentity(ident);
2775dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    }
2785dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    mReply = null;
2795dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                }
2805dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
2814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
28237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
2835dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public ParcelFileDescriptor setWallpaper(String name) {
2854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
28637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaper.connection == this) {
28737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    return updateWallpaperBitmapLocked(name, mWallpaper);
2884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
2894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                return null;
2904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
2924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
29337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
29421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    class MyPackageMonitor extends PackageMonitor {
29521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
29621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onPackageUpdateFinished(String packageName, int uid) {
29721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            synchronized (mLock) {
298c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
299c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return;
300c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
301c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
302c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
30337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperComponent != null
30437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
30537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperUpdating = false;
30637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        ComponentName comp = wallpaper.wallpaperComponent;
30737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        clearWallpaperComponentLocked(wallpaper);
308c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                        if (!bindWallpaperComponentLocked(comp, false, false,
309c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                                wallpaper, null)) {
31037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.w(TAG, "Wallpaper no longer available; reverting to default");
3115dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                            clearWallpaperLocked(false, wallpaper.userId, null);
31237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        }
31380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    }
31480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                }
31580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            }
31680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        }
31780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn
31880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        @Override
31980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        public void onPackageModified(String packageName) {
32080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            synchronized (mLock) {
321c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
322c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return;
323c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
324c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
325c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
32637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperComponent == null
32737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            || !wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
328c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                        return;
32937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    }
330d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    doPackagesChangedLocked(true, wallpaper);
33121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
33221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
33321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
33421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
33521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
33621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onPackageUpdateStarted(String packageName, int uid) {
33721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            synchronized (mLock) {
338c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
339c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return;
340c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
341c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
342c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
34337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperComponent != null
34437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
34537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperUpdating = true;
34637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    }
34721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
34821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
34921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
35021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
35121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
35221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
353d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            synchronized (mLock) {
354d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                boolean changed = false;
355c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
356c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return false;
357c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
358c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
359c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
360d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    boolean res = doPackagesChangedLocked(doit, wallpaper);
361d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    changed |= res;
362d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
363d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                return changed;
36437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
36521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
36621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
36721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
36821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onSomePackagesChanged() {
369d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            synchronized (mLock) {
370c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (mCurrentUserId != getChangingUserId()) {
371c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                    return;
372c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                }
373c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId);
374c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn                if (wallpaper != null) {
375d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    doPackagesChangedLocked(true, wallpaper);
376d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
37737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
37821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
37937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
380d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn        boolean doPackagesChangedLocked(boolean doit, WallpaperData wallpaper) {
38121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            boolean changed = false;
382d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.wallpaperComponent != null) {
383d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                int change = isPackageDisappearing(wallpaper.wallpaperComponent
384d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        .getPackageName());
385d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                if (change == PACKAGE_PERMANENT_CHANGE
386d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        || change == PACKAGE_TEMPORARY_CHANGE) {
387d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    changed = true;
388d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    if (doit) {
389d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        Slog.w(TAG, "Wallpaper uninstalled, removing: "
39037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                + wallpaper.wallpaperComponent);
3915dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        clearWallpaperLocked(false, wallpaper.userId, null);
39221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    }
39321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
394d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            }
395d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.nextWallpaperComponent != null) {
396d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                int change = isPackageDisappearing(wallpaper.nextWallpaperComponent
397d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        .getPackageName());
398d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                if (change == PACKAGE_PERMANENT_CHANGE
399d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        || change == PACKAGE_TEMPORARY_CHANGE) {
400d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    wallpaper.nextWallpaperComponent = null;
401d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
402d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            }
403d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.wallpaperComponent != null
404d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    && isPackageModified(wallpaper.wallpaperComponent.getPackageName())) {
405d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                try {
406d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    mContext.getPackageManager().getServiceInfo(
407d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                            wallpaper.wallpaperComponent, 0);
408d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                } catch (NameNotFoundException e) {
409d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    Slog.w(TAG, "Wallpaper component gone, removing: "
410d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                            + wallpaper.wallpaperComponent);
4115dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    clearWallpaperLocked(false, wallpaper.userId, null);
412d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
413d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            }
414d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.nextWallpaperComponent != null
415d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    && isPackageModified(wallpaper.nextWallpaperComponent.getPackageName())) {
416d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                try {
417d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    mContext.getPackageManager().getServiceInfo(
418d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                            wallpaper.nextWallpaperComponent, 0);
419d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                } catch (NameNotFoundException e) {
420d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    wallpaper.nextWallpaperComponent = null;
42121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
42221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
42321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return changed;
42421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
42521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
42621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
4278cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public WallpaperManagerService(Context context) {
4288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "WallpaperService startup");
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
4304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        mIWindowManager = IWindowManager.Stub.asInterface(
4314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                ServiceManager.getService(Context.WINDOW_SERVICE));
4324e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani        mIPackageManager = AppGlobals.getPackageManager();
43321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        mMonitor = new MyPackageMonitor();
434c72fc674a33b8d17585764d09d3bb6c77d7d947eDianne Hackborn        mMonitor.register(context, null, UserHandle.ALL, true);
43561f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        getWallpaperDir(UserHandle.USER_OWNER).mkdirs();
43661f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        loadSettingsLocked(UserHandle.USER_OWNER);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private static File getWallpaperDir(int userId) {
44061f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        return Environment.getUserSystemDirectory(userId);
44137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
44237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.finalize();
44637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        for (int i = 0; i < mWallpaperMap.size(); i++) {
44737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.valueAt(i);
44837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.wallpaperObserver.stopWatching();
44937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
451135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani
452f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    public void systemReady() {
4538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "systemReady");
45461f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        WallpaperData wallpaper = mWallpaperMap.get(UserHandle.USER_OWNER);
4555dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        switchWallpaper(wallpaper, null);
45637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper);
45737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.wallpaperObserver.startWatching();
45837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
459135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        IntentFilter userFilter = new IntentFilter();
460135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        userFilter.addAction(Intent.ACTION_USER_REMOVED);
461756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        userFilter.addAction(Intent.ACTION_USER_STOPPING);
462135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        mContext.registerReceiver(new BroadcastReceiver() {
46337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            @Override
464135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            public void onReceive(Context context, Intent intent) {
465135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                String action = intent.getAction();
4665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (Intent.ACTION_USER_REMOVED.equals(action)) {
467756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                    onRemoveUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
468756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                            UserHandle.USER_NULL));
469135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                }
4700c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                // TODO: Race condition causing problems when cleaning up on stopping a user.
4710c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                // Comment this out for now.
4720c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                // else if (Intent.ACTION_USER_STOPPING.equals(action)) {
4730c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                //     onStoppingUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
4740c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                //             UserHandle.USER_NULL));
4750c293717126b52e71eaf794394f336b5940fb349Amith Yamasani                // }
47637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
477135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        }, userFilter);
478756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani
4795dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        try {
4805dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            ActivityManagerNative.getDefault().registerUserSwitchObserver(
4815dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    new IUserSwitchObserver.Stub() {
4825dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        @Override
4835dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        public void onUserSwitching(int newUserId, IRemoteCallback reply) {
4845dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                            switchUser(newUserId, reply);
4855dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        }
4865dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
4875dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        @Override
4885dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        public void onUserSwitchComplete(int newUserId) throws RemoteException {
4895dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        }
4905dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    });
4915dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        } catch (RemoteException e) {
4925dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            // TODO Auto-generated catch block
4935dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            e.printStackTrace();
4945dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
49537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
49637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
49737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    String getName() {
4985dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        synchronized (mLock) {
4995dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            return mWallpaperMap.get(0).name;
5005dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
50137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
50237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
503756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani    void onStoppingUser(int userId) {
504756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        if (userId < 1) return;
505135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        synchronized (mLock) {
506135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(userId);
507135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            if (wallpaper != null) {
508756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                if (wallpaper.wallpaperObserver != null) {
509756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                    wallpaper.wallpaperObserver.stopWatching();
510756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                    wallpaper.wallpaperObserver = null;
511756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani                }
512135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                mWallpaperMap.remove(userId);
513135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            }
514756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        }
515756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani    }
516756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani
517756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani    void onRemoveUser(int userId) {
518756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        if (userId < 1) return;
519756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani        synchronized (mLock) {
520756901d82b41f50610a63b7cf4c7747a70f1f724Amith Yamasani            onStoppingUser(userId);
521135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            File wallpaperFile = new File(getWallpaperDir(userId), WALLPAPER);
522135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            wallpaperFile.delete();
523135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            File wallpaperInfoFile = new File(getWallpaperDir(userId), WALLPAPER_INFO);
524135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            wallpaperInfoFile.delete();
525135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        }
526135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    }
527135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani
5285dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    void switchUser(int userId, IRemoteCallback reply) {
52937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        synchronized (mLock) {
53037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mCurrentUserId = userId;
53137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(userId);
53237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper == null) {
53337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper = new WallpaperData(userId);
53437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                mWallpaperMap.put(userId, wallpaper);
53537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                loadSettingsLocked(userId);
5366474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            }
5376474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            // Not started watching yet, in case wallpaper data was loaded for other reasons.
5386474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            if (wallpaper.wallpaperObserver == null) {
53937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper);
54037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.wallpaperObserver.startWatching();
54137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
5425dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            switchWallpaper(wallpaper, reply);
54337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
54437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
54537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
5465dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    void switchWallpaper(WallpaperData wallpaper, IRemoteCallback reply) {
547f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        synchronized (mLock) {
54880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            RuntimeException e = null;
549f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            try {
55037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                ComponentName cname = wallpaper.wallpaperComponent != null ?
55137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperComponent : wallpaper.nextWallpaperComponent;
5525dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (bindWallpaperComponentLocked(cname, true, false, wallpaper, reply)) {
55380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    return;
554f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                }
55580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            } catch (RuntimeException e1) {
55680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                e = e1;
557f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
55880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            Slog.w(TAG, "Failure starting previous wallpaper", e);
5595dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            clearWallpaperLocked(false, wallpaper.userId, reply);
560f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
561f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    }
56237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() {
5648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "clearWallpaper");
5659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
5665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            clearWallpaperLocked(false, UserHandle.getCallingUserId(), null);
56721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
56821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
56921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
5705dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    void clearWallpaperLocked(boolean defaultFailed, int userId, IRemoteCallback reply) {
57137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData wallpaper = mWallpaperMap.get(userId);
57237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File f = new File(getWallpaperDir(userId), WALLPAPER);
57321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (f.exists()) {
57421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            f.delete();
57521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
57621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        final long ident = Binder.clearCallingIdentity();
57780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        RuntimeException e = null;
57821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        try {
57937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.imageWallpaperPending = false;
58037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (userId != mCurrentUserId) return;
58180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            if (bindWallpaperComponentLocked(defaultFailed
582bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    ? IMAGE_WALLPAPER
5835dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    : null, true, false, wallpaper, reply)) {
58480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                return;
58580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            }
58680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        } catch (IllegalArgumentException e1) {
58780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            e = e1;
58821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        } finally {
58921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            Binder.restoreCallingIdentity(ident);
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
59180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn
59280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // This can happen if the default wallpaper component doesn't
59380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // exist.  This should be a system configuration problem, but
59480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // let's not let it crash the system and just live with no
59580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // wallpaper.
59680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        Slog.e(TAG, "Default wallpaper component not found!", e);
59737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        clearWallpaperComponentLocked(wallpaper);
5985dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        if (reply != null) {
5995dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            try {
6005dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                reply.sendResult(null);
6015dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            } catch (RemoteException e1) {
6025dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
6035dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6065dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    public boolean hasNamedWallpaper(String name) {
6075dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        synchronized (mLock) {
6086474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            List<UserInfo> users;
6096474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            long ident = Binder.clearCallingIdentity();
6106474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            try {
6116474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                users = ((UserManager) mContext.getSystemService(Context.USER_SERVICE)).getUsers();
6126474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            } finally {
6136474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                Binder.restoreCallingIdentity(ident);
6146474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            }
6156474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani            for (UserInfo user: users) {
6166474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                WallpaperData wd = mWallpaperMap.get(user.id);
6176474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                if (wd == null) {
6186474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                    // User hasn't started yet, so load her settings to peek at the wallpaper
6196474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                    loadSettingsLocked(user.id);
6206474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                    wd = mWallpaperMap.get(user.id);
6216474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                }
6226474c4cd939fcb03449e607c7cd06b95c4632aaaAmith Yamasani                if (wd != null && name.equals(wd.name)) {
6235dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    return true;
6245dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                }
6255dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6275dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        return false;
6285dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6305dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    public void setDimensionHints(int width, int height) throws RemoteException {
6315dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        checkPermission(android.Manifest.permission.SET_WALLPAPER_HINTS);
6329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
6335dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            int userId = UserHandle.getCallingUserId();
6345dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(userId);
6355dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper == null) {
6365dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
6375dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
6385dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (width <= 0 || height <= 0) {
6395dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalArgumentException("width and height must be > 0");
6405dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
6415dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
64237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (width != wallpaper.width || height != wallpaper.height) {
64337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.width = width;
64437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.height = height;
64537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                saveSettingsLocked(wallpaper);
64637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mCurrentUserId != userId) return; // Don't change the properties now
64737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.connection != null) {
64837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.connection.mEngine != null) {
649284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        try {
65037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            wallpaper.connection.mEngine.setDesiredSize(
651284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                                    width, height);
652284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        } catch (RemoteException e) {
653284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        }
65437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        notifyCallbacksLocked(wallpaper);
655284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    }
656284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
6579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWidthHint() throws RemoteException {
6629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
663f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(UserHandle.getCallingUserId());
66437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            return wallpaper.width;
6659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getHeightHint() throws RemoteException {
6699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
670f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(UserHandle.getCallingUserId());
67137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            return wallpaper.height;
6729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
675284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn    public ParcelFileDescriptor getWallpaper(IWallpaperManagerCallback cb,
676284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            Bundle outParams) {
6779bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
67837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            // This returns the current user's wallpaper, if called by a system service. Else it
67937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            // returns the wallpaper for the calling user.
68037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            int callingUid = Binder.getCallingUid();
68137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            int wallpaperUserId = 0;
68237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (callingUid == android.os.Process.SYSTEM_UID) {
68337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaperUserId = mCurrentUserId;
68437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            } else {
685f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                wallpaperUserId = UserHandle.getUserId(callingUid);
68637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
68737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(wallpaperUserId);
6889bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
689284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (outParams != null) {
69037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    outParams.putInt("width", wallpaper.width);
69137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    outParams.putInt("height", wallpaper.height);
692284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
69337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.callbacks.register(cb);
69437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                File f = new File(getWallpaperDir(wallpaperUserId), WALLPAPER);
6959bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (!f.exists()) {
6969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    return null;
6979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
6989bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                return ParcelFileDescriptor.open(f, MODE_READ_ONLY);
6999bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } catch (FileNotFoundException e) {
7009bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                /* Shouldn't happen as we check to see if the file exists */
7018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Error getting wallpaper", e);
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            return null;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
707eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public WallpaperInfo getWallpaperInfo() {
708f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        int userId = UserHandle.getCallingUserId();
709eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        synchronized (mLock) {
71037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(userId);
71137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.connection != null) {
71237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                return wallpaper.connection.mInfo;
713eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
714eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return null;
715eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
716eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
71737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
7189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    public ParcelFileDescriptor setWallpaper(String name) {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkPermission(android.Manifest.permission.SET_WALLPAPER);
7209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
7215dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (DEBUG) Slog.v(TAG, "setWallpaper");
7225dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            int userId = UserHandle.getCallingUserId();
7235dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(userId);
7245dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper == null) {
7255dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
7265dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
7270cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            final long ident = Binder.clearCallingIdentity();
7280cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            try {
72937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name, wallpaper);
7300cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                if (pfd != null) {
73137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    wallpaper.imageWallpaperPending = true;
7320cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                }
7330cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                return pfd;
7340cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            } finally {
7350cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                Binder.restoreCallingIdentity(ident);
7364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
7374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
7384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
7394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
74037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    ParcelFileDescriptor updateWallpaperBitmapLocked(String name, WallpaperData wallpaper) {
7414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        if (name == null) name = "";
7424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        try {
74337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            File dir = getWallpaperDir(wallpaper.userId);
74437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (!dir.exists()) {
74537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                dir.mkdir();
746ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn                FileUtils.setPermissions(
74737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        dir.getPath(),
748ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
749ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn                        -1, -1);
750ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn            }
751554cb0c290406f5bba34908489db5382a69d0a9arpcraig            File file = new File(dir, WALLPAPER);
752554cb0c290406f5bba34908489db5382a69d0a9arpcraig            ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
7534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    MODE_CREATE|MODE_READ_WRITE);
754554cb0c290406f5bba34908489db5382a69d0a9arpcraig            if (!SELinux.restorecon(file)) {
755554cb0c290406f5bba34908489db5382a69d0a9arpcraig                return null;
756554cb0c290406f5bba34908489db5382a69d0a9arpcraig            }
75737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.name = name;
7584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            return fd;
7594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        } catch (FileNotFoundException e) {
7608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Error setting wallpaper", e);
7614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
7624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return null;
7634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
7644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
7654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public void setWallpaperComponent(ComponentName name) {
7664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT);
7674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        synchronized (mLock) {
7685dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (DEBUG) Slog.v(TAG, "setWallpaperComponent name=" + name);
7695dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            int userId = UserHandle.getCallingUserId();
7705dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(userId);
7715dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper == null) {
7725dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
7735dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
7744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            final long ident = Binder.clearCallingIdentity();
7759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
77637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.imageWallpaperPending = false;
7775dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                bindWallpaperComponentLocked(name, false, true, wallpaper, null);
778f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            } finally {
779f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                Binder.restoreCallingIdentity(ident);
780f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
781f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
782f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    }
783f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
78437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    boolean bindWallpaperComponentLocked(ComponentName componentName, boolean force,
7855dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            boolean fromUser, WallpaperData wallpaper, IRemoteCallback reply) {
7868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: componentName=" + componentName);
787f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        // Has the component changed?
7889ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn        if (!force) {
78937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.connection != null) {
79037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.wallpaperComponent == null) {
7919ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    if (componentName == null) {
7929ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                        if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: still using default");
7939ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                        // Still using default wallpaper.
79480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        return true;
7959ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    }
79637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                } else if (wallpaper.wallpaperComponent.equals(componentName)) {
7979ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    // Changing to same wallpaper.
7989ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    if (DEBUG) Slog.v(TAG, "same wallpaper");
79980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    return true;
8004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
801f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
802f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
803f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
804f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        try {
805a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            if (componentName == null) {
806322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                String defaultComponent =
807322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    mContext.getString(com.android.internal.R.string.default_wallpaper_component);
808a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (defaultComponent != null) {
809322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    // See if there is a default wallpaper component specified
810a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    componentName = ComponentName.unflattenFromString(defaultComponent);
8118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "Use default component wallpaper:" + componentName);
812322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                }
813a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (componentName == null) {
814322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    // Fall back to static image wallpaper
815bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    componentName = IMAGE_WALLPAPER;
816322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    //clearWallpaperComponentLocked();
817322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    //return;
8188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "Using image wallpaper");
819322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                }
820f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
8214e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani            int serviceUserId = wallpaper.userId;
8224e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani            ServiceInfo si = mIPackageManager.getServiceInfo(componentName,
8234e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                    PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS, serviceUserId);
824f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) {
82580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                String msg = "Selected service does not require "
826f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                        + android.Manifest.permission.BIND_WALLPAPER
82780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        + ": " + componentName;
82880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                if (fromUser) {
82980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    throw new SecurityException(msg);
83080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                }
83180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                Slog.w(TAG, msg);
83280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                return false;
833f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
834f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
835eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            WallpaperInfo wi = null;
836eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
837f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE);
838bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn            if (componentName != null && !componentName.equals(IMAGE_WALLPAPER)) {
8394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // Make sure the selected service is actually a wallpaper service.
8404e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                List<ResolveInfo> ris =
8414e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                        mIPackageManager.queryIntentServices(intent,
8424e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
8434e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                                PackageManager.GET_META_DATA, serviceUserId);
8444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                for (int i=0; i<ris.size(); i++) {
8454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    ServiceInfo rsi = ris.get(i).serviceInfo;
8464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    if (rsi.name.equals(si.name) &&
8474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            rsi.packageName.equals(si.packageName)) {
848eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        try {
849eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            wi = new WallpaperInfo(mContext, ris.get(i));
850eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        } catch (XmlPullParserException e) {
85180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            if (fromUser) {
85280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                                throw new IllegalArgumentException(e);
85380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            }
85480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            Slog.w(TAG, e);
85580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            return false;
856eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        } catch (IOException e) {
85780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            if (fromUser) {
85880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                                throw new IllegalArgumentException(e);
85980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            }
86080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            Slog.w(TAG, e);
86180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            return false;
862eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        }
8634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        break;
8644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
8654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
866eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                if (wi == null) {
86780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    String msg = "Selected service is not a wallpaper: "
86880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            + componentName;
86980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    if (fromUser) {
87080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        throw new SecurityException(msg);
87180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    }
87280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    Slog.w(TAG, msg);
87380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    return false;
8744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
8759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
876f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
877f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            // Bind the service!
8788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG) Slog.v(TAG, "Binding to:" + componentName);
87937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperConnection newConn = new WallpaperConnection(wi, wallpaper);
880a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            intent.setComponent(componentName);
881dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn            intent.putExtra(Intent.EXTRA_CLIENT_LABEL,
882dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn                    com.android.internal.R.string.wallpaper_binding_label);
8834120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn            intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivityAsUser(
884eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    mContext, 0,
885eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER),
886eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            mContext.getText(com.android.internal.R.string.chooser_wallpaper)),
8874120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                    0, null, new UserHandle(serviceUserId)));
88837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (!mContext.bindService(intent, newConn, Context.BIND_AUTO_CREATE, serviceUserId)) {
88980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                String msg = "Unable to bind service: "
89080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        + componentName;
89180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                if (fromUser) {
89280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    throw new IllegalArgumentException(msg);
89380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                }
89480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                Slog.w(TAG, msg);
89580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                return false;
896f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
89737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.userId == mCurrentUserId && mLastWallpaper != null) {
89837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                detachWallpaperLocked(mLastWallpaper);
89937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
90037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.wallpaperComponent = componentName;
90137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection = newConn;
90237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.lastDiedTime = SystemClock.uptimeMillis();
9035dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            newConn.mReply = reply;
904f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            try {
90537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.userId == mCurrentUserId) {
90637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (DEBUG)
90737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        Slog.v(TAG, "Adding window token: " + newConn.mToken);
90837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    mIWindowManager.addWindowToken(newConn.mToken,
90937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            WindowManager.LayoutParams.TYPE_WALLPAPER);
91037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    mLastWallpaper = wallpaper;
91137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                }
912f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            } catch (RemoteException e) {
913f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
9144e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani        } catch (RemoteException e) {
9154e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani            String msg = "Remote exception for " + componentName + "\n" + e;
91680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            if (fromUser) {
91780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                throw new IllegalArgumentException(msg);
91880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            }
91980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            Slog.w(TAG, msg);
92080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            return false;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
92280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        return true;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
92437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
92537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    void detachWallpaperLocked(WallpaperData wallpaper) {
92637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.connection != null) {
9275dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper.connection.mReply != null) {
9285dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                try {
9295dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    wallpaper.connection.mReply.sendResult(null);
9305dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                } catch (RemoteException e) {
9315dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                }
9325dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                wallpaper.connection.mReply = null;
9335dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
93437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.connection.mEngine != null) {
9354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                try {
93637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    wallpaper.connection.mEngine.destroy();
9374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                } catch (RemoteException e) {
9384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
9394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
94037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mContext.unbindService(wallpaper.connection);
941e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            try {
94237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (DEBUG)
94337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    Slog.v(TAG, "Removing window token: " + wallpaper.connection.mToken);
94437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                mIWindowManager.removeWindowToken(wallpaper.connection.mToken);
945e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            } catch (RemoteException e) {
946e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            }
94737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection.mService = null;
94837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection.mEngine = null;
94937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection = null;
9504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
9514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
95237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
95337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    void clearWallpaperComponentLocked(WallpaperData wallpaper) {
95437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.wallpaperComponent = null;
95537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        detachWallpaperLocked(wallpaper);
95637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
95737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
95837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    void attachServiceLocked(WallpaperConnection conn, WallpaperData wallpaper) {
9594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        try {
9603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            conn.mService.attach(conn, conn.mToken,
9613be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    WindowManager.LayoutParams.TYPE_WALLPAPER, false,
96237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    wallpaper.width, wallpaper.height);
9634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        } catch (RemoteException e) {
9648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed attaching wallpaper; clearing", e);
96537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (!wallpaper.wallpaperUpdating) {
9665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                bindWallpaperComponentLocked(null, false, false, wallpaper, null);
96721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
9684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
9694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
97037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
97137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void notifyCallbacksLocked(WallpaperData wallpaper) {
97237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final int n = wallpaper.callbacks.beginBroadcast();
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < n; i++) {
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
97537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.callbacks.getBroadcastItem(i).onWallpaperChanged();
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The RemoteCallbackList will take care of removing
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the dead object for us.
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
98237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.callbacks.finishBroadcast();
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED);
9845ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId));
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void checkPermission(String permission) {
9889bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (PackageManager.PERMISSION_GRANTED!= mContext.checkCallingOrSelfPermission(permission)) {
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", must have permission " + permission);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9939bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
99437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private static JournaledFile makeJournaledFile(int userId) {
99561f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        final String base = new File(getWallpaperDir(userId), WALLPAPER_INFO).getAbsolutePath();
9969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        return new JournaledFile(new File(base), new File(base + ".tmp"));
9979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
9989bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
99937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void saveSettingsLocked(WallpaperData wallpaper) {
100037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        JournaledFile journal = makeJournaledFile(wallpaper.userId);
10019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        FileOutputStream stream = null;
10029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
10039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream = new FileOutputStream(journal.chooseForWrite(), false);
10049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            XmlSerializer out = new FastXmlSerializer();
10059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.setOutput(stream, "utf-8");
10069bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.startDocument(null, true);
10079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
10089bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.startTag(null, "wp");
100937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            out.attribute(null, "width", Integer.toString(wallpaper.width));
101037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            out.attribute(null, "height", Integer.toString(wallpaper.height));
101137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            out.attribute(null, "name", wallpaper.name);
101237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.wallpaperComponent != null
1013bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    && !wallpaper.wallpaperComponent.equals(IMAGE_WALLPAPER)) {
10144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                out.attribute(null, "component",
101537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperComponent.flattenToShortString());
10164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
10179bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.endTag(null, "wp");
10189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
10199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.endDocument();
10209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream.close();
10219bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            journal.commit();
10229bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
10239bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
10249bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (stream != null) {
10259bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    stream.close();
10269bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
10279bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } catch (IOException ex) {
10289bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                // Ignore
10299bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
10309bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            journal.rollback();
10319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
10329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
10339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
103437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void migrateFromOld() {
103537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File oldWallpaper = new File(WallpaperBackupHelper.WALLPAPER_IMAGE_KEY);
103637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File oldInfo = new File(WallpaperBackupHelper.WALLPAPER_INFO_KEY);
103737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (oldWallpaper.exists()) {
103837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            File newWallpaper = new File(getWallpaperDir(0), WALLPAPER);
103937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            oldWallpaper.renameTo(newWallpaper);
104037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
104137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (oldInfo.exists()) {
104237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            File newInfo = new File(getWallpaperDir(0), WALLPAPER_INFO);
104337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            oldInfo.renameTo(newInfo);
104437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
104537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
104637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
104737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void loadSettingsLocked(int userId) {
10488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "loadSettingsLocked");
1049a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
105037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        JournaledFile journal = makeJournaledFile(userId);
10519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        FileInputStream stream = null;
10529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        File file = journal.chooseForRead();
105337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (!file.exists()) {
105437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            // This should only happen one time, when upgrading from a legacy system
105537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            migrateFromOld();
105637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
105737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData wallpaper = mWallpaperMap.get(userId);
105837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper == null) {
105937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper = new WallpaperData(userId);
106037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaperMap.put(userId, wallpaper);
106137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
10629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        boolean success = false;
10639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
10649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream = new FileInputStream(file);
10659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            XmlPullParser parser = Xml.newPullParser();
10669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            parser.setInput(stream, null);
10679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
10689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int type;
10699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            do {
10709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                type = parser.next();
10719bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (type == XmlPullParser.START_TAG) {
10729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    String tag = parser.getName();
10739bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if ("wp".equals(tag)) {
107437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.width = Integer.parseInt(parser.getAttributeValue(null, "width"));
107537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.height = Integer.parseInt(parser
107637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                .getAttributeValue(null, "height"));
107737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.name = parser.getAttributeValue(null, "name");
10784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        String comp = parser.getAttributeValue(null, "component");
107937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.nextWallpaperComponent = comp != null
10804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                ? ComponentName.unflattenFromString(comp)
10814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                : null;
108237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        if (wallpaper.nextWallpaperComponent == null
108337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                || "android".equals(wallpaper.nextWallpaperComponent
108437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                        .getPackageName())) {
1085bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                            wallpaper.nextWallpaperComponent = IMAGE_WALLPAPER;
10869ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                        }
1087a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
1088a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        if (DEBUG) {
108937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mWidth:" + wallpaper.width);
109037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mHeight:" + wallpaper.height);
109137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mName:" + wallpaper.name);
109237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mNextWallpaperComponent:"
109337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                    + wallpaper.nextWallpaperComponent);
1094a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        }
10959bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
10969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
10979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } while (type != XmlPullParser.END_DOCUMENT);
10989bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            success = true;
109913579ed3305bf89b41a9fa88e1347f0e0769d279Dianne Hackborn        } catch (FileNotFoundException e) {
110013579ed3305bf89b41a9fa88e1347f0e0769d279Dianne Hackborn            Slog.w(TAG, "no current wallpaper -- first boot?");
11019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (NullPointerException e) {
11028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (NumberFormatException e) {
11048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (XmlPullParserException e) {
11068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
11088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11099bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IndexOutOfBoundsException e) {
11108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
11119bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
11129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
11139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (stream != null) {
11149bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                stream.close();
11159bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
11169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
11179bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            // Ignore
11189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
11199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (!success) {
112137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.width = -1;
112237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.height = -1;
112337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.name = "";
11249bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
112544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn
112644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        // We always want to have some reasonable width hint.
112744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
112844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        Display d = wm.getDefaultDisplay();
112944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        int baseSize = d.getMaximumSizeDimension();
113037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.width < baseSize) {
113137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.width = baseSize;
113244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
113337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.height < baseSize) {
113437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.height = baseSize;
113544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
11369bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
11379bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
1138194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick    // Called by SystemBackupAgent after files are restored to disk.
11399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    void settingsRestored() {
114037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        // TODO: If necessary, make it work for secondary users as well. This currently assumes
114137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        // restores only to the primary user
11428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "settingsRestored");
114337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData wallpaper = null;
11449bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        boolean success = false;
11459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
114637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            loadSettingsLocked(0);
114737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper = mWallpaperMap.get(0);
114837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.nextWallpaperComponent != null
1149bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    && !wallpaper.nextWallpaperComponent.equals(IMAGE_WALLPAPER)) {
115037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (!bindWallpaperComponentLocked(wallpaper.nextWallpaperComponent, false, false,
11515dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        wallpaper, null)) {
1152e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // No such live wallpaper or other failure; fall back to the default
1153e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // live wallpaper (since the profile being restored indicated that the
1154e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // user had selected a live rather than static one).
11555dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    bindWallpaperComponentLocked(null, false, false, wallpaper, null);
1156e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                }
11579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                success = true;
11589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } else {
1159a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                // If there's a wallpaper name, we use that.  If that can't be loaded, then we
1160a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                // use the default.
116137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if ("".equals(wallpaper.name)) {
11628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "settingsRestored: name is empty");
1163a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    success = true;
1164a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                } else {
11658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "settingsRestored: attempting to restore named resource");
116637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    success = restoreNamedResourceLocked(wallpaper);
1167a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                }
11688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG) Slog.v(TAG, "settingsRestored: success=" + success);
1169a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (success) {
117037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    bindWallpaperComponentLocked(wallpaper.nextWallpaperComponent, false, false,
11715dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                            wallpaper, null);
1172a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                }
11739bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
11749bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
11759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (!success) {
117737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            Slog.e(TAG, "Failed to restore wallpaper: '" + wallpaper.name + "'");
117837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.name = "";
117937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            getWallpaperDir(0).delete();
11809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
1181194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick
1182194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick        synchronized (mLock) {
118337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            saveSettingsLocked(wallpaper);
1184194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick        }
11859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
11869bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
118737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    boolean restoreNamedResourceLocked(WallpaperData wallpaper) {
118837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.name.length() > 4 && "res:".equals(wallpaper.name.substring(0, 4))) {
118937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            String resName = wallpaper.name.substring(4);
11909bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11919bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String pkg = null;
11929bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int colon = resName.indexOf(':');
11939bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (colon > 0) {
11949bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                pkg = resName.substring(0, colon);
11959bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
11969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String ident = null;
11989bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int slash = resName.lastIndexOf('/');
11999bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (slash > 0) {
12009bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                ident = resName.substring(slash+1);
12019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
12029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String type = null;
12049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (colon > 0 && slash > 0 && (slash-colon) > 1) {
12059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                type = resName.substring(colon+1, slash);
12069bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
12079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12089bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (pkg != null && ident != null && type != null) {
12099bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                int resId = -1;
12109bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                InputStream res = null;
12119bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                FileOutputStream fos = null;
12129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                try {
12139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    Context c = mContext.createPackageContext(pkg, Context.CONTEXT_RESTRICTED);
12149bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    Resources r = c.getResources();
12159bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    resId = r.getIdentifier(resName, null, null);
12169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (resId == 0) {
12178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.e(TAG, "couldn't resolve identifier pkg=" + pkg + " type=" + type
12189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                                + " ident=" + ident);
12199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        return false;
12209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
12219bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12229bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    res = r.openRawResource(resId);
122337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperFile.exists()) {
122437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperFile.delete();
12251afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    }
122637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    fos = new FileOutputStream(wallpaper.wallpaperFile);
12279bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12289bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    byte[] buffer = new byte[32768];
12299bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    int amt;
12309bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    while ((amt=res.read(buffer)) > 0) {
12319bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        fos.write(buffer, 0, amt);
12329bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
12339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    // mWallpaperObserver will notice the close and send the change broadcast
12349bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
12358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Restored wallpaper: " + resName);
12369bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    return true;
12379bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (NameNotFoundException e) {
12388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "Package name " + pkg + " not found");
12399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (Resources.NotFoundException e) {
12408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "Resource not found: " + resId);
12419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (IOException e) {
12428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "IOException while restoring wallpaper ", e);
12439bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } finally {
12449bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (res != null) {
12459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        try {
12469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                            res.close();
12479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        } catch (IOException ex) {}
12489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
12499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (fos != null) {
12508bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn                        FileUtils.sync(fos);
12519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        try {
12529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                            fos.close();
12539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        } catch (IOException ex) {}
12549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
12559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
12569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
12579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
12589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        return false;
12599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
126037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
1261eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    @Override
1262eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1263eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
1264eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                != PackageManager.PERMISSION_GRANTED) {
1265eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
1266eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println("Permission Denial: can't dump wallpaper service from from pid="
1267eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + Binder.getCallingPid()
1268eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + ", uid=" + Binder.getCallingUid());
1269eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return;
1270eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1271eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
1272eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        synchronized (mLock) {
1273eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println("Current Wallpaper Service state:");
127437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            for (int i = 0; i < mWallpaperMap.size(); i++) {
127537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                WallpaperData wallpaper = mWallpaperMap.valueAt(i);
127637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(" User " + wallpaper.userId + ":");
127737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print("  mWidth=");
127837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print(wallpaper.width);
127937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print(" mHeight=");
128037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(wallpaper.height);
128137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print("  mName=");
128237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(wallpaper.name);
128337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print("  mWallpaperComponent=");
128437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(wallpaper.wallpaperComponent);
128537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.connection != null) {
128637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    WallpaperConnection conn = wallpaper.connection;
128737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("  Wallpaper connection ");
128837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print(conn);
128937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(":");
129037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (conn.mInfo != null) {
129137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        pw.print("    mInfo.component=");
129237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        pw.println(conn.mInfo.getComponent());
129337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    }
129437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mToken=");
129537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(conn.mToken);
129637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mService=");
129737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(conn.mService);
129837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mEngine=");
129937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(conn.mEngine);
130037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mLastDiedTime=");
130137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(wallpaper.lastDiedTime - SystemClock.uptimeMillis());
130237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                }
1303eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
1304eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1305eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1307