WallpaperManagerService.java revision 5dc5a00e7ebadc085ded7e29feacd17e53698486
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;
419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.content.res.Resources;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
43284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackbornimport android.os.Bundle;
44135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.os.Environment;
458bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils;
464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.IBinder;
475dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackbornimport android.os.IRemoteCallback;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.FileObserver;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteCallbackList;
52554cb0c290406f5bba34908489db5382a69d0a9arpcraigimport android.os.SELinux;
534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.os.ServiceManager;
540cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackbornimport android.os.SystemClock;
55f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperConnection;
574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperEngine;
584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.IWallpaperService;
594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.service.wallpaper.WallpaperService;
608a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
6137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasaniimport android.util.SparseArray;
629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport android.util.Xml;
6344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornimport android.view.Display;
644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.IWindowManager;
654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManager;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport java.io.FileDescriptor;
689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.IOException;
699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.InputStream;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileInputStream;
739bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport java.io.FileOutputStream;
74eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport java.io.PrintWriter;
754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport java.util.List;
769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
779bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParser;
789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlPullParserException;
799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onoratoimport org.xmlpull.v1.XmlSerializer;
809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
8121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport com.android.internal.content.PackageMonitor;
822269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.FastXmlSerializer;
831afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport com.android.internal.util.JournaledFile;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
858cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornclass WallpaperManagerService extends IWallpaperManager.Stub {
864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    static final String TAG = "WallpaperService";
87cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn    static final boolean DEBUG = false;
889bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
89407ec78b828173257b0c5dae221649a4ccd8b058Romain Guy    final Object mLock = new Object[0];
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
910cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    /**
920cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     * Minimum time between crashes of a wallpaper service for us to consider
930cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     * restarting it vs. just reverting to the static wallpaper.
940cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn     */
950cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final long MIN_WALLPAPER_CRASH_TIME = 10000;
960cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn    static final String WALLPAPER = "wallpaper";
9737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    static final String WALLPAPER_INFO = "wallpaper_info.xml";
989bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Observes the wallpaper for changes and notifies all IWallpaperServiceCallbacks
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that the wallpaper has changed. The CREATE is triggered when there is no
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wallpaper set and is created for the first time. The CLOSE_WRITE is triggered
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * everytime the wallpaper is changed.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private class WallpaperObserver extends FileObserver {
10637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
10737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final WallpaperData mWallpaper;
10837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final File mWallpaperDir;
10937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final File mWallpaperFile;
11037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
11137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        public WallpaperObserver(WallpaperData wallpaper) {
11237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            super(getWallpaperDir(wallpaper.userId).getAbsolutePath(),
11337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    CLOSE_WRITE | DELETE | DELETE_SELF);
11437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaperDir = getWallpaperDir(wallpaper.userId);
11537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaper = wallpaper;
11637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaperFile = new File(mWallpaperDir, WALLPAPER);
11737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
11837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
11937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        @Override
12037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        public void onEvent(int event, String path) {
12137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (path == null) {
12237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                return;
12337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
12437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            synchronized (mLock) {
12537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                // changing the wallpaper means we'll need to back up the new one
12637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                long origId = Binder.clearCallingIdentity();
12737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                BackupManager bm = new BackupManager(mContext);
12837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                bm.dataChanged();
12937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                Binder.restoreCallingIdentity(origId);
13037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
13137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                File changedFile = new File(mWallpaperDir, path);
13237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaperFile.equals(changedFile)) {
13337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    notifyCallbacksLocked(mWallpaper);
13437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (mWallpaper.wallpaperComponent == null || event != CLOSE_WRITE
13537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            || mWallpaper.imageWallpaperPending) {
13637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        if (event == CLOSE_WRITE) {
13737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            mWallpaper.imageWallpaperPending = false;
1389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        }
13937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        bindWallpaperComponentLocked(mWallpaper.imageWallpaperComponent, true,
1405dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                                false, mWallpaper, null);
14137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        saveSettingsLocked(mWallpaper);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
14537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
14637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
14737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
1484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final Context mContext;
1494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final IWindowManager mIWindowManager;
1504e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani    final IPackageManager mIPackageManager;
15121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    final MyPackageMonitor mMonitor;
15237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    WallpaperData mLastWallpaper;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    SparseArray<WallpaperData> mWallpaperMap = new SparseArray<WallpaperData>();
15507213e6d8895af10951851435adf96a779863f6cDianne Hackborn
15637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    int mCurrentUserId;
15737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
15837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    static class WallpaperData {
15937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
16037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        int userId;
16137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
16237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File wallpaperFile;
16337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
16437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
16537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * Client is currently writing a new image wallpaper.
16637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
16737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        boolean imageWallpaperPending;
16837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
16937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
17037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * Resource name if using a picture from the wallpaper gallery
17137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
17237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        String name = "";
17337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
17437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
17537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * The component name of the currently set live wallpaper.
17637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
17737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        ComponentName wallpaperComponent;
17837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
17937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
18037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * The component name of the wallpaper that should be set next.
18137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
18237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        ComponentName nextWallpaperComponent;
18337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
18437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
18537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * Name of the component used to display bitmap wallpapers from either the gallery or
18637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * built-in wallpapers.
18737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
18837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        ComponentName imageWallpaperComponent = new ComponentName("com.android.systemui",
18937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                "com.android.systemui.ImageWallpaper");
19037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
19137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperConnection connection;
19237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        long lastDiedTime;
19337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        boolean wallpaperUpdating;
19437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperObserver wallpaperObserver;
19537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
19637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        /**
19737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         * List of callbacks registered they should each be notified when the wallpaper is changed.
19837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani         */
19937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        private RemoteCallbackList<IWallpaperManagerCallback> callbacks
20037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                = new RemoteCallbackList<IWallpaperManagerCallback>();
20137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
20237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        int width = -1;
20337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        int height = -1;
20437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
20537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData(int userId) {
20637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            this.userId = userId;
20737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaperFile = new File(getWallpaperDir(userId), WALLPAPER);
20837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
20937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
21007213e6d8895af10951851435adf96a779863f6cDianne Hackborn
2114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    class WallpaperConnection extends IWallpaperConnection.Stub
2124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            implements ServiceConnection {
213eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        final WallpaperInfo mInfo;
2144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final Binder mToken = new Binder();
2154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperService mService;
2164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperEngine mEngine;
21737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData mWallpaper;
2185dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        IRemoteCallback mReply;
2194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
22037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        public WallpaperConnection(WallpaperInfo info, WallpaperData wallpaper) {
221eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            mInfo = info;
22237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaper = wallpaper;
223eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
2245dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
2255dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onServiceConnected(ComponentName name, IBinder service) {
2274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
22837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaper.connection == this) {
22937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    mWallpaper.lastDiedTime = SystemClock.uptimeMillis();
2304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mService = IWallpaperService.Stub.asInterface(service);
23137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    attachServiceLocked(this, mWallpaper);
232eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // XXX should probably do saveSettingsLocked() later
233eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // when we have an engine, but I'm not sure about
234eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // locking there and anyway we always need to be able to
235eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    // recover if there is something wrong.
23637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    saveSettingsLocked(mWallpaper);
2374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
2384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2415dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onServiceDisconnected(ComponentName name) {
2434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
2444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mService = null;
2454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mEngine = null;
24637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaper.connection == this) {
24737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    Slog.w(TAG, "Wallpaper service gone: " + mWallpaper.wallpaperComponent);
24837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (!mWallpaper.wallpaperUpdating
24937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && (mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME)
25037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                > SystemClock.uptimeMillis()
25137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && mWallpaper.userId == mCurrentUserId) {
2528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Reverting to built-in wallpaper!");
2535dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        clearWallpaperLocked(true, mWallpaper.userId, null);
2540cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                    }
2550cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                }
2564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
25837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
2595dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void attachEngine(IWallpaperEngine engine) {
2615dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            synchronized (mLock) {
2625dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                mEngine = engine;
2635dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
2645dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
2655dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
2665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2675dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        public void engineShown(IWallpaperEngine engine) {
2685dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            synchronized (mLock) {
2695dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (mReply != null) {
2705dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    long ident = Binder.clearCallingIdentity();
2715dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    try {
2725dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        mReply.sendResult(null);
2735dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    } catch (RemoteException e) {
2745dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        Binder.restoreCallingIdentity(ident);
2755dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    }
2765dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    mReply = null;
2775dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                }
2785dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
2794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
28037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
2815dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        @Override
2824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public ParcelFileDescriptor setWallpaper(String name) {
2834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            synchronized (mLock) {
28437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mWallpaper.connection == this) {
28537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    return updateWallpaperBitmapLocked(name, mWallpaper);
2864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
2874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                return null;
2884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
2904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
29137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
29221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    class MyPackageMonitor extends PackageMonitor {
29321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
29421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onPackageUpdateFinished(String packageName, int uid) {
29521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            synchronized (mLock) {
29637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                for (int i = 0; i < mWallpaperMap.size(); i++) {
29737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    WallpaperData wallpaper = mWallpaperMap.valueAt(i);
29837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperComponent != null
29937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
30037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperUpdating = false;
30137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        ComponentName comp = wallpaper.wallpaperComponent;
30237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        clearWallpaperComponentLocked(wallpaper);
30337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        // Do this only for the current user's wallpaper
30437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        if (wallpaper.userId == mCurrentUserId
3055dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                                && !bindWallpaperComponentLocked(comp, false, false,
3065dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                                        wallpaper, null)) {
30737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.w(TAG, "Wallpaper no longer available; reverting to default");
3085dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                            clearWallpaperLocked(false, wallpaper.userId, null);
30937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        }
31080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    }
31180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                }
31280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            }
31380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        }
31480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn
31580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        @Override
31680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        public void onPackageModified(String packageName) {
31780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            synchronized (mLock) {
31837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                for (int i = 0; i < mWallpaperMap.size(); i++) {
31937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    WallpaperData wallpaper = mWallpaperMap.valueAt(i);
32037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperComponent == null
32137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            || !wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
32237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        continue;
32337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    }
324d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    doPackagesChangedLocked(true, wallpaper);
32521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
32621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
32721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
32821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
32921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
33021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onPackageUpdateStarted(String packageName, int uid) {
33121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            synchronized (mLock) {
33237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                for (int i = 0; i < mWallpaperMap.size(); i++) {
33337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    WallpaperData wallpaper = mWallpaperMap.valueAt(i);
33437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperComponent != null
33537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
33637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperUpdating = true;
33737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    }
33821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
33921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
34021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
34121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
34221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
34321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
344d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            synchronized (mLock) {
345d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                boolean changed = false;
346d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                for (int i = 0; i < mWallpaperMap.size(); i++) {
347d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    WallpaperData wallpaper = mWallpaperMap.valueAt(i);
348d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    boolean res = doPackagesChangedLocked(doit, wallpaper);
349d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    changed |= res;
350d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
351d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                return changed;
35237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
35321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
35421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
35521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        @Override
35621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        public void onSomePackagesChanged() {
357d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            synchronized (mLock) {
358d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                for (int i = 0; i < mWallpaperMap.size(); i++) {
359d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    WallpaperData wallpaper = mWallpaperMap.valueAt(i);
360d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    doPackagesChangedLocked(true, wallpaper);
361d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
36237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
36321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
36437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
365d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn        boolean doPackagesChangedLocked(boolean doit, WallpaperData wallpaper) {
36621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            boolean changed = false;
367d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.wallpaperComponent != null) {
368d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                int change = isPackageDisappearing(wallpaper.wallpaperComponent
369d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        .getPackageName());
370d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                if (change == PACKAGE_PERMANENT_CHANGE
371d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        || change == PACKAGE_TEMPORARY_CHANGE) {
372d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    changed = true;
373d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    if (doit) {
374d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        Slog.w(TAG, "Wallpaper uninstalled, removing: "
37537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                + wallpaper.wallpaperComponent);
3765dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        clearWallpaperLocked(false, wallpaper.userId, null);
37721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                    }
37821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
379d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            }
380d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.nextWallpaperComponent != null) {
381d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                int change = isPackageDisappearing(wallpaper.nextWallpaperComponent
382d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        .getPackageName());
383d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                if (change == PACKAGE_PERMANENT_CHANGE
384d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                        || change == PACKAGE_TEMPORARY_CHANGE) {
385d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    wallpaper.nextWallpaperComponent = null;
386d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
387d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            }
388d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.wallpaperComponent != null
389d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    && isPackageModified(wallpaper.wallpaperComponent.getPackageName())) {
390d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                try {
391d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    mContext.getPackageManager().getServiceInfo(
392d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                            wallpaper.wallpaperComponent, 0);
393d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                } catch (NameNotFoundException e) {
394d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    Slog.w(TAG, "Wallpaper component gone, removing: "
395d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                            + wallpaper.wallpaperComponent);
3965dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    clearWallpaperLocked(false, wallpaper.userId, null);
397d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                }
398d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            }
399d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn            if (wallpaper.nextWallpaperComponent != null
400d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    && isPackageModified(wallpaper.nextWallpaperComponent.getPackageName())) {
401d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                try {
402d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    mContext.getPackageManager().getServiceInfo(
403d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                            wallpaper.nextWallpaperComponent, 0);
404d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                } catch (NameNotFoundException e) {
405d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn                    wallpaper.nextWallpaperComponent = null;
40621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn                }
40721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
40821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            return changed;
40921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
41021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
41121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
4128cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public WallpaperManagerService(Context context) {
4138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "WallpaperService startup");
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
4154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        mIWindowManager = IWindowManager.Stub.asInterface(
4164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                ServiceManager.getService(Context.WINDOW_SERVICE));
4174e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani        mIPackageManager = AppGlobals.getPackageManager();
41821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        mMonitor = new MyPackageMonitor();
419d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn        mMonitor.register(context, null, true);
42061f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        getWallpaperDir(UserHandle.USER_OWNER).mkdirs();
42161f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        loadSettingsLocked(UserHandle.USER_OWNER);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private static File getWallpaperDir(int userId) {
42561f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        return Environment.getUserSystemDirectory(userId);
42637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
42737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.finalize();
43137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        for (int i = 0; i < mWallpaperMap.size(); i++) {
43237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.valueAt(i);
43337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.wallpaperObserver.stopWatching();
43437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
436135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani
437f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    public void systemReady() {
4388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "systemReady");
43961f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        WallpaperData wallpaper = mWallpaperMap.get(UserHandle.USER_OWNER);
4405dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        switchWallpaper(wallpaper, null);
44137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper);
44237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.wallpaperObserver.startWatching();
44337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
444135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        IntentFilter userFilter = new IntentFilter();
445135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        userFilter.addAction(Intent.ACTION_USER_REMOVED);
446135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        mContext.registerReceiver(new BroadcastReceiver() {
44737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            @Override
448135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            public void onReceive(Context context, Intent intent) {
449135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                String action = intent.getAction();
4505dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (Intent.ACTION_USER_REMOVED.equals(action)) {
4512a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani                    removeUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
452135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                }
45337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
454135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        }, userFilter);
4555dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        try {
4565dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            ActivityManagerNative.getDefault().registerUserSwitchObserver(
4575dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    new IUserSwitchObserver.Stub() {
4585dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        @Override
4595dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        public void onUserSwitching(int newUserId, IRemoteCallback reply) {
4605dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                            switchUser(newUserId, reply);
4615dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        }
4625dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
4635dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        @Override
4645dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        public void onUserSwitchComplete(int newUserId) throws RemoteException {
4655dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        }
4665dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    });
4675dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        } catch (RemoteException e) {
4685dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            // TODO Auto-generated catch block
4695dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            e.printStackTrace();
4705dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
47137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
47237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
47337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    String getName() {
4745dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        synchronized (mLock) {
4755dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            return mWallpaperMap.get(0).name;
4765dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
47737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
47837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
479135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    void removeUser(int userId) {
480135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        synchronized (mLock) {
481135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(userId);
482135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            if (wallpaper != null) {
483135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                wallpaper.wallpaperObserver.stopWatching();
484135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                mWallpaperMap.remove(userId);
485135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            }
486135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            File wallpaperFile = new File(getWallpaperDir(userId), WALLPAPER);
487135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            wallpaperFile.delete();
488135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            File wallpaperInfoFile = new File(getWallpaperDir(userId), WALLPAPER_INFO);
489135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            wallpaperInfoFile.delete();
490135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        }
491135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    }
492135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani
4935dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    void switchUser(int userId, IRemoteCallback reply) {
49437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        synchronized (mLock) {
49537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mCurrentUserId = userId;
49637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(userId);
49737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper == null) {
49837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper = new WallpaperData(userId);
49937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                mWallpaperMap.put(userId, wallpaper);
50037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                loadSettingsLocked(userId);
50137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper);
50237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.wallpaperObserver.startWatching();
50337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
5045dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            switchWallpaper(wallpaper, reply);
50537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
50637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
50737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
5085dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    void switchWallpaper(WallpaperData wallpaper, IRemoteCallback reply) {
509f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        synchronized (mLock) {
51080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            RuntimeException e = null;
511f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            try {
51237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                ComponentName cname = wallpaper.wallpaperComponent != null ?
51337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperComponent : wallpaper.nextWallpaperComponent;
5145dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (bindWallpaperComponentLocked(cname, true, false, wallpaper, reply)) {
51580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    return;
516f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                }
51780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            } catch (RuntimeException e1) {
51880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                e = e1;
519f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
52080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            Slog.w(TAG, "Failure starting previous wallpaper", e);
5215dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            clearWallpaperLocked(false, wallpaper.userId, reply);
522f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
523f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    }
52437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearWallpaper() {
5268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "clearWallpaper");
5279bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
5285dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            clearWallpaperLocked(false, UserHandle.getCallingUserId(), null);
52921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
53021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn    }
53121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn
5325dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    void clearWallpaperLocked(boolean defaultFailed, int userId, IRemoteCallback reply) {
53337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData wallpaper = mWallpaperMap.get(userId);
53437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File f = new File(getWallpaperDir(userId), WALLPAPER);
53521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        if (f.exists()) {
53621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            f.delete();
53721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        }
53821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        final long ident = Binder.clearCallingIdentity();
53980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        RuntimeException e = null;
54021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        try {
54137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.imageWallpaperPending = false;
54237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (userId != mCurrentUserId) return;
54380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            if (bindWallpaperComponentLocked(defaultFailed
54437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    ? wallpaper.imageWallpaperComponent
5455dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    : null, true, false, wallpaper, reply)) {
54680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                return;
54780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            }
54880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        } catch (IllegalArgumentException e1) {
54980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            e = e1;
55021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn        } finally {
55121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            Binder.restoreCallingIdentity(ident);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn
55480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // This can happen if the default wallpaper component doesn't
55580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // exist.  This should be a system configuration problem, but
55680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // let's not let it crash the system and just live with no
55780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        // wallpaper.
55880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        Slog.e(TAG, "Default wallpaper component not found!", e);
55937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        clearWallpaperComponentLocked(wallpaper);
5605dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        if (reply != null) {
5615dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            try {
5625dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                reply.sendResult(null);
5635dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            } catch (RemoteException e1) {
5645dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
5655dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5685dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    public boolean hasNamedWallpaper(String name) {
5695dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        synchronized (mLock) {
5705dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            for (int i=0; i<mWallpaperMap.size(); i++) {
5715dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                WallpaperData wd = mWallpaperMap.valueAt(i);
5725dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                if (name.equals(wd.name)) {
5735dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    return true;
5745dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                }
5755dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5775dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        return false;
5785dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5805dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn    public void setDimensionHints(int width, int height) throws RemoteException {
5815dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn        checkPermission(android.Manifest.permission.SET_WALLPAPER_HINTS);
5829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
5835dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            int userId = UserHandle.getCallingUserId();
5845dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(userId);
5855dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper == null) {
5865dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
5875dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
5885dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (width <= 0 || height <= 0) {
5895dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalArgumentException("width and height must be > 0");
5905dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
5915dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn
59237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (width != wallpaper.width || height != wallpaper.height) {
59337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.width = width;
59437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.height = height;
59537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                saveSettingsLocked(wallpaper);
59637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (mCurrentUserId != userId) return; // Don't change the properties now
59737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.connection != null) {
59837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.connection.mEngine != null) {
599284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        try {
60037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            wallpaper.connection.mEngine.setDesiredSize(
601284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                                    width, height);
602284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        } catch (RemoteException e) {
603284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        }
60437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        notifyCallbacksLocked(wallpaper);
605284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    }
606284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
6079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWidthHint() throws RemoteException {
6129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
613f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(UserHandle.getCallingUserId());
61437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            return wallpaper.width;
6159bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getHeightHint() throws RemoteException {
6199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
620f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(UserHandle.getCallingUserId());
62137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            return wallpaper.height;
6229bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
625284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn    public ParcelFileDescriptor getWallpaper(IWallpaperManagerCallback cb,
626284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            Bundle outParams) {
6279bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
62837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            // This returns the current user's wallpaper, if called by a system service. Else it
62937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            // returns the wallpaper for the calling user.
63037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            int callingUid = Binder.getCallingUid();
63137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            int wallpaperUserId = 0;
63237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (callingUid == android.os.Process.SYSTEM_UID) {
63337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaperUserId = mCurrentUserId;
63437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            } else {
635f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn                wallpaperUserId = UserHandle.getUserId(callingUid);
63637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
63737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(wallpaperUserId);
6389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
639284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (outParams != null) {
64037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    outParams.putInt("width", wallpaper.width);
64137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    outParams.putInt("height", wallpaper.height);
642284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
64337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.callbacks.register(cb);
64437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                File f = new File(getWallpaperDir(wallpaperUserId), WALLPAPER);
6459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (!f.exists()) {
6469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    return null;
6479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
6489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                return ParcelFileDescriptor.open(f, MODE_READ_ONLY);
6499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } catch (FileNotFoundException e) {
6509bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                /* Shouldn't happen as we check to see if the file exists */
6518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Error getting wallpaper", e);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            return null;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
657eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public WallpaperInfo getWallpaperInfo() {
658f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        int userId = UserHandle.getCallingUserId();
659eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        synchronized (mLock) {
66037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperData wallpaper = mWallpaperMap.get(userId);
66137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.connection != null) {
66237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                return wallpaper.connection.mInfo;
663eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
664eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return null;
665eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
666eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
66737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
6689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    public ParcelFileDescriptor setWallpaper(String name) {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkPermission(android.Manifest.permission.SET_WALLPAPER);
6709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
6715dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (DEBUG) Slog.v(TAG, "setWallpaper");
6725dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            int userId = UserHandle.getCallingUserId();
6735dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(userId);
6745dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper == null) {
6755dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
6765dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
6770cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            final long ident = Binder.clearCallingIdentity();
6780cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            try {
67937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                ParcelFileDescriptor pfd = updateWallpaperBitmapLocked(name, wallpaper);
6800cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                if (pfd != null) {
68137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    wallpaper.imageWallpaperPending = true;
6820cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                }
6830cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                return pfd;
6840cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn            } finally {
6850cd48879dca53a9f4d449126d406527bc4b94bafDianne Hackborn                Binder.restoreCallingIdentity(ident);
6864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
6874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
6884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
6894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
69037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    ParcelFileDescriptor updateWallpaperBitmapLocked(String name, WallpaperData wallpaper) {
6914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        if (name == null) name = "";
6924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        try {
69337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            File dir = getWallpaperDir(wallpaper.userId);
69437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (!dir.exists()) {
69537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                dir.mkdir();
696ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn                FileUtils.setPermissions(
69737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        dir.getPath(),
698ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
699ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn                        -1, -1);
700ebac48c6adf738cb27ea59669c9eca4467063d18Dianne Hackborn            }
701554cb0c290406f5bba34908489db5382a69d0a9arpcraig            File file = new File(dir, WALLPAPER);
702554cb0c290406f5bba34908489db5382a69d0a9arpcraig            ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
7034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    MODE_CREATE|MODE_READ_WRITE);
704554cb0c290406f5bba34908489db5382a69d0a9arpcraig            if (!SELinux.restorecon(file)) {
705554cb0c290406f5bba34908489db5382a69d0a9arpcraig                return null;
706554cb0c290406f5bba34908489db5382a69d0a9arpcraig            }
70737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.name = name;
7084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            return fd;
7094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        } catch (FileNotFoundException e) {
7108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Error setting wallpaper", e);
7114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
7124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return null;
7134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
7144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
7154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public void setWallpaperComponent(ComponentName name) {
7164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT);
7174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        synchronized (mLock) {
7185dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (DEBUG) Slog.v(TAG, "setWallpaperComponent name=" + name);
7195dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            int userId = UserHandle.getCallingUserId();
7205dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            WallpaperData wallpaper = mWallpaperMap.get(userId);
7215dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper == null) {
7225dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
7235dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
7244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            final long ident = Binder.clearCallingIdentity();
7259bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
72637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.imageWallpaperPending = false;
7275dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                bindWallpaperComponentLocked(name, false, true, wallpaper, null);
728f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            } finally {
729f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                Binder.restoreCallingIdentity(ident);
730f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
731f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
732f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn    }
733f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
73437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    boolean bindWallpaperComponentLocked(ComponentName componentName, boolean force,
7355dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            boolean fromUser, WallpaperData wallpaper, IRemoteCallback reply) {
7368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: componentName=" + componentName);
737f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        // Has the component changed?
7389ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn        if (!force) {
73937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.connection != null) {
74037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.wallpaperComponent == null) {
7419ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    if (componentName == null) {
7429ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                        if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: still using default");
7439ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                        // Still using default wallpaper.
74480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        return true;
7459ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    }
74637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                } else if (wallpaper.wallpaperComponent.equals(componentName)) {
7479ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    // Changing to same wallpaper.
7489ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                    if (DEBUG) Slog.v(TAG, "same wallpaper");
74980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    return true;
7504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
751f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
752f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        }
753f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
754f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn        try {
755a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            if (componentName == null) {
756322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                String defaultComponent =
757322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    mContext.getString(com.android.internal.R.string.default_wallpaper_component);
758a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (defaultComponent != null) {
759322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    // See if there is a default wallpaper component specified
760a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    componentName = ComponentName.unflattenFromString(defaultComponent);
7618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "Use default component wallpaper:" + componentName);
762322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                }
763a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (componentName == null) {
764322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    // Fall back to static image wallpaper
76537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    componentName = wallpaper.imageWallpaperComponent;
766322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    //clearWallpaperComponentLocked();
767322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                    //return;
7688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "Using image wallpaper");
769322b6ee7e158b0b979d8156df8fd59f4a9b95ab9Mike Cleron                }
770f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
7714e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani            int serviceUserId = wallpaper.userId;
7724e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani            ServiceInfo si = mIPackageManager.getServiceInfo(componentName,
7734e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                    PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS, serviceUserId);
774f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) {
77580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                String msg = "Selected service does not require "
776f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn                        + android.Manifest.permission.BIND_WALLPAPER
77780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        + ": " + componentName;
77880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                if (fromUser) {
77980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    throw new SecurityException(msg);
78080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                }
78180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                Slog.w(TAG, msg);
78280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                return false;
783f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
784f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
785eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            WallpaperInfo wi = null;
786eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
787f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            Intent intent = new Intent(WallpaperService.SERVICE_INTERFACE);
78837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (componentName != null && !componentName.equals(wallpaper.imageWallpaperComponent)) {
7894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // Make sure the selected service is actually a wallpaper service.
7904e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                List<ResolveInfo> ris =
7914e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                        mIPackageManager.queryIntentServices(intent,
7924e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
7934e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani                                PackageManager.GET_META_DATA, serviceUserId);
7944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                for (int i=0; i<ris.size(); i++) {
7954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    ServiceInfo rsi = ris.get(i).serviceInfo;
7964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    if (rsi.name.equals(si.name) &&
7974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            rsi.packageName.equals(si.packageName)) {
798eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        try {
799eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            wi = new WallpaperInfo(mContext, ris.get(i));
800eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        } catch (XmlPullParserException e) {
80180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            if (fromUser) {
80280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                                throw new IllegalArgumentException(e);
80380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            }
80480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            Slog.w(TAG, e);
80580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            return false;
806eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        } catch (IOException e) {
80780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            if (fromUser) {
80880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                                throw new IllegalArgumentException(e);
80980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            }
81080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            Slog.w(TAG, e);
81180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            return false;
812eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                        }
8134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        break;
8144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
8154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
816eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                if (wi == null) {
81780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    String msg = "Selected service is not a wallpaper: "
81880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                            + componentName;
81980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    if (fromUser) {
82080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        throw new SecurityException(msg);
82180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    }
82280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    Slog.w(TAG, msg);
82380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    return false;
8244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
8259bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
826f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn
827f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            // Bind the service!
8288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG) Slog.v(TAG, "Binding to:" + componentName);
82937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            WallpaperConnection newConn = new WallpaperConnection(wi, wallpaper);
830a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron            intent.setComponent(componentName);
831dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn            intent.putExtra(Intent.EXTRA_CLIENT_LABEL,
832dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn                    com.android.internal.R.string.wallpaper_binding_label);
8334120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn            intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivityAsUser(
834eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    mContext, 0,
835eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER),
836eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                            mContext.getText(com.android.internal.R.string.chooser_wallpaper)),
8374120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                    0, null, new UserHandle(serviceUserId)));
83837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (!mContext.bindService(intent, newConn, Context.BIND_AUTO_CREATE, serviceUserId)) {
83980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                String msg = "Unable to bind service: "
84080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                        + componentName;
84180b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                if (fromUser) {
84280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                    throw new IllegalArgumentException(msg);
84380b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                }
84480b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                Slog.w(TAG, msg);
84580b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                return false;
846f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
84737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.userId == mCurrentUserId && mLastWallpaper != null) {
84837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                detachWallpaperLocked(mLastWallpaper);
84937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            }
85037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.wallpaperComponent = componentName;
85137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection = newConn;
85237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.lastDiedTime = SystemClock.uptimeMillis();
8535dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            newConn.mReply = reply;
854f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            try {
85537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.userId == mCurrentUserId) {
85637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (DEBUG)
85737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        Slog.v(TAG, "Adding window token: " + newConn.mToken);
85837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    mIWindowManager.addWindowToken(newConn.mToken,
85937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            WindowManager.LayoutParams.TYPE_WALLPAPER);
86037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    mLastWallpaper = wallpaper;
86137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                }
862f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            } catch (RemoteException e) {
863f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            }
8644e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani        } catch (RemoteException e) {
8654e2820c22b3f8b330f8c6d04562037c77845716dAmith Yamasani            String msg = "Remote exception for " + componentName + "\n" + e;
86680b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            if (fromUser) {
86780b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn                throw new IllegalArgumentException(msg);
86880b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            }
86980b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            Slog.w(TAG, msg);
87080b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn            return false;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87280b902ffbe2fd5b5d3719b6fc2a8f629374968ddDianne Hackborn        return true;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
87437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
87537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    void detachWallpaperLocked(WallpaperData wallpaper) {
87637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.connection != null) {
8775dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            if (wallpaper.connection.mReply != null) {
8785dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                try {
8795dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    wallpaper.connection.mReply.sendResult(null);
8805dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                } catch (RemoteException e) {
8815dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                }
8825dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                wallpaper.connection.mReply = null;
8835dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn            }
88437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.connection.mEngine != null) {
8854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                try {
88637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    wallpaper.connection.mEngine.destroy();
8874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                } catch (RemoteException e) {
8884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
8894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
89037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mContext.unbindService(wallpaper.connection);
891e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            try {
89237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (DEBUG)
89337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    Slog.v(TAG, "Removing window token: " + wallpaper.connection.mToken);
89437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                mIWindowManager.removeWindowToken(wallpaper.connection.mToken);
895e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            } catch (RemoteException e) {
896e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            }
89737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection.mService = null;
89837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection.mEngine = null;
89937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.connection = null;
9004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
9014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
90237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
90337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    void clearWallpaperComponentLocked(WallpaperData wallpaper) {
90437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.wallpaperComponent = null;
90537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        detachWallpaperLocked(wallpaper);
90637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
90737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
90837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    void attachServiceLocked(WallpaperConnection conn, WallpaperData wallpaper) {
9094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        try {
9103be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            conn.mService.attach(conn, conn.mToken,
9113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    WindowManager.LayoutParams.TYPE_WALLPAPER, false,
91237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    wallpaper.width, wallpaper.height);
9134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        } catch (RemoteException e) {
9148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed attaching wallpaper; clearing", e);
91537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (!wallpaper.wallpaperUpdating) {
9165dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                bindWallpaperComponentLocked(null, false, false, wallpaper, null);
91721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn            }
9184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
9194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
92037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
92137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void notifyCallbacksLocked(WallpaperData wallpaper) {
92237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        final int n = wallpaper.callbacks.beginBroadcast();
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < n; i++) {
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
92537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                wallpaper.callbacks.getBroadcastItem(i).onWallpaperChanged();
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The RemoteCallbackList will take care of removing
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the dead object for us.
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
93237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        wallpaper.callbacks.finishBroadcast();
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED);
9345ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn        mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId));
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void checkPermission(String permission) {
9389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (PackageManager.PERMISSION_GRANTED!= mContext.checkCallingOrSelfPermission(permission)) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", must have permission " + permission);
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9439bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
94437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private static JournaledFile makeJournaledFile(int userId) {
94561f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        final String base = new File(getWallpaperDir(userId), WALLPAPER_INFO).getAbsolutePath();
9469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        return new JournaledFile(new File(base), new File(base + ".tmp"));
9479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
9489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
94937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void saveSettingsLocked(WallpaperData wallpaper) {
95037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        JournaledFile journal = makeJournaledFile(wallpaper.userId);
9519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        FileOutputStream stream = null;
9529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
9539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream = new FileOutputStream(journal.chooseForWrite(), false);
9549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            XmlSerializer out = new FastXmlSerializer();
9559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.setOutput(stream, "utf-8");
9569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.startDocument(null, true);
9579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
9589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.startTag(null, "wp");
95937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            out.attribute(null, "width", Integer.toString(wallpaper.width));
96037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            out.attribute(null, "height", Integer.toString(wallpaper.height));
96137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            out.attribute(null, "name", wallpaper.name);
96237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.wallpaperComponent != null
96337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    && !wallpaper.wallpaperComponent.equals(wallpaper.imageWallpaperComponent)) {
9644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                out.attribute(null, "component",
96537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperComponent.flattenToShortString());
9664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
9679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.endTag(null, "wp");
9689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
9699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            out.endDocument();
9709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream.close();
9719bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            journal.commit();
9729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
9739bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            try {
9749bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (stream != null) {
9759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    stream.close();
9769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
9779bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } catch (IOException ex) {
9789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                // Ignore
9799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
9809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            journal.rollback();
9819bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
9829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
9839bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
98437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void migrateFromOld() {
98537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File oldWallpaper = new File(WallpaperBackupHelper.WALLPAPER_IMAGE_KEY);
98637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        File oldInfo = new File(WallpaperBackupHelper.WALLPAPER_INFO_KEY);
98737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (oldWallpaper.exists()) {
98837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            File newWallpaper = new File(getWallpaperDir(0), WALLPAPER);
98937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            oldWallpaper.renameTo(newWallpaper);
99037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
99137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (oldInfo.exists()) {
99237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            File newInfo = new File(getWallpaperDir(0), WALLPAPER_INFO);
99337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            oldInfo.renameTo(newInfo);
99437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
99537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    }
99637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
99737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    private void loadSettingsLocked(int userId) {
9988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "loadSettingsLocked");
999a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
100037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        JournaledFile journal = makeJournaledFile(userId);
10019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        FileInputStream stream = null;
10029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        File file = journal.chooseForRead();
100337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (!file.exists()) {
100437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            // This should only happen one time, when upgrading from a legacy system
100537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            migrateFromOld();
100637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
100737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData wallpaper = mWallpaperMap.get(userId);
100837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper == null) {
100937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper = new WallpaperData(userId);
101037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            mWallpaperMap.put(userId, wallpaper);
101137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        }
10129bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        boolean success = false;
10139bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
10149bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            stream = new FileInputStream(file);
10159bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            XmlPullParser parser = Xml.newPullParser();
10169bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            parser.setInput(stream, null);
10179bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
10189bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int type;
10199bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            do {
10209bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                type = parser.next();
10219bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                if (type == XmlPullParser.START_TAG) {
10229bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    String tag = parser.getName();
10239bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if ("wp".equals(tag)) {
102437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.width = Integer.parseInt(parser.getAttributeValue(null, "width"));
102537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.height = Integer.parseInt(parser
102637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                .getAttributeValue(null, "height"));
102737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.name = parser.getAttributeValue(null, "name");
10284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        String comp = parser.getAttributeValue(null, "component");
102937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.nextWallpaperComponent = comp != null
10304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                ? ComponentName.unflattenFromString(comp)
10314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                : null;
103237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        if (wallpaper.nextWallpaperComponent == null
103337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                || "android".equals(wallpaper.nextWallpaperComponent
103437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                        .getPackageName())) {
103537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            wallpaper.nextWallpaperComponent = wallpaper.imageWallpaperComponent;
10369ea31639738e8d2c90dc3a4fcd535d09a0b7209aDianne Hackborn                        }
1037a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron
1038a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        if (DEBUG) {
103937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mWidth:" + wallpaper.width);
104037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mHeight:" + wallpaper.height);
104137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mName:" + wallpaper.name);
104237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                            Slog.v(TAG, "mNextWallpaperComponent:"
104337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                                    + wallpaper.nextWallpaperComponent);
1044a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                        }
10459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
10469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
10479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } while (type != XmlPullParser.END_DOCUMENT);
10489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            success = true;
10499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (NullPointerException e) {
10508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
10519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (NumberFormatException e) {
10528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
10539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (XmlPullParserException e) {
10548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
10559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
10568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
10579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IndexOutOfBoundsException e) {
10588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "failed parsing " + file + " " + e);
10599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
10609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        try {
10619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (stream != null) {
10629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                stream.close();
10639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
10649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        } catch (IOException e) {
10659bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            // Ignore
10669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
10679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
10689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (!success) {
106937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.width = -1;
107037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.height = -1;
107137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.name = "";
10729bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
107344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn
107444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        // We always want to have some reasonable width hint.
107544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
107644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        Display d = wm.getDefaultDisplay();
107744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        int baseSize = d.getMaximumSizeDimension();
107837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.width < baseSize) {
107937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.width = baseSize;
108044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
108137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.height < baseSize) {
108237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.height = baseSize;
108344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
10849bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
10859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
1086194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick    // Called by SystemBackupAgent after files are restored to disk.
10879bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    void settingsRestored() {
108837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        // TODO: If necessary, make it work for secondary users as well. This currently assumes
108937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        // restores only to the primary user
10908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG) Slog.v(TAG, "settingsRestored");
109137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        WallpaperData wallpaper = null;
10929bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        boolean success = false;
10939bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        synchronized (mLock) {
109437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            loadSettingsLocked(0);
109537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper = mWallpaperMap.get(0);
109637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            if (wallpaper.nextWallpaperComponent != null
109737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    && !wallpaper.nextWallpaperComponent.equals(wallpaper.imageWallpaperComponent)) {
109837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (!bindWallpaperComponentLocked(wallpaper.nextWallpaperComponent, false, false,
10995dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                        wallpaper, null)) {
1100e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // No such live wallpaper or other failure; fall back to the default
1101e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // live wallpaper (since the profile being restored indicated that the
1102e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                    // user had selected a live rather than static one).
11035dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                    bindWallpaperComponentLocked(null, false, false, wallpaper, null);
1104e3ab4d0f181e875c534653dd9491d956cb3bbcd9Christopher Tate                }
11059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                success = true;
11069bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            } else {
1107a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                // If there's a wallpaper name, we use that.  If that can't be loaded, then we
1108a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                // use the default.
110937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if ("".equals(wallpaper.name)) {
11108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "settingsRestored: name is empty");
1111a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                    success = true;
1112a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                } else {
11138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG) Slog.v(TAG, "settingsRestored: attempting to restore named resource");
111437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    success = restoreNamedResourceLocked(wallpaper);
1115a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                }
11168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG) Slog.v(TAG, "settingsRestored: success=" + success);
1117a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                if (success) {
111837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    bindWallpaperComponentLocked(wallpaper.nextWallpaperComponent, false, false,
11195dc5a00e7ebadc085ded7e29feacd17e53698486Dianne Hackborn                            wallpaper, null);
1120a428b2c260dddd267b541909517cc4f6cf769714Mike Cleron                }
11219bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
11229bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
11239bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11249bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        if (!success) {
112537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            Slog.e(TAG, "Failed to restore wallpaper: '" + wallpaper.name + "'");
112637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            wallpaper.name = "";
112737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            getWallpaperDir(0).delete();
11289bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
1129194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick
1130194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick        synchronized (mLock) {
113137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            saveSettingsLocked(wallpaper);
1132194b19a4b3ff877d2720ed35e607e329fcfa8186Brad Fitzpatrick        }
11339bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
11349bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
113537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani    boolean restoreNamedResourceLocked(WallpaperData wallpaper) {
113637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani        if (wallpaper.name.length() > 4 && "res:".equals(wallpaper.name.substring(0, 4))) {
113737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            String resName = wallpaper.name.substring(4);
11389bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11399bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String pkg = null;
11409bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int colon = resName.indexOf(':');
11419bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (colon > 0) {
11429bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                pkg = resName.substring(0, colon);
11439bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
11449bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11459bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String ident = null;
11469bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            int slash = resName.lastIndexOf('/');
11479bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (slash > 0) {
11489bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                ident = resName.substring(slash+1);
11499bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
11509bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11519bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            String type = null;
11529bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (colon > 0 && slash > 0 && (slash-colon) > 1) {
11539bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                type = resName.substring(colon+1, slash);
11549bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
11559bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11569bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            if (pkg != null && ident != null && type != null) {
11579bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                int resId = -1;
11589bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                InputStream res = null;
11599bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                FileOutputStream fos = null;
11609bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                try {
11619bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    Context c = mContext.createPackageContext(pkg, Context.CONTEXT_RESTRICTED);
11629bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    Resources r = c.getResources();
11639bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    resId = r.getIdentifier(resName, null, null);
11649bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (resId == 0) {
11658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.e(TAG, "couldn't resolve identifier pkg=" + pkg + " type=" + type
11669bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                                + " ident=" + ident);
11679bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        return false;
11689bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
11699bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11709bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    res = r.openRawResource(resId);
117137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (wallpaper.wallpaperFile.exists()) {
117237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        wallpaper.wallpaperFile.delete();
11731afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                    }
117437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    fos = new FileOutputStream(wallpaper.wallpaperFile);
11759bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11769bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    byte[] buffer = new byte[32768];
11779bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    int amt;
11789bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    while ((amt=res.read(buffer)) > 0) {
11799bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        fos.write(buffer, 0, amt);
11809bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
11819bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    // mWallpaperObserver will notice the close and send the change broadcast
11829bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato
11838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Restored wallpaper: " + resName);
11849bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    return true;
11859bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (NameNotFoundException e) {
11868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "Package name " + pkg + " not found");
11879bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (Resources.NotFoundException e) {
11888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "Resource not found: " + resId);
11899bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } catch (IOException e) {
11908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "IOException while restoring wallpaper ", e);
11919bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                } finally {
11929bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (res != null) {
11939bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        try {
11949bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                            res.close();
11959bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        } catch (IOException ex) {}
11969bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
11979bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    if (fos != null) {
11988bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn                        FileUtils.sync(fos);
11999bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        try {
12009bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                            fos.close();
12019bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                        } catch (IOException ex) {}
12029bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                    }
12039bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato                }
12049bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato            }
12059bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        }
12069bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato        return false;
12079bb8fd77c8dc177aab9ac96bed4f55972dcda70aJoe Onorato    }
120837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani
1209eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    @Override
1210eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1211eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
1212eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                != PackageManager.PERMISSION_GRANTED) {
1213eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
1214eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println("Permission Denial: can't dump wallpaper service from from pid="
1215eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + Binder.getCallingPid()
1216eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + ", uid=" + Binder.getCallingUid());
1217eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return;
1218eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1219eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
1220eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        synchronized (mLock) {
1221eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println("Current Wallpaper Service state:");
122237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani            for (int i = 0; i < mWallpaperMap.size(); i++) {
122337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                WallpaperData wallpaper = mWallpaperMap.valueAt(i);
122437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(" User " + wallpaper.userId + ":");
122537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print("  mWidth=");
122637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print(wallpaper.width);
122737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print(" mHeight=");
122837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(wallpaper.height);
122937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print("  mName=");
123037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(wallpaper.name);
123137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.print("  mWallpaperComponent=");
123237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                pw.println(wallpaper.wallpaperComponent);
123337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                if (wallpaper.connection != null) {
123437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    WallpaperConnection conn = wallpaper.connection;
123537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("  Wallpaper connection ");
123637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print(conn);
123737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(":");
123837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    if (conn.mInfo != null) {
123937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        pw.print("    mInfo.component=");
124037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                        pw.println(conn.mInfo.getComponent());
124137ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    }
124237ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mToken=");
124337ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(conn.mToken);
124437ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mService=");
124537ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(conn.mService);
124637ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mEngine=");
124737ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(conn.mEngine);
124837ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.print("    mLastDiedTime=");
124937ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                    pw.println(wallpaper.lastDiedTime - SystemClock.uptimeMillis());
125037ce3a8af6faab675319d0803b288ab1dddc76beAmith Yamasani                }
1251eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
1252eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1253eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1255