WallpaperService.java revision 9e4e727b4a164c17944e8ae6eb2d2532a98737f8
161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/*
261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Copyright (C) 2009 The Android Open Source Project
361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * you may not use this file except in compliance with the License.
661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * You may obtain a copy of the License at
761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * See the License for the specific language governing permissions and
1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * limitations under the License.
1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala */
1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
17cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun Hepackage android.service.wallpaper;
18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport com.android.internal.os.HandlerCaller;
20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvalaimport com.android.internal.view.BaseIWindow;
21377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETITimport com.android.internal.view.BaseInputHandler;
22f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaimport com.android.internal.view.BaseSurfaceHolder;
23a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.annotation.SdkConstant;
2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.annotation.SdkConstant.SdkConstantType;
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.app.Service;
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.app.WallpaperManager;
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaimport android.content.BroadcastReceiver;
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaimport android.content.Context;
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaimport android.content.Intent;
317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaimport android.content.IntentFilter;
327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaimport android.content.res.Configuration;
337b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaimport android.graphics.PixelFormat;
347b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaimport android.graphics.Rect;
357b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaimport android.os.Bundle;
36ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinimport android.os.IBinder;
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.os.Looper;
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.os.Message;
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.os.Process;
402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaimport android.os.RemoteException;
412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaimport android.util.Log;
422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaimport android.util.LogPrinter;
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.Gravity;
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.IWindowSession;
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.InputChannel;
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.InputDevice;
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.InputHandler;
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.InputQueue;
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.MotionEvent;
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.SurfaceHolder;
51ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalaimport android.view.View;
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.ViewGroup;
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.ViewRootImpl;
54ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkinimport android.view.WindowManager;
55ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalaimport android.view.WindowManagerImpl;
56a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin
57a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkinimport java.io.FileDescriptor;
5844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinimport java.io.PrintWriter;
59ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalaimport java.util.ArrayList;
60cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala/**
62a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala * A wallpaper service is responsible for showing a live wallpaper behind
63228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala * applications that would like to sit on top of it.  This service object
642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * itself does very little -- its only purpose is to generate instances of
652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * {@link Engine} as needed.  Implementing a wallpaper thus
66a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin * involves subclassing from this, subclassing an Engine implementation,
67a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin * and implementing {@link #onCreateEngine()} to return a new instance of
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * your engine.
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala */
70e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yehpublic abstract class WallpaperService extends Service {
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    /**
72a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala     * The {@link Intent} that must be declared as handled by the service.
73c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala     * To be supported, the service must also require the
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * {@link android.Manifest.permission#BIND_WALLPAPER} permission so
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * that other applications can not abuse it.
76e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin     */
77ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    @SdkConstant(SdkConstantType.SERVICE_ACTION)
78ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    public static final String SERVICE_INTERFACE =
79ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            "android.service.wallpaper.WallpaperService";
80ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
81fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    /**
82fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * Name under which a WallpaperService component publishes information
83fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * about itself.  This meta-data must reference an XML resource containing
84cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh     * a <code>&lt;{@link android.R.styleable#Wallpaper wallpaper}&gt;</code>
85fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * tag.
86fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     */
87fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    public static final String SERVICE_META_DATA = "android.service.wallpaper";
88fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
89fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    static final String TAG = "WallpaperService";
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    static final boolean DEBUG = false;
913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    private static final int DO_ATTACH = 10;
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    private static final int DO_DETACH = 20;
9473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    private static final int DO_SET_DESIRED_SIZE = 30;
95254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala
96254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    private static final int MSG_UPDATE_SURFACE = 10000;
97254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    private static final int MSG_VISIBILITY_CHANGED = 10010;
9873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    private static final int MSG_WALLPAPER_OFFSETS = 10020;
99ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    private static final int MSG_WALLPAPER_COMMAND = 10025;
1004bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    private static final int MSG_WINDOW_RESIZED = 10030;
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    private static final int MSG_TOUCH_EVENT = 10040;
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    private Looper mCallbackLooper;
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    private final ArrayList<Engine> mActiveEngines
1054bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala            = new ArrayList<Engine>();
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    static final class WallpaperCommand {
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        String action;
109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        int x;
1104bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala        int y;
111ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        int z;
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        Bundle extras;
113ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        boolean sync;
114ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    }
115ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
116ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin    /**
117ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     * The actual implementation of a wallpaper.  A wallpaper service may
118ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     * have multiple instances running (for example as a real wallpaper
119ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     * and as a preview), each of which is represented by its own Engine
120ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     * instance.  You must implement {@link WallpaperService#onCreateEngine()}
121ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin     * to return your concrete Engine implementation.
12295dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He     */
12395dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He    public class Engine {
124f2d1e4dfc14fd90e1256b3f6e96e69560f5d3b5eZhijun He        IWallpaperEngineWrapper mIWallpaperEngine;
125f2d1e4dfc14fd90e1256b3f6e96e69560f5d3b5eZhijun He
126ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        // Copies from mIWallpaperEngine.
127ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        HandlerCaller mCaller;
128ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        IWallpaperConnection mConnection;
129ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        IBinder mWindowToken;
130ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
131ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        boolean mInitializing = true;
132ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        boolean mVisible;
133ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        boolean mScreenOn = true;
134ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        boolean mReportedVisible;
1354bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala        boolean mDestroyed;
136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
137ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin        // Current window state.
138ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        boolean mCreated;
139d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        boolean mSurfaceCreated;
1404bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala        boolean mIsCreating;
141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        boolean mDrawingAllowed;
142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        boolean mOffsetsChanged;
143d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        int mWidth;
144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mHeight;
145fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        int mFormat;
146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mType;
147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mCurWidth;
1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int mCurHeight;
149f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mWindowFlags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
150f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mCurWindowFlags = mWindowFlags;
151f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        final Rect mVisibleInsets = new Rect();
15261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        final Rect mWinFrame = new Rect();
15361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        final Rect mContentInsets = new Rect();
15461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        final Configuration mConfiguration = new Configuration();
155a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
156d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala        final WindowManager.LayoutParams mLayout
1574ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                = new WindowManager.LayoutParams();
158f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        IWindowSession mSession;
159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        InputChannel mInputChannel;
160c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala
161c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        final Object mLock = new Object();
162da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        boolean mOffsetMessageEnqueued;
16361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        float mPendingXOffset;
16461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        float mPendingYOffset;
16561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        float mPendingXOffsetStep;
166611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala        float mPendingYOffsetStep;
167cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk        boolean mPendingSync;
168e992e75053e98e3699af6e344c11b787e30411adEino-Ville Talvala        MotionEvent mPendingMove;
169f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen
170611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala        final BroadcastReceiver mReceiver = new BroadcastReceiver() {
1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void onReceive(Context context, Intent intent) {
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    mScreenOn = true;
175836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    reportVisibility();
1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                } else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    mScreenOn = false;
1784ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                    reportVisibility();
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                }
180836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            }
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        };
182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() {
184836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            {
18511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                mRequestedFormat = PixelFormat.RGBX_8888;
186836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            }
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            @Override
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public boolean onAllowLockCanvas() {
190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                return mDrawingAllowed;
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            @Override
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void onRelayoutContainer() {
195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE);
196836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                mCaller.sendMessage(msg);
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
198836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            @Override
200377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT            public void onUpdateSurface() {
201836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE);
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mCaller.sendMessage(msg);
203836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            }
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public boolean isCreating() {
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                return mIsCreating;
207836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            }
208d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin
209d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            @Override
210d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            public void setFixedSize(int width, int height) {
211d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                if (Process.myUid() != Process.SYSTEM_UID) {
212d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    // Regular apps can't do this.  It can only work for
213d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    // certain designs of window animations, so you can't
214d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    // rely on it.
215d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    throw new UnsupportedOperationException(
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                            "Wallpapers currently only support sizing from layout");
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                }
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                super.setFixedSize(width, height);
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
220836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
221d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            public void setKeepScreenOn(boolean screenOn) {
222d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                throw new UnsupportedOperationException(
223d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                        "Wallpapers do not support keep screen on");
224d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            }
225d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin
226d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        };
227d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin
228d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        final InputHandler mInputHandler = new BaseInputHandler() {
229d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            @Override
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void handleMotion(MotionEvent event,
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    InputQueue.FinishedCallback finishedCallback) {
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                boolean handled = false;
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                try {
234836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    int source = event.getSource();
235d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {
236d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                        dispatchPointer(event);
237d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                        handled = true;
238d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    }
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                } finally {
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    finishedCallback.finished(handled);
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                }
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
243836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        };
244c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final BaseIWindow mWindow = new BaseIWindow() {
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void resized(int w, int h, Rect coveredInsets,
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    Rect visibleInsets, boolean reportDraw, Configuration newConfig) {
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                Message msg = mCaller.obtainMessageI(MSG_WINDOW_RESIZED,
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                        reportDraw ? 1 : 0);
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mCaller.sendMessage(msg);
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void dispatchAppVisibility(boolean visible) {
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                // We don't do this in preview mode; we'll let the preview
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                // activity tell us when to run.
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                if (!mIWallpaperEngine.mIsPreview) {
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED,
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                            visible ? 1 : 0);
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    mCaller.sendMessage(msg);
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                }
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
265836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            @Override
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    boolean sync) {
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                synchronized (mLock) {
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Dispatch wallpaper offsets: " + x + ", " + y);
2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    mPendingXOffset = x;
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    mPendingYOffset = y;
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    mPendingXOffsetStep = xStep;
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    mPendingYOffsetStep = yStep;
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    if (sync) {
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                        mPendingSync = true;
276836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    }
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    if (!mOffsetMessageEnqueued) {
2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                        mOffsetMessageEnqueued = true;
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                        Message msg = mCaller.obtainMessage(MSG_WALLPAPER_OFFSETS);
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                        mCaller.sendMessage(msg);
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    }
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                }
2837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void dispatchWallpaperCommand(String action, int x, int y,
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    int z, Bundle extras, boolean sync) {
2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                synchronized (mLock) {
288d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Dispatch wallpaper command: " + x + ", " + y);
289d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    WallpaperCommand cmd = new WallpaperCommand();
290d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    cmd.action = action;
291d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    cmd.x = x;
292d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    cmd.y = y;
2934ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala                    cmd.z = z;
294d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    cmd.extras = extras;
295d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    cmd.sync = sync;
296d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    Message msg = mCaller.obtainMessage(MSG_WALLPAPER_COMMAND);
297d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    msg.obj = cmd;
298d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                    mCaller.sendMessage(msg);
299d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                }
3007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
301836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        };
3027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
303836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        /**
304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         * Provides access to the surface in which this wallpaper is drawn.
305836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         */
306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        public SurfaceHolder getSurfaceHolder() {
307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            return mSurfaceHolder;
3087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        }
3097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        /**
311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         * Convenience for {@link WallpaperManager#getDesiredMinimumWidth()
3127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala         * WallpaperManager.getDesiredMinimumWidth()}, returning the width
3137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala         * that the system would like this wallpaper to run in.
314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         */
315836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        public int getDesiredMinimumWidth() {
3167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            return mIWallpaperEngine.mReqWidth;
3177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        }
318836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
3197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        /**
320836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         * Convenience for {@link WallpaperManager#getDesiredMinimumHeight()
321836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         * WallpaperManager.getDesiredMinimumHeight()}, returning the height
322836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         * that the system would like this wallpaper to run in.
323836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         */
324836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        public int getDesiredMinimumHeight() {
3257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            return mIWallpaperEngine.mReqHeight;
3267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        }
327836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
328836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        /**
329836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         * Return whether the wallpaper is currently visible to the user,
3307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala         * this is the last value supplied to
3313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala         * {@link #onVisibilityChanged(boolean)}.
332836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala         */
3337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        public boolean isVisible() {
3343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            return mReportedVisible;
335836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        }
3367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3370181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        /**
3380181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala         * Returns true if this engine is running in preview mode -- that is,
3390181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala         * it is being shown to the user before they select it as the actual
3400181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala         * wallpaper.
3413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala         */
342da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        public boolean isPreview() {
343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return mIWallpaperEngine.mIsPreview;
344ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        }
345da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
346da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        /**
347da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         * Control whether this wallpaper will receive raw touch events
348e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala         * from the window manager as the user interacts with the window
349e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala         * that is currently displaying the wallpaper.  By default they
350e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala         * are turned off.  If enabled, the events will be received in
351e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala         * {@link #onTouchEvent(MotionEvent)}.
352e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala         */
353e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        public void setTouchEventsEnabled(boolean enabled) {
354e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala            mWindowFlags = enabled
355e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala                    ? (mWindowFlags&~WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
356e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala                    : (mWindowFlags|WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
357e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala            if (mCreated) {
358e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala                updateSurface(false, false, false);
3597373cbe85e617345f7002256a4be389fe62af913Igor Murashkin            }
3607373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        }
3617373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
3627373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        /**
363fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala         * Called once to initialize the engine.  After returning, the
364fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala         * engine's surface will be created by the framework.
365fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala         */
366fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        public void onCreate(SurfaceHolder surfaceHolder) {
367e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        }
368e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
369e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        /**
370e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala         * Called right before the engine is going away.  After this the
37173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala         * surface will be destroyed and this Engine object is no longer
3723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala         * valid.
37373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala         */
374428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        public void onDestroy() {
375da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
377c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        /**
378c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala         * Called to inform you of the wallpaper becoming visible or
37997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala         * hidden.  <em>It is very important that a wallpaper only use
38097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala         * CPU while it is visible.</em>.
38144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin         */
3827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        public void onVisibilityChanged(boolean visible) {
38361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        }
38461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        /**
38661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         * Called as the user performs touch-screen interaction with the
38761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         * window that is currently showing this wallpaper.  Note that the
388a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala         * events you receive here are driven by the actual application the
38944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin         * user is interacting with, so if it is slow you will get fewer
390c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala         * move events.
391c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala         */
392c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala        public void onTouchEvent(MotionEvent event) {
393c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala        }
394ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
395f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        /**
396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala         * Called to inform you of the wallpaper's offsets changing
39798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * within its contain, corresponding to the container's
39898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * call to {@link WallpaperManager#setWallpaperOffsets(IBinder, float, float)
399d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala         * WallpaperManager.setWallpaperOffsets()}.
400d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala         */
401d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala        public void onOffsetsChanged(float xOffset, float yOffset,
402d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                float xOffsetStep, float yOffsetStep,
403d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                int xPixelOffset, int yPixelOffset) {
404d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala        }
405d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala
4066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        /**
40798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * Process a command that was sent to the wallpaper with
40898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * {@link WallpaperManager#sendWallpaperCommand}.
409c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala         * The default implementation does nothing, and always returns null
41098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * as the result.
41198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         *
41298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * @param action The name of the command to perform.  This tells you
413254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala         * what to do and how to interpret the rest of the arguments.
41498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * @param x Generic integer parameter.
41598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * @param y Generic integer parameter.
41698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * @param z Generic integer parameter.
417ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin         * @param extras Any additional parameters.
41898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * @param resultRequested If true, the caller is requesting that
41998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * a result, appropriate for the command, be returned back.
42098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * @return If returning a result, create a Bundle and place the
42198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * result data in to it.  Otherwise return null.
422661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala         */
423661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        public Bundle onCommand(String action, int x, int y, int z,
424661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala                Bundle extras, boolean resultRequested) {
425661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala            return null;
426661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        }
427661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala
428661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        /**
429661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala         * Called when an application has changed the desired virtual size of
430661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala         * the wallpaper.
431661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala         */
432661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        public void onDesiredSizeChanged(int desiredWidth, int desiredHeight) {
433661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        }
434661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala
435661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        /**
43698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * Convenience for {@link SurfaceHolder.Callback#surfaceChanged
437dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk         * SurfaceHolder.Callback.surfaceChanged()}.
438dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk         */
439dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
440dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk        }
441dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk
442dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk        /**
443dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk         * Convenience for {@link SurfaceHolder.Callback2#surfaceRedrawNeeded
444dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk         * SurfaceHolder.Callback.surfaceRedrawNeeded()}.
4456551e1ede59f4a3043fb141159ca67bd2c85a911Ruben Brunk         */
4466551e1ede59f4a3043fb141159ca67bd2c85a911Ruben Brunk        public void onSurfaceRedrawNeeded(SurfaceHolder holder) {
4476551e1ede59f4a3043fb141159ca67bd2c85a911Ruben Brunk        }
44898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
44998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        /**
45098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * Convenience for {@link SurfaceHolder.Callback#surfaceCreated
45198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala         * SurfaceHolder.Callback.surfaceCreated()}.
4523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala         */
4538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        public void onSurfaceCreated(SurfaceHolder holder) {
45461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        }
45561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
45661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        /**
45761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         * Convenience for {@link SurfaceHolder.Callback#surfaceDestroyed
458a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala         * SurfaceHolder.Callback.surfaceDestroyed()}.
4599e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala         */
46044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        public void onSurfaceDestroyed(SurfaceHolder holder) {
461ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala        }
4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) {
4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            out.print(prefix); out.print("mInitializing="); out.print(mInitializing);
4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    out.print(" mDestroyed="); out.println(mDestroyed);
4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            out.print(prefix); out.print("mVisible="); out.print(mVisible);
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    out.print(" mScreenOn="); out.print(mScreenOn);
4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    out.print(" mReportedVisible="); out.println(mReportedVisible);
4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            out.print(prefix); out.print("mCreated="); out.print(mCreated);
4708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    out.print(" mSurfaceCreated="); out.print(mSurfaceCreated);
47144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                    out.print(" mIsCreating="); out.print(mIsCreating);
47244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                    out.print(" mDrawingAllowed="); out.println(mDrawingAllowed);
4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            out.print(prefix); out.print("mWidth="); out.print(mWidth);
4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    out.print(" mCurWidth="); out.print(mCurWidth);
47561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    out.print(" mHeight="); out.print(mHeight);
47661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    out.print(" mCurHeight="); out.println(mCurHeight);
47761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            out.print(prefix); out.print("mType="); out.print(mType);
478a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                    out.print(" mWindowFlags="); out.print(mWindowFlags);
4799e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    out.print(" mCurWindowFlags="); out.println(mCurWindowFlags);
48044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            out.print(prefix); out.print("mVisibleInsets=");
4819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    out.print(mVisibleInsets.toShortString());
4829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    out.print(" mWinFrame="); out.print(mWinFrame.toShortString());
483ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                    out.print(" mContentInsets="); out.println(mContentInsets.toShortString());
4849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            out.print(prefix); out.print("mConfiguration="); out.println(mConfiguration);
4859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            out.print(prefix); out.print("mLayout="); out.println(mLayout);
4869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            synchronized (mLock) {
4879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                out.print(prefix); out.print("mPendingXOffset="); out.print(mPendingXOffset);
4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        out.print(" mPendingXOffset="); out.println(mPendingXOffset);
4899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                out.print(prefix); out.print("mPendingXOffsetStep=");
4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        out.print(mPendingXOffsetStep);
4919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        out.print(" mPendingXOffsetStep="); out.println(mPendingXOffsetStep);
4929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                out.print(prefix); out.print("mOffsetMessageEnqueued=");
4939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        out.print(mOffsetMessageEnqueued);
4949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        out.print(" mPendingSync="); out.println(mPendingSync);
4959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                if (mPendingMove != null) {
49661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    out.print(prefix); out.print("mPendingMove="); out.println(mPendingMove);
49761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                }
49861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            }
499a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala        }
5009e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala
50144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        private void dispatchPointer(MotionEvent event) {
5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (event.isTouchEvent()) {
5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                synchronized (mLock) {
504ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                    if (event.getAction() == MotionEvent.ACTION_MOVE) {
5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        mPendingMove = event;
506907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                    } else {
507907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                        mPendingMove = null;
508907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                    }
509907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                }
510907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                Message msg = mCaller.obtainMessageO(MSG_TOUCH_EVENT, event);
511907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                mCaller.sendMessage(msg);
5129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
51344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        }
51444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
5159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void updateSurface(boolean forceRelayout, boolean forceReport, boolean redrawNeeded) {
5169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mDestroyed) {
5179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                Log.w(TAG, "Ignoring updateSurface: destroyed");
5189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
5199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
5209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            int myWidth = mSurfaceHolder.getRequestedWidth();
52161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            if (myWidth <= 0) myWidth = ViewGroup.LayoutParams.MATCH_PARENT;
52261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            int myHeight = mSurfaceHolder.getRequestedHeight();
5231ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala            if (myHeight <= 0) myHeight = ViewGroup.LayoutParams.MATCH_PARENT;
5248ba01021b573889802e67e029225a96f0dfa471aAndy McFadden
525a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala            final boolean creating = !mCreated;
5269e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            final boolean surfaceCreating = !mSurfaceCreated;
52744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            final boolean formatChanged = mFormat != mSurfaceHolder.getRequestedFormat();
5283a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            boolean sizeChanged = mWidth != myWidth || mHeight != myHeight;
5293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            final boolean typeChanged = mType != mSurfaceHolder.getRequestedType();
530ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala            final boolean flagsChanged = mCurWindowFlags != mWindowFlags;
5316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            if (forceRelayout || creating || surfaceCreating || formatChanged || sizeChanged
5326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    || typeChanged || flagsChanged || redrawNeeded) {
5338ba01021b573889802e67e029225a96f0dfa471aAndy McFadden
534f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen                if (DEBUG) Log.v(TAG, "Changes: creating=" + creating
5351ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala                        + " format=" + formatChanged + " size=" + sizeChanged);
5361ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala
5371ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala                try {
5381ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala                    mWidth = myWidth;
5396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mHeight = myHeight;
54036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    mFormat = mSurfaceHolder.getRequestedFormat();
5416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mType = mSurfaceHolder.getRequestedType();
5426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
54336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    mLayout.x = 0;
544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    mLayout.y = 0;
545a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                    mLayout.width = myWidth;
5466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mLayout.height = myHeight;
5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mLayout.format = mFormat;
5499e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala
5509e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    mCurWindowFlags = mWindowFlags;
5516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mLayout.flags = mWindowFlags
5526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                            | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                            | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
554f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
555f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                            ;
556f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala
557f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                    mLayout.memoryType = mType;
558f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                    mLayout.token = mWindowToken;
559f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala
5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    if (!mCreated) {
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        mLayout.type = mIWallpaperEngine.mWindowType;
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        mLayout.gravity = Gravity.LEFT|Gravity.TOP;
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        mLayout.setTitle(WallpaperService.this.getClass().getName());
5649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        mLayout.windowAnimations =
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                com.android.internal.R.style.Animation_Wallpaper;
566f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                        mInputChannel = new InputChannel();
5679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        if (mSession.add(mWindow, mLayout, View.VISIBLE, mContentInsets,
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                mInputChannel) < 0) {
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            Log.w(TAG, "Failed to add window while updating wallpaper surface.");
5709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            return;
5719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        }
5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        mCreated = true;
5739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
574d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                        InputQueue.registerInputChannel(mInputChannel, mInputHandler,
575d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                                Looper.myQueue());
576d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                    }
577d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala
578d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                    mSurfaceHolder.mSurfaceLock.lock();
579d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                    mDrawingAllowed = true;
580f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala
5819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    final int relayoutResult = mSession.relayout(
5829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        mWindow, mLayout, mWidth, mHeight,
5839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            View.VISIBLE, false, mWinFrame, mContentInsets,
584bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                            mVisibleInsets, mConfiguration, mSurfaceHolder.mSurface);
58573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
58673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface
58773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                            + ", frame=" + mWinFrame);
58873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
58973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    int w = mWinFrame.width();
59073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    if (mCurWidth != w) {
591bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        sizeChanged = true;
592f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                        mCurWidth = w;
593f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                    }
594f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                    int h = mWinFrame.height();
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    if (mCurHeight != h) {
5966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                        sizeChanged = true;
5976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                        mCurHeight = h;
5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    }
59961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    mSurfaceHolder.setSurfaceFrameSize(w, h);
60161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    mSurfaceHolder.mSurfaceLock.unlock();
602a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    if (!mSurfaceHolder.mSurface.isValid()) {
60444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                        reportSurfaceDestroyed();
605ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin                        if (DEBUG) Log.v(TAG, "Layout: Surface destroyed");
606228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        return;
607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    }
6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    boolean didSurface = false;
610228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    try {
612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mSurfaceHolder.ungetCallbacks();
613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
614a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        if (surfaceCreating) {
615a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                            mIsCreating = true;
616a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                            didSurface = true;
617a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                            if (DEBUG) Log.v(TAG, "onSurfaceCreated("
618a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                                    + mSurfaceHolder + "): " + this);
619a2520db02bead68d4980783c41500ae96511bdf8Zhijun He                            onSurfaceCreated(mSurfaceHolder);
620a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                            SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
621a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                            if (callbacks != null) {
622a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                                for (SurfaceHolder.Callback c : callbacks) {
623a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                                    c.surfaceCreated(mSurfaceHolder);
624a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                                }
625a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                            }
626a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        }
627a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
628a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        redrawNeeded |= creating
629a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                                || (relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0;
630228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
631228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        if (forceReport || creating || surfaceCreating
632228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                || formatChanged || sizeChanged) {
633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            if (DEBUG) {
634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                RuntimeException e = new RuntimeException();
6353ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                e.fillInStackTrace();
636527748abf04c0060894fd7aace54959a2c343435Zhijun He                                Log.w(TAG, "forceReport=" + forceReport + " creating=" + creating
6373ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                        + " formatChanged=" + formatChanged
6383ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                        + " sizeChanged=" + sizeChanged, e);
6393ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            }
6403ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            if (DEBUG) Log.v(TAG, "onSurfaceChanged("
6413ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                    + mSurfaceHolder + ", " + mFormat
6423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                    + ", " + mCurWidth + ", " + mCurHeight
6433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                    + "): " + this);
6443ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            didSurface = true;
6453ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            onSurfaceChanged(mSurfaceHolder, mFormat,
6463ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                    mCurWidth, mCurHeight);
6473ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
648228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            if (callbacks != null) {
6493ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                for (SurfaceHolder.Callback c : callbacks) {
650a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                                    c.surfaceChanged(mSurfaceHolder, mFormat,
651228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                            mCurWidth, mCurHeight);
652a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                                }
653a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                            }
654a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        }
655a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
656a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        if (redrawNeeded) {
6573ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            onSurfaceRedrawNeeded(mSurfaceHolder);
6583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
6593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            if (callbacks != null) {
6603ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                for (SurfaceHolder.Callback c : callbacks) {
6613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                    if (c instanceof SurfaceHolder.Callback2) {
6623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                        ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded(
6633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                                mSurfaceHolder);
6643ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                    }
6653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                }
6663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            }
6673ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        }
6683ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6693ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        if (didSurface && !mReportedVisible) {
6703ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            // This wallpaper is currently invisible, but its
6713ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            // surface has changed.  At this point let's tell it
6723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            // again that it is invisible in case the report about
6733ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            // the surface caused it to start running.  We really
6743ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            // don't want wallpapers running when not visible.
6753ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            if (mIsCreating) {
6763ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                // Some wallpapers will ignore this call if they
6773ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                // had previously been told they were invisble,
6783ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                // so if we are creating a new surface then toggle
6793ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                // the state to get them to notice.
6803ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                if (DEBUG) Log.v(TAG, "onVisibilityChanged(true) at surface: "
6813ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                        + this);
6823ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                onVisibilityChanged(true);
6833ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            }
6843ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            if (DEBUG) Log.v(TAG, "onVisibilityChanged(false) at surface: "
6853ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                                        + this);
6863ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            onVisibilityChanged(false);
6873ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        }
6883ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6893ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                    } finally {
6903ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        mIsCreating = false;
6913ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        mSurfaceCreated = true;
6923ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        if (redrawNeeded) {
6933ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                            mSession.finishDrawing(mWindow);
6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        }
6953ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                    }
696228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                } catch (RemoteException ex) {
6972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (DEBUG) Log.v(
6993ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                    TAG, "Layout: x=" + mLayout.x + " y=" + mLayout.y +
700228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    " w=" + mLayout.width + " h=" + mLayout.height);
701228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
702228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
7033ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
7043ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        void attach(IWallpaperEngineWrapper wrapper) {
7053ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            if (DEBUG) Log.v(TAG, "attach: " + this + " wrapper=" + wrapper);
7063ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            if (mDestroyed) {
7073ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                return;
708228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
709228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
7103ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            mIWallpaperEngine = wrapper;
71161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            mCaller = wrapper.mCaller;
71261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            mConnection = wrapper.mConnection;
7133ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            mWindowToken = wrapper.mWindowToken;
71461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            mSurfaceHolder.setSizeFromLayout();
715a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala            mInitializing = true;
7169e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            mSession = ViewRootImpl.getWindowSession(getMainLooper());
71744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
7183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            mWindow.setSession(mSession);
7193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            IntentFilter filter = new IntentFilter();
7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            filter.addAction(Intent.ACTION_SCREEN_ON);
722d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            filter.addAction(Intent.ACTION_SCREEN_OFF);
723ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala            registerReceiver(mReceiver, filter);
724228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
725d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (DEBUG) Log.v(TAG, "onCreate(): " + this);
7266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            onCreate(mSurfaceHolder);
72722d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
72822d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin            mInitializing = false;
72922d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin            mReportedVisible = false;
730a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala            updateSurface(false, false, false);
731a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        }
732a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala
733a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        void doDesiredSizeChanged(int desiredWidth, int desiredHeight) {
734a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala            if (!mDestroyed) {
735a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                if (DEBUG) Log.v(TAG, "onDesiredSizeChanged("
736a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                        + desiredWidth + "," + desiredHeight + "): " + this);
73777449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray                mIWallpaperEngine.mReqWidth = desiredWidth;
73877449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray                mIWallpaperEngine.mReqHeight = desiredHeight;
73977449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray                onDesiredSizeChanged(desiredWidth, desiredHeight);
7404ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                doOffsetsChanged(true);
7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
7434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
7444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        void doVisibilityChanged(boolean visible) {
7456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            if (!mDestroyed) {
74673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                mVisible = visible;
7472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                reportVisibility();
7486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            }
7496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
751c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        void reportVisibility() {
7529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (!mDestroyed) {
75373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                boolean visible = mVisible && mScreenOn;
754be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                if (mReportedVisible != visible) {
755be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    mReportedVisible = visible;
756be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + visible
757be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                            + "): " + this);
7586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    if (visible) {
75973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        // If becoming visible, in preview mode the surface
760c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                        // may have been destroyed so now we need to make
761c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                        // sure it is re-created.
762a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                        doOffsetsChanged(false);
763a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                        updateSurface(false, false, false);
764a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                    }
765a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                    onVisibilityChanged(visible);
766a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                }
767a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala            }
768a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala        }
769a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala
770e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        void doOffsetsChanged(boolean always) {
771a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala            if (mDestroyed) {
772a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                return;
773a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala            }
774a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala
775a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala            if (!always && !mOffsetsChanged) {
776a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                return;
777a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala            }
778e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He
779a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala            float xOffset;
780d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He            float yOffset;
7813ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            float xOffsetStep;
7823ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            float yOffsetStep;
7833ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            boolean sync;
7843ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            synchronized (mLock) {
785228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                xOffset = mPendingXOffset;
786a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                yOffset = mPendingYOffset;
787a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                xOffsetStep = mPendingXOffsetStep;
788a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                yOffsetStep = mPendingYOffsetStep;
789a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                sync = mPendingSync;
790a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                mPendingSync = false;
791a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                mOffsetMessageEnqueued = false;
792a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
793a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
794a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (mSurfaceCreated) {
795a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                if (mReportedVisible) {
796a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Offsets change in " + this
797a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                            + ": " + xOffset + "," + yOffset);
798a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    final int availw = mIWallpaperEngine.mReqWidth-mCurWidth;
799a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    final int xPixels = availw > 0 ? -(int)(availw*xOffset+.5f) : 0;
800a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    final int availh = mIWallpaperEngine.mReqHeight-mCurHeight;
801a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    final int yPixels = availh > 0 ? -(int)(availh*yOffset+.5f) : 0;
802a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixels, yPixels);
803a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                } else {
804a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    mOffsetsChanged = true;
805a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                }
806d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala            }
807228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (sync) {
809228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                try {
810228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Reporting offsets change complete");
811228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mSession.wallpaperOffsetsComplete(mWindow.asBinder());
81273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                } catch (RemoteException e) {
813c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                }
814c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            }
815c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        }
816c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He
817c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        void doCommand(WallpaperCommand cmd) {
818c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            Bundle result;
819c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            if (!mDestroyed) {
820c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                result = onCommand(cmd.action, cmd.x, cmd.y, cmd.z,
821c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                        cmd.extras, cmd.sync);
822c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            } else {
823c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                result = null;
824c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            }
825c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            if (cmd.sync) {
826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                try {
827ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh                    if (DEBUG) Log.v(TAG, "Reporting command complete");
828ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh                    mSession.wallpaperCommandComplete(mWindow.asBinder(), result);
829ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh                } catch (RemoteException e) {
830dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                }
831da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
832da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
833da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
834da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        void reportSurfaceDestroyed() {
835da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (mSurfaceCreated) {
836e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                mSurfaceCreated = false;
837e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                mSurfaceHolder.ungetCallbacks();
838e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
839e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                if (callbacks != null) {
840e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                    for (SurfaceHolder.Callback c : callbacks) {
841e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                        c.surfaceDestroyed(mSurfaceHolder);
84273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    }
843661076292093f82aec488baf8460cdf204a5efd2Zhijun He                }
844661076292093f82aec488baf8460cdf204a5efd2Zhijun He                if (DEBUG) Log.v(TAG, "onSurfaceDestroyed("
845da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        + mSurfaceHolder + "): " + this);
8466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                onSurfaceDestroyed(mSurfaceHolder);
84773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            }
84873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
8495a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala
85073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        void detach() {
85173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            if (mDestroyed) {
8525a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                return;
85373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            }
85473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
85573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            mDestroyed = true;
8565a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala
8575a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            if (mVisible) {
8585a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                mVisible = false;
85973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                if (DEBUG) Log.v(TAG, "onVisibilityChanged(false): " + this);
86073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                onVisibilityChanged(false);
8615a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            }
86273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
86373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            reportSurfaceDestroyed();
86473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
86573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            if (DEBUG) Log.v(TAG, "onDestroy(): " + this);
86673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            onDestroy();
86773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
86873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            unregisterReceiver(mReceiver);
86973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
87073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            if (mCreated) {
87173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                try {
87273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Removing window and destroying surface "
873be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                            + mSurfaceHolder.getSurface() + " of: " + this);
874be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
87573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    if (mInputChannel != null) {
876be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        InputQueue.unregisterInputChannel(mInputChannel);
8776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    }
8786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mSession.remove(mWindow);
8802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                } catch (RemoteException e) {
8816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                }
88261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                mSurfaceHolder.mSurface.release();
88361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                mCreated = false;
88461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
885a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                // Dispose the input channel after removing the window so the Window Manager
8869e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                // doesn't interpret the input channel being closed as an abnormal termination.
88744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                if (mInputChannel != null) {
8883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    mInputChannel.dispose();
8893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    mInputChannel = null;
89036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                }
891ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala            }
892ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala        }
89336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
894ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
8954865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    class IWallpaperEngineWrapper extends IWallpaperEngine.Stub
896d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            implements HandlerCaller.Callback {
8972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        private final HandlerCaller mCaller;
898228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        final IWallpaperConnection mConnection;
9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        final IBinder mWindowToken;
901228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        final int mWindowType;
902228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        final boolean mIsPreview;
903228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int mReqWidth;
9042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int mReqHeight;
905ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
906d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        Engine mEngine;
9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
908d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        IWallpaperEngineWrapper(WallpaperService context,
9092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                IWallpaperConnection conn, IBinder windowToken,
910d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala                int windowType, boolean isPreview, int reqWidth, int reqHeight) {
911d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            if (DEBUG && mCallbackLooper != null) {
9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                mCallbackLooper.setMessageLogging(new LogPrinter(Log.VERBOSE, TAG));
9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
914a27c4aa222c8dd1712617dad954c5f3aa68d5427Ruben Brunk            mCaller = new HandlerCaller(context,
915d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                    mCallbackLooper != null
916d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                            ? mCallbackLooper : context.getMainLooper(),
917d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                    this);
918d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            mConnection = conn;
919d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            mWindowToken = windowToken;
9202cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            mWindowType = windowType;
9212cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            mIsPreview = isPreview;
9222cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            mReqWidth = reqWidth;
9232cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            mReqHeight = reqHeight;
9242cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma
9252cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            Message msg = mCaller.obtainMessage(DO_ATTACH);
9262cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            mCaller.sendMessage(msg);
9272cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma        }
9282cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma
9294865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        public void setDesiredSize(int width, int height) {
9304865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            Message msg = mCaller.obtainMessageII(DO_SET_DESIRED_SIZE, width, height);
9314865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            mCaller.sendMessage(msg);
9324865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        }
9334865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
93428d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh        public void setVisibility(boolean visible) {
93528d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED,
93628d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                    visible ? 1 : 0);
93728d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            mCaller.sendMessage(msg);
93828d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh        }
93928d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh
94028d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh        public void dispatchPointer(MotionEvent event) {
941228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (mEngine != null) {
9422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                mEngine.dispatchPointer(event);
9432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
9442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
946d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        public void dispatchWallpaperCommand(String action, int x, int y,
947228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                int z, Bundle extras) {
948d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (mEngine != null) {
949d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mEngine.mWindow.dispatchWallpaperCommand(action, x, y, z, extras, false);
950228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
951d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
95261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
95361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        public void destroy() {
95461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            Message msg = mCaller.obtainMessage(DO_DETACH);
955a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala            mCaller.sendMessage(msg);
95644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        }
9573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        public void executeMessage(Message message) {
9593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            switch (message.what) {
9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case DO_ATTACH: {
9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    try {
96261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                        mConnection.attachEngine(this);
96361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    } catch (RemoteException e) {
96461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                        Log.w(TAG, "Wallpaper host disappeared", e);
965a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                        return;
96644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                    }
9673a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    Engine engine = onCreateEngine();
9683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    mEngine = engine;
9693a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    mActiveEngines.add(engine);
9702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    engine.attach(this);
9712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    return;
9722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
9732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case DO_DETACH: {
97478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                    mActiveEngines.remove(mEngine);
9752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    mEngine.detach();
9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    return;
97778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                }
97878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                case DO_SET_DESIRED_SIZE: {
97978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                    mEngine.doDesiredSizeChanged(message.arg1, message.arg2);
98078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                    return;
98178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                }
98278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                case MSG_UPDATE_SURFACE:
9832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    mEngine.updateSurface(true, false, false);
98478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                    break;
98578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                case MSG_VISIBILITY_CHANGED:
98661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Visibility change in " + mEngine
98761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                            + ": " + message.arg1);
98861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    mEngine.doVisibilityChanged(message.arg1 != 0);
989a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                    break;
9909e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                case MSG_WALLPAPER_OFFSETS: {
99144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                    mEngine.doOffsetsChanged(true);
9929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                } break;
9933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                case MSG_WALLPAPER_COMMAND: {
9942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    WallpaperCommand cmd = (WallpaperCommand)message.obj;
995228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mEngine.doCommand(cmd);
9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                } break;
997228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                case MSG_WINDOW_RESIZED: {
9983a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    final boolean reportDraw = message.arg1 != 0;
999228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mEngine.updateSurface(true, false, reportDraw);
1000228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mEngine.doOffsetsChanged(true);
100122d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin                } break;
100222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin                case MSG_TOUCH_EVENT: {
100322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin                    boolean skip = false;
1004228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    MotionEvent ev = (MotionEvent)message.obj;
10052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    if (ev.getAction() == MotionEvent.ACTION_MOVE) {
1006228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        synchronized (mEngine.mLock) {
10079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            if (mEngine.mPendingMove == ev) {
100896ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He                                mEngine.mPendingMove = null;
100996ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He                            } else {
101096ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He                                // this is not the motion event we are looking for....
101196ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He                                skip = true;
10129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            }
10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        }
10149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    }
10159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    if (!skip) {
10162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (DEBUG) Log.v(TAG, "Delivering touch event: " + ev);
10172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        mEngine.onTouchEvent(ev);
1018228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    }
1019228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    ev.recycle();
1020228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                } break;
10219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                default :
10229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    Log.w(TAG, "Unknown message type " + message.what);
10239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
10242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    /**
10289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala     * Implements the internal {@link IWallpaperService} interface to convert
1029228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala     * incoming calls to it back to calls on an {@link WallpaperService}.
103078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala     */
103178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    class IWallpaperServiceWrapper extends IWallpaperService.Stub {
103278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        private final WallpaperService mTarget;
103378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
103478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        public IWallpaperServiceWrapper(WallpaperService context) {
103578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            mTarget = context;
103673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
103773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
103873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        public void attach(IWallpaperConnection conn, IBinder windowToken,
103973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                int windowType, boolean isPreview, int reqWidth, int reqHeight) {
104073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            new IWallpaperEngineWrapper(mTarget, conn, windowToken,
104173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    windowType, isPreview, reqWidth, reqHeight);
104273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
104373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
104473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
1045609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    @Override
1046a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    public void onCreate() {
1047a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        super.onCreate();
1048a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
1049a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
1050a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    @Override
1051a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    public void onDestroy() {
1052a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        super.onDestroy();
1053a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        for (int i=0; i<mActiveEngines.size(); i++) {
1054a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            mActiveEngines.get(i).detach();
1055a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
1056a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        mActiveEngines.clear();
1057a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
1058a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
1059a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    /**
1060a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala     * Implement to return the implementation of the internal accessibility
1061a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala     * service interface.  Subclasses should not override.
1062a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala     */
1063a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    @Override
1064a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    public final IBinder onBind(Intent intent) {
1065ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        return new IWallpaperServiceWrapper(this);
1066dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    }
1067dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala
1068dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    /**
1069dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * This allows subclasses to change the thread that most callbacks
1070dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * occur on.  Currently hidden because it is mostly needed for the
1071dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * image wallpaper (which runs in the system process and doesn't want
1072dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * to get stuck running on that seriously in use main thread).  Not
1073dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * exposed right now because the semantics of this are not totally
1074dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * well defined and some callbacks can still happen on the main thread).
1075dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * @hide
1076dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     */
1077dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    public void setCallbackLooper(Looper looper) {
1078dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        mCallbackLooper = looper;
1079dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    }
1080dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala
1081dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    /**
1082dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * Must be implemented to return a new instance of the wallpaper's engine.
1083dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * Note that multiple instances may be active at the same time, such as
1084dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * when the wallpaper is currently set as the active wallpaper and the user
1085dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     * is in the wallpaper picker viewing a preview of it as well.
1086dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala     */
1087dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    public abstract Engine onCreateEngine();
1088dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala
1089dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    @Override
1090dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala    protected void dump(FileDescriptor fd, PrintWriter out, String[] args) {
1091dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        out.print("State of wallpaper "); out.print(this); out.println(":");
1092dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala        for (int i=0; i<mActiveEngines.size(); i++) {
1093dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            Engine engine = mActiveEngines.get(i);
1094dc2e6ddc933e40632e79a866d9ece870db1a975eEino-Ville Talvala            out.print("  Engine "); out.print(engine); out.println(":");
1095ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            engine.dump("    ", fd, out, args);
1096ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        }
1097ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh    }
1098a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala}
1099a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala