WallpaperService.java revision 03850591954faf5280fd581dd04cd6958eda0124
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
1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalapackage android.service.wallpaper;
18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.content.res.TypedArray;
20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvalaimport android.graphics.Canvas;
21f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaimport android.view.WindowInsets;
22a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport com.android.internal.R;
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport com.android.internal.os.HandlerCaller;
2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport com.android.internal.util.ScreenShapeHelper;
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport com.android.internal.view.BaseIWindow;
2778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvalaimport com.android.internal.view.BaseSurfaceHolder;
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
29f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaimport android.annotation.SdkConstant;
30f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaimport android.annotation.SdkConstant.SdkConstantType;
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.app.Service;
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.app.WallpaperManager;
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.content.Context;
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.content.Intent;
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.content.res.Configuration;
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.graphics.PixelFormat;
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.graphics.Rect;
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.hardware.display.DisplayManager;
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.hardware.display.DisplayManager.DisplayListener;
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.os.Bundle;
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.os.IBinder;
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.os.Looper;
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.os.Message;
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.os.RemoteException;
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.util.Log;
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.Display;
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.Gravity;
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.IWindowSession;
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.InputChannel;
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.InputDevice;
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.InputEvent;
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.InputEventReceiver;
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaimport android.view.MotionEvent;
54f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaimport android.view.SurfaceHolder;
558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalaimport android.view.View;
56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalaimport android.view.ViewGroup;
57228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalaimport android.view.WindowManager;
58228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalaimport android.view.WindowManagerGlobal;
59d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalaimport java.io.FileDescriptor;
61983cf231ab2d176a14595cdae46ff1b0c239af47James Dongimport java.io.PrintWriter;
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalaimport java.util.ArrayList;
63a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
64c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala/**
6561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * A wallpaper service is responsible for showing a live wallpaper behind
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * applications that would like to sit on top of it.  This service object
67228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala * itself does very little -- its only purpose is to generate instances of
68228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala * {@link Engine} as needed.  Implementing a wallpaper thus
69228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala * involves subclassing from this, subclassing an Engine implementation,
70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * and implementing {@link #onCreateEngine()} to return a new instance of
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala * your engine.
723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala */
733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalapublic abstract class WallpaperService extends Service {
743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    /**
753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala     * The {@link Intent} that must be declared as handled by the service.
763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala     * To be supported, the service must also require the
773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala     * {@link android.Manifest.permission#BIND_WALLPAPER} permission so
783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala     * that other applications can not abuse it.
793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala     */
803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    @SdkConstant(SdkConstantType.SERVICE_ACTION)
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    public static final String SERVICE_INTERFACE =
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "android.service.wallpaper.WallpaperService";
83a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
84c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    /**
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * Name under which a WallpaperService component publishes information
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * about itself.  This meta-data must reference an XML resource containing
87c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala     * a <code>&lt;{@link android.R.styleable#Wallpaper wallpaper}&gt;</code>
88c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala     * tag.
89c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala     */
90c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    public static final String SERVICE_META_DATA = "android.service.wallpaper";
91c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    static final String TAG = "WallpaperService";
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    static final boolean DEBUG = false;
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    private static final int DO_ATTACH = 10;
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    private static final int DO_DETACH = 20;
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    private static final int DO_SET_DESIRED_SIZE = 30;
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    private static final int DO_SET_DISPLAY_PADDING = 40;
99174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
100174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    private static final int MSG_UPDATE_SURFACE = 10000;
1018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    private static final int MSG_VISIBILITY_CHANGED = 10010;
102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    private static final int MSG_WALLPAPER_OFFSETS = 10020;
103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    private static final int MSG_WALLPAPER_COMMAND = 10025;
104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    private static final int MSG_WINDOW_RESIZED = 10030;
105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    private static final int MSG_WINDOW_MOVED = 10035;
106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    private static final int MSG_TOUCH_EVENT = 10040;
107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    private final ArrayList<Engine> mActiveEngines
109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            = new ArrayList<Engine>();
110836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
111f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    static final class WallpaperCommand {
112f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String action;
113836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        int x;
114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int y;
115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int z;
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Bundle extras;
11761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        boolean sync;
11861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    }
11961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
120a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    /**
121c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala     * The actual implementation of a wallpaper.  A wallpaper service may
1224ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala     * have multiple instances running (for example as a real wallpaper
123f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * and as a preview), each of which is represented by its own Engine
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * instance.  You must implement {@link WallpaperService#onCreateEngine()}
1253a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala     * to return your concrete Engine implementation.
1263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala     */
127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    public class Engine {
128c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        IWallpaperEngineWrapper mIWallpaperEngine;
129c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
130c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        // Copies from mIWallpaperEngine.
13161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        HandlerCaller mCaller;
13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        IWallpaperConnection mConnection;
13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        IBinder mWindowToken;
134611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala
1353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        boolean mInitializing = true;
136611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala        boolean mVisible;
137611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala        boolean mReportedVisible;
138611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala        boolean mDestroyed;
1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        // Current window state.
1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        boolean mCreated;
142836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        boolean mSurfaceCreated;
143836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        boolean mIsCreating;
144228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        boolean mDrawingAllowed;
1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        boolean mOffsetsChanged;
1464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        boolean mFixedSizeAllowed;
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        int mWidth;
148836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        int mHeight;
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        int mFormat;
150836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        int mType;
1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        int mCurWidth;
152836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        int mCurHeight;
15311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        int mWindowFlags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
154836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        int mWindowPrivateFlags =
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                WindowManager.LayoutParams.PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS;
156836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        int mCurWindowFlags = mWindowFlags;
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        int mCurWindowPrivateFlags = mWindowPrivateFlags;
158836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        final Rect mVisibleInsets = new Rect();
1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final Rect mWinFrame = new Rect();
160836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        final Rect mOverscanInsets = new Rect();
161836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        final Rect mContentInsets = new Rect();
1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final Rect mStableInsets = new Rect();
163836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        final Rect mOutsets = new Rect();
164836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        final Rect mDispatchedOverscanInsets = new Rect();
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final Rect mDispatchedContentInsets = new Rect();
166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        final Rect mDispatchedStableInsets = new Rect();
167836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        final Rect mDispatchedOutsets = new Rect();
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final Rect mFinalSystemInsets = new Rect();
169836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        final Rect mFinalStableInsets = new Rect();
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final Configuration mConfiguration = new Configuration();
171836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        private boolean mWindowIsRound;
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final WindowManager.LayoutParams mLayout
175836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                = new WindowManager.LayoutParams();
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        IWindowSession mSession;
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        InputChannel mInputChannel;
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final Object mLock = new Object();
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        boolean mOffsetMessageEnqueued;
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        float mPendingXOffset;
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        float mPendingYOffset;
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        float mPendingXOffsetStep;
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        float mPendingYOffsetStep;
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        boolean mPendingSync;
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        MotionEvent mPendingMove;
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        DisplayManager mDisplayManager;
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        Display mDisplay;
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        private int mDisplayState;
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() {
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            {
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mRequestedFormat = PixelFormat.RGBX_8888;
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public boolean onAllowLockCanvas() {
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                return mDrawingAllowed;
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            @Override
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void onRelayoutContainer() {
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE);
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mCaller.sendMessage(msg);
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void onUpdateSurface() {
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE);
211836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                mCaller.sendMessage(msg);
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public boolean isCreating() {
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                return mIsCreating;
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void setFixedSize(int width, int height) {
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                if (!mFixedSizeAllowed) {
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    // Regular apps can't do this.  It can only work for
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    // certain designs of window animations, so you can't
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    // rely on it.
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    throw new UnsupportedOperationException(
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                            "Wallpapers currently only support sizing from layout");
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                }
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                super.setFixedSize(width, height);
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void setKeepScreenOn(boolean screenOn) {
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                throw new UnsupportedOperationException(
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                        "Wallpapers do not support keep screen on");
233836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            }
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public Canvas lockCanvas() {
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                if (mDisplayState == Display.STATE_DOZE
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                        || mDisplayState == Display.STATE_DOZE_SUSPEND) {
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    try {
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                        mSession.pokeDrawLock(mWindow);
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    } catch (RemoteException e) {
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                        // System server died, can be ignored.
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    }
244836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                }
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                return super.lockCanvas();
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        };
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        final class WallpaperInputEventReceiver extends InputEventReceiver {
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public WallpaperInputEventReceiver(InputChannel inputChannel, Looper looper) {
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                super(inputChannel, looper);
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            }
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void onInputEvent(InputEvent event) {
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                boolean handled = false;
257836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                try {
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    if (event instanceof MotionEvent
259836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                            && (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
260836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                        MotionEvent dup = MotionEvent.obtainNoHistory((MotionEvent)event);
261836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                        dispatchPointer(dup);
262836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                        handled = true;
263836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    }
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                } finally {
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    finishInputEvent(event, handled);
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                }
267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            }
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        }
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        WallpaperInputEventReceiver mInputEventReceiver;
270836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
271836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        final BaseIWindow mWindow = new BaseIWindow() {
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void resized(Rect frame, Rect overscanInsets, Rect contentInsets,
274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    Rect visibleInsets, Rect stableInsets, Rect outsets, boolean reportDraw,
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    Configuration newConfig) {
276836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                Message msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED,
277836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                        reportDraw ? 1 : 0, outsets);
278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                mCaller.sendMessage(msg);
279836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            }
280836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            @Override
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            public void moved(int newX, int newY) {
283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                Message msg = mCaller.obtainMessageII(MSG_WINDOW_MOVED, newX, newY);
284836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                mCaller.sendMessage(msg);
285836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            }
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            @Override
288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            public void dispatchAppVisibility(boolean visible) {
2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                // We don't do this in preview mode; we'll let the preview
2903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                // activity tell us when to run.
291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                if (!mIWallpaperEngine.mIsPreview) {
2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED,
2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                            visible ? 1 : 0);
2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    mCaller.sendMessage(msg);
2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                }
296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            }
2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2983297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            @Override
299cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
3003297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    boolean sync) {
3013297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                synchronized (mLock) {
302cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Dispatch wallpaper offsets: " + x + ", " + y);
3033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    mPendingXOffset = x;
3043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    mPendingYOffset = y;
3053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    mPendingXOffsetStep = xStep;
3063297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    mPendingYOffsetStep = yStep;
3073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    if (sync) {
308cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                        mPendingSync = true;
3093297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    }
3103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    if (!mOffsetMessageEnqueued) {
311cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                        mOffsetMessageEnqueued = true;
3123297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                        Message msg = mCaller.obtainMessage(MSG_WALLPAPER_OFFSETS);
3133297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                        mCaller.sendMessage(msg);
3143297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    }
3153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                }
3163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            }
317cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
318428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala            @Override
319428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala            public void dispatchWallpaperCommand(String action, int x, int y,
320cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    int z, Bundle extras, boolean sync) {
321428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala                synchronized (mLock) {
322428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Dispatch wallpaper command: " + x + ", " + y);
323428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala                    WallpaperCommand cmd = new WallpaperCommand();
324428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala                    cmd.action = action;
325428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala                    cmd.x = x;
326c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    cmd.y = y;
327c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    cmd.z = z;
3283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    cmd.extras = extras;
329611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala                    cmd.sync = sync;
3307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                    Message msg = mCaller.obtainMessage(MSG_WALLPAPER_COMMAND);
3313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    msg.obj = cmd;
3323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                    mCaller.sendMessage(msg);
3333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                }
3343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala            }
3353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        };
3363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        /**
3387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala         * Provides access to the surface in which this wallpaper is drawn.
339611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala         */
34061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        public SurfaceHolder getSurfaceHolder() {
34161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            return mSurfaceHolder;
3424ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
3434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
3444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        /**
3453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala         * Convenience for {@link WallpaperManager#getDesiredMinimumWidth()
3464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala         * WallpaperManager.getDesiredMinimumWidth()}, returning the width
3474ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala         * that the system would like this wallpaper to run in.
3484ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala         */
3494ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        public int getDesiredMinimumWidth() {
3504ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return mIWallpaperEngine.mReqWidth;
3514ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
3524ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
3534ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        /**
3544ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala         * Convenience for {@link WallpaperManager#getDesiredMinimumHeight()
3554ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala         * WallpaperManager.getDesiredMinimumHeight()}, returning the height
3564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala         * that the system would like this wallpaper to run in.
3574ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala         */
3584ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        public int getDesiredMinimumHeight() {
35961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            return mIWallpaperEngine.mReqHeight;
36061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        }
36161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
362a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala        /**
3639e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala         * Return whether the wallpaper is currently visible to the user,
364ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala         * this is the last value supplied to
3653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala         * {@link #onVisibilityChanged(boolean)}.
3663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala         */
367ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala        public boolean isVisible() {
368f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            return mReportedVisible;
369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
37036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        /**
372d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * Returns true if this engine is running in preview mode -- that is,
3736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * it is being shown to the user before they select it as the actual
374d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * wallpaper.
375d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         */
376d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        public boolean isPreview() {
377d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return mIWallpaperEngine.mIsPreview;
378d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
379d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
3806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        /**
381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala         * Control whether this wallpaper will receive raw touch events
382898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala         * from the window manager as the user interacts with the window
383898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala         * that is currently displaying the wallpaper.  By default they
384898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala         * are turned off.  If enabled, the events will be received in
385898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala         * {@link #onTouchEvent(MotionEvent)}.
386898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala         */
387228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        public void setTouchEventsEnabled(boolean enabled) {
388228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mWindowFlags = enabled
389228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    ? (mWindowFlags&~WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
390228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    : (mWindowFlags|WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
391228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (mCreated) {
3923a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                updateSurface(false, false, false);
393228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
394228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
3953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
3968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        /**
3978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala         * Control whether this wallpaper will receive notifications when the wallpaper
3988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala         * has been scrolled. By default, wallpapers will receive notifications, although
3998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala         * the default static image wallpapers do not. It is a performance optimization to
4008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala         * set this to false.
40161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         *
40261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         * @param enabled whether the wallpaper wants to receive offset notifications
40361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         */
40461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        public void setOffsetNotificationsEnabled(boolean enabled) {
405a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala            mWindowPrivateFlags = enabled
4069e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    ? (mWindowPrivateFlags |
407ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                        WindowManager.LayoutParams.PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS)
408ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                    : (mWindowPrivateFlags &
4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        ~WindowManager.LayoutParams.PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS);
4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mCreated) {
4119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                updateSurface(false, false, false);
4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
4149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        /** {@hide} */
4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        public void setFixedSizeAllowed(boolean allowed) {
4178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            mFixedSizeAllowed = allowed;
4188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
4199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        /**
421228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala         * Called once to initialize the engine.  After returning, the
422228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala         * engine's surface will be created by the framework.
423228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala         */
4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        public void onCreate(SurfaceHolder surfaceHolder) {
42561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        }
42661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
42761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        /**
428a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala         * Called right before the engine is going away.  After this the
4299e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala         * surface will be destroyed and this Engine object is no longer
430ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala         * valid.
4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         */
4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        public void onDestroy() {
433ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala        }
4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        /**
4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * Called to inform you of the wallpaper becoming visible or
4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * hidden.  <em>It is very important that a wallpaper only use
4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * CPU while it is visible.</em>.
4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         */
4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        public void onVisibilityChanged(boolean visible) {
4419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        /**
4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * Called with the current insets that are in effect for the wallpaper.
4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * This gives you the part of the overall wallpaper surface that will
44661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         * generally be visible to the user (ignoring position offsets applied to it).
44761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         *
44861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         * @param insets Insets to apply.
449a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala         */
4509e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        public void onApplyWindowInsets(WindowInsets insets) {
451ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala        }
4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        /**
454ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala         * Called as the user performs touch-screen interaction with the
4559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * window that is currently showing this wallpaper.  Note that the
4569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * events you receive here are driven by the actual application the
4579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * user is interacting with, so if it is slow you will get fewer
4588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala         * move events.
4598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala         */
4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        public void onTouchEvent(MotionEvent event) {
4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        /**
4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * Called to inform you of the wallpaper's offsets changing
4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * within its contain, corresponding to the container's
4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * call to {@link WallpaperManager#setWallpaperOffsets(IBinder, float, float)
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * WallpaperManager.setWallpaperOffsets()}.
46861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         */
46961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        public void onOffsetsChanged(float xOffset, float yOffset,
4706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                float xOffsetStep, float yOffsetStep,
4716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int xPixelOffset, int yPixelOffset) {
472a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala        }
4739e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala
474ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala        /**
4753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala         * Process a command that was sent to the wallpaper with
4763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala         * {@link WallpaperManager#sendWallpaperCommand}.
477ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala         * The default implementation does nothing, and always returns null
4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * as the result.
4796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         *
4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * @param action The name of the command to perform.  This tells you
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * what to do and how to interpret the rest of the arguments.
4826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * @param x Generic integer parameter.
4836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * @param y Generic integer parameter.
4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * @param z Generic integer parameter.
48536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala         * @param extras Any additional parameters.
48661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         * @param resultRequested If true, the caller is requesting that
48761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala         * a result, appropriate for the command, be returned back.
4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * @return If returning a result, create a Bundle and place the
4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * result data in to it.  Otherwise return null.
490a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala         */
4919e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        public Bundle onCommand(String action, int x, int y, int z,
492ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                Bundle extras, boolean resultRequested) {
4933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            return null;
4943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        }
495ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        /**
4976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * Called when an application has changed the desired virtual size of
4986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * the wallpaper.
4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         */
5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        public void onDesiredSizeChanged(int desiredWidth, int desiredHeight) {
5016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
50236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
5036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        /**
5046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         * Convenience for {@link SurfaceHolder.Callback#surfaceChanged
50536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala         * SurfaceHolder.Callback.surfaceChanged()}.
506be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala         */
507a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
5096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        /**
5119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala         * Convenience for {@link SurfaceHolder.Callback2#surfaceRedrawNeeded
5129e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala         * SurfaceHolder.Callback.surfaceRedrawNeeded()}.
5136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala         */
5146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        public void onSurfaceRedrawNeeded(SurfaceHolder holder) {
5156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
516228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
517228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        /**
5183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala         * Convenience for {@link SurfaceHolder.Callback#surfaceCreated
5199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * SurfaceHolder.Callback.surfaceCreated()}.
5209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         */
5219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        public void onSurfaceCreated(SurfaceHolder holder) {
5229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
523228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        /**
5259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * Convenience for {@link SurfaceHolder.Callback#surfaceDestroyed
5269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         * SurfaceHolder.Callback.surfaceDestroyed()}.
5279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala         */
5289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        public void onSurfaceDestroyed(SurfaceHolder holder) {
5299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
5309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
5319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) {
5329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            out.print(prefix); out.print("mInitializing="); out.print(mInitializing);
533cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    out.print(" mDestroyed="); out.println(mDestroyed);
534228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            out.print(prefix); out.print("mVisible="); out.print(mVisible);
5359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    out.print(" mReportedVisible="); out.println(mReportedVisible);
5369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            out.print(prefix); out.print("mDisplay="); out.println(mDisplay);
5379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            out.print(prefix); out.print("mCreated="); out.print(mCreated);
538d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    out.print(" mSurfaceCreated="); out.print(mSurfaceCreated);
539be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    out.print(" mIsCreating="); out.print(mIsCreating);
540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    out.print(" mDrawingAllowed="); out.println(mDrawingAllowed);
541be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            out.print(prefix); out.print("mWidth="); out.print(mWidth);
542be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    out.print(" mCurWidth="); out.print(mCurWidth);
543be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    out.print(" mHeight="); out.print(mHeight);
544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    out.print(" mCurHeight="); out.println(mCurHeight);
5456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            out.print(prefix); out.print("mType="); out.print(mType);
5466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    out.print(" mWindowFlags="); out.print(mWindowFlags);
547be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    out.print(" mCurWindowFlags="); out.println(mCurWindowFlags);
548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            out.print(prefix); out.print("mWindowPrivateFlags="); out.print(mWindowPrivateFlags);
5496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    out.print(" mCurWindowPrivateFlags="); out.println(mCurWindowPrivateFlags);
5506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            out.print(prefix); out.print("mVisibleInsets=");
551be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    out.print(mVisibleInsets.toShortString());
5526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    out.print(" mWinFrame="); out.print(mWinFrame.toShortString());
5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    out.print(" mContentInsets="); out.println(mContentInsets.toShortString());
554bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala            out.print(prefix); out.print("mConfiguration="); out.println(mConfiguration);
555be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            out.print(prefix); out.print("mLayout="); out.println(mLayout);
556bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala            synchronized (mLock) {
557228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                out.print(prefix); out.print("mPendingXOffset="); out.print(mPendingXOffset);
558228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        out.print(" mPendingXOffset="); out.println(mPendingXOffset);
5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                out.print(prefix); out.print("mPendingXOffsetStep=");
5606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                        out.print(mPendingXOffsetStep);
5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                        out.print(" mPendingXOffsetStep="); out.println(mPendingXOffsetStep);
56261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                out.print(prefix); out.print("mOffsetMessageEnqueued=");
56361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                        out.print(mOffsetMessageEnqueued);
56461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                        out.print(" mPendingSync="); out.println(mPendingSync);
565a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                if (mPendingMove != null) {
566228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    out.print(prefix); out.print("mPendingMove="); out.println(mPendingMove);
567ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                }
5683a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            }
569228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        private void dispatchPointer(MotionEvent event) {
572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (event.isTouchEvent()) {
573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                synchronized (mLock) {
574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    if (event.getAction() == MotionEvent.ACTION_MOVE) {
575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mPendingMove = event;
576228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    } else {
577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mPendingMove = null;
578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    }
579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                }
580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                Message msg = mCaller.obtainMessageO(MSG_TOUCH_EVENT, event);
581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                mCaller.sendMessage(msg);
582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            } else {
583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                event.recycle();
584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        void updateSurface(boolean forceRelayout, boolean forceReport, boolean redrawNeeded) {
588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (mDestroyed) {
589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                Log.w(TAG, "Ignoring updateSurface: destroyed");
590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            boolean fixedSize = false;
593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            int myWidth = mSurfaceHolder.getRequestedWidth();
594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (myWidth <= 0) myWidth = ViewGroup.LayoutParams.MATCH_PARENT;
595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            else fixedSize = true;
596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            int myHeight = mSurfaceHolder.getRequestedHeight();
597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (myHeight <= 0) myHeight = ViewGroup.LayoutParams.MATCH_PARENT;
598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            else fixedSize = true;
599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
60061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            final boolean creating = !mCreated;
60161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            final boolean surfaceCreating = !mSurfaceCreated;
60261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            final boolean formatChanged = mFormat != mSurfaceHolder.getRequestedFormat();
603a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala            boolean sizeChanged = mWidth != myWidth || mHeight != myHeight;
6049e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            boolean insetsChanged = !mCreated;
605ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala            final boolean typeChanged = mType != mSurfaceHolder.getRequestedType();
6063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            final boolean flagsChanged = mCurWindowFlags != mWindowFlags ||
6073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    mCurWindowPrivateFlags != mWindowPrivateFlags;
608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (forceRelayout || creating || surfaceCreating || formatChanged || sizeChanged
609228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    || typeChanged || flagsChanged || redrawNeeded
610d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    || !mIWallpaperEngine.mShownReported) {
611ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                if (DEBUG) Log.v(TAG, "Changes: creating=" + creating
613d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        + " format=" + formatChanged + " size=" + sizeChanged);
6146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                try {
6164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                    mWidth = myWidth;
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mHeight = myHeight;
6184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                    mFormat = mSurfaceHolder.getRequestedFormat();
6194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                    mType = mSurfaceHolder.getRequestedType();
6206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
621be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    mLayout.x = 0;
622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mLayout.y = 0;
6236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mLayout.width = myWidth;
6246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mLayout.height = myHeight;
625228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
6269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    mLayout.format = mFormat;
627228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    mCurWindowFlags = mWindowFlags;
629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    mLayout.flags = mWindowFlags
630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                            | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                            | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
6326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            ;
634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mCurWindowPrivateFlags = mWindowPrivateFlags;
635228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mLayout.privateFlags = mWindowPrivateFlags;
636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mLayout.memoryType = mType;
638228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mLayout.token = mWindowToken;
639228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
640228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    if (!mCreated) {
641228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        // Retrieve watch round info
642228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        TypedArray windowStyle = obtainStyledAttributes(
6436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                                com.android.internal.R.styleable.Window);
644cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                        mWindowIsRound = ScreenShapeHelper.getWindowIsRound(getResources());
645228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        windowStyle.recycle();
646be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
647be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        // Add window
648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        mLayout.type = mIWallpaperEngine.mWindowType;
649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        mLayout.gravity = Gravity.START|Gravity.TOP;
650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        mLayout.setTitle(WallpaperService.this.getClass().getName());
6516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                        mLayout.windowAnimations =
6526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                                com.android.internal.R.style.Animation_Wallpaper;
653228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mInputChannel = new InputChannel();
654228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        if (mSession.addToDisplay(mWindow, mWindow.mSeq, mLayout, View.VISIBLE,
655228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            Display.DEFAULT_DISPLAY, mContentInsets, mStableInsets, mOutsets,
656cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                                mInputChannel) < 0) {
657228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            Log.w(TAG, "Failed to add window while updating wallpaper surface.");
658228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            return;
659228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        }
660cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                        mCreated = true;
661cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
662228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mInputEventReceiver = new WallpaperInputEventReceiver(
663cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                                mInputChannel, Looper.myLooper());
664228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    }
6656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mSurfaceHolder.mSurfaceLock.lock();
6676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    mDrawingAllowed = true;
668be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
669be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    if (!fixedSize) {
670cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                        mLayout.surfaceInsets.set(mIWallpaperEngine.mDisplayPadding);
671be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        mLayout.surfaceInsets.left += mOutsets.left;
672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        mLayout.surfaceInsets.top += mOutsets.top;
673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        mLayout.surfaceInsets.right += mOutsets.right;
6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                        mLayout.surfaceInsets.bottom += mOutsets.bottom;
6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    } else {
6766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                        mLayout.surfaceInsets.set(0, 0, 0, 0);
6776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    }
6786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    final int relayoutResult = mSession.relayout(
679bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        mWindow, mWindow.mSeq, mLayout, mWidth, mHeight,
680bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                            View.VISIBLE, 0, mWinFrame, mOverscanInsets, mContentInsets,
6816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                            mVisibleInsets, mStableInsets, mOutsets, mConfiguration,
6826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                            mSurfaceHolder.mSurface);
6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
684228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface
6856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                            + ", frame=" + mWinFrame);
6866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
68761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    int w = mWinFrame.width();
68861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    int h = mWinFrame.height();
68961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
690a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                    if (!fixedSize) {
6919e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                        final Rect padding = mIWallpaperEngine.mDisplayPadding;
692ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                        w += padding.left + padding.right + mOutsets.left + mOutsets.right;
6933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                        h += padding.top + padding.bottom + mOutsets.top + mOutsets.bottom;
6943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                        mOverscanInsets.left += padding.left;
69536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                        mOverscanInsets.top += padding.top;
696ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                        mOverscanInsets.right += padding.right;
697ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                        mOverscanInsets.bottom += padding.bottom;
69836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                        mContentInsets.left += padding.left;
699ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                        mContentInsets.top += padding.top;
700228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mContentInsets.right += padding.right;
701228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mContentInsets.bottom += padding.bottom;
702228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mStableInsets.left += padding.left;
703228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mStableInsets.top += padding.top;
704228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mStableInsets.right += padding.right;
705228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mStableInsets.bottom += padding.bottom;
706228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    }
7073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
708d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    if (mCurWidth != w) {
709d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        sizeChanged = true;
710d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        mCurWidth = w;
711d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    }
712d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    if (mCurHeight != h) {
713d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        sizeChanged = true;
714d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        mCurHeight = h;
715d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    }
716d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
717d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    if (DEBUG) {
718228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        Log.v(TAG, "Wallpaper size has changed: (" + mCurWidth + ", " + mCurHeight);
719d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    }
720cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
7212267106c98f461b730c772a913da946c391a178cEino-Ville Talvala                    insetsChanged |= !mDispatchedOverscanInsets.equals(mOverscanInsets);
722228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    insetsChanged |= !mDispatchedContentInsets.equals(mContentInsets);
723228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    insetsChanged |= !mDispatchedStableInsets.equals(mStableInsets);
724228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    insetsChanged |= !mDispatchedOutsets.equals(mOutsets);
725228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
726228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mSurfaceHolder.setSurfaceFrameSize(w, h);
727d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    mSurfaceHolder.mSurfaceLock.unlock();
728228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
729d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    if (!mSurfaceHolder.mSurface.isValid()) {
730d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        reportSurfaceDestroyed();
731228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        if (DEBUG) Log.v(TAG, "Layout: Surface destroyed");
732d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        return;
73361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    }
73461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
73561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    boolean didSurface = false;
736a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
737ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                    try {
7383a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                        mSurfaceHolder.ungetCallbacks();
7393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7403a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                        if (surfaceCreating) {
741228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            mIsCreating = true;
742228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            didSurface = true;
74361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                            if (DEBUG) Log.v(TAG, "onSurfaceCreated("
74461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                                    + mSurfaceHolder + "): " + this);
74561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                            onSurfaceCreated(mSurfaceHolder);
746a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                            SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
747ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                            if (callbacks != null) {
7483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                                for (SurfaceHolder.Callback c : callbacks) {
7493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                                    c.surfaceCreated(mSurfaceHolder);
7503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                                }
751228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            }
752228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        }
75378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
75478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                        redrawNeeded |= creating || (relayoutResult
75578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                                & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0;
756228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
75778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                        if (forceReport || creating || surfaceCreating
75878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                                || formatChanged || sizeChanged) {
75978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                            if (DEBUG) {
76078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                                RuntimeException e = new RuntimeException();
76178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                                e.fillInStackTrace();
76278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                                Log.w(TAG, "forceReport=" + forceReport + " creating=" + creating
763836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                                        + " formatChanged=" + formatChanged
76478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                                        + " sizeChanged=" + sizeChanged, e);
76578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                            }
76661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                            if (DEBUG) Log.v(TAG, "onSurfaceChanged("
76761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                                    + mSurfaceHolder + ", " + mFormat
76861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                                    + ", " + mCurWidth + ", " + mCurHeight
769a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                                    + "): " + this);
7709e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                            didSurface = true;
771ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                            onSurfaceChanged(mSurfaceHolder, mFormat,
7729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                    mCurWidth, mCurHeight);
7733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                            SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
774228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            if (callbacks != null) {
775228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                for (SurfaceHolder.Callback c : callbacks) {
776228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                    c.surfaceChanged(mSurfaceHolder, mFormat,
777228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                            mCurWidth, mCurHeight);
7783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                                }
779228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            }
780228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        }
781228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        if (insetsChanged) {
783228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            mDispatchedOverscanInsets.set(mOverscanInsets);
7849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            mDispatchedOverscanInsets.left += mOutsets.left;
7859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            mDispatchedOverscanInsets.top += mOutsets.top;
7869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            mDispatchedOverscanInsets.right += mOutsets.right;
7879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            mDispatchedOverscanInsets.bottom += mOutsets.bottom;
7889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            mDispatchedContentInsets.set(mContentInsets);
7899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            mDispatchedStableInsets.set(mStableInsets);
7909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            mDispatchedOutsets.set(mOutsets);
791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            mFinalSystemInsets.set(mDispatchedOverscanInsets);
792228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            mFinalStableInsets.set(mDispatchedStableInsets);
793228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            WindowInsets insets = new WindowInsets(mFinalSystemInsets,
7949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                    null, mFinalStableInsets, mWindowIsRound);
7959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            if (DEBUG) {
7969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                Log.v(TAG, "dispatching insets=" + insets);
797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            }
7989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            onApplyWindowInsets(insets);
7999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        }
8009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        if (redrawNeeded) {
80278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                            onSurfaceRedrawNeeded(mSurfaceHolder);
80378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                            SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
80478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                            if (callbacks != null) {
80578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                                for (SurfaceHolder.Callback c : callbacks) {
80678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                                    if (c instanceof SurfaceHolder.Callback2) {
80778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                                        ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded(
808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                                mSurfaceHolder);
8099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                    }
8109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                }
8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            }
8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        }
8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
814228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        if (didSurface && !mReportedVisible) {
815228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            // This wallpaper is currently invisible, but its
816228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            // surface has changed.  At this point let's tell it
817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            // again that it is invisible in case the report about
818228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            // the surface caused it to start running.  We really
819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            // don't want wallpapers running when not visible.
820228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            if (mIsCreating) {
821228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                // Some wallpapers will ignore this call if they
822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                // had previously been told they were invisble,
823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                // so if we are creating a new surface then toggle
8249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                // the state to get them to notice.
825cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                                if (DEBUG) Log.v(TAG, "onVisibilityChanged(true) at surface: "
826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                        + this);
8279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                onVisibilityChanged(true);
8289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            }
8299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            if (DEBUG) Log.v(TAG, "onVisibilityChanged(false) at surface: "
8309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                        + this);
8319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            onVisibilityChanged(false);
8329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        }
8339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
834228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    } finally {
835228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mIsCreating = false;
836228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mSurfaceCreated = true;
837cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                        if (redrawNeeded) {
838228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                            mSession.finishDrawing(mWindow);
839228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        }
840228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        mIWallpaperEngine.reportShown();
841228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    }
842cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                } catch (RemoteException ex) {
843228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                }
844228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                if (DEBUG) Log.v(
845228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    TAG, "Layout: x=" + mLayout.x + " y=" + mLayout.y +
8469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " w=" + mLayout.width + " h=" + mLayout.height);
8479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
8489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
8499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void attach(IWallpaperEngineWrapper wrapper) {
851cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            if (DEBUG) Log.v(TAG, "attach: " + this + " wrapper=" + wrapper);
8529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mDestroyed) {
8539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
8549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
8559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mIWallpaperEngine = wrapper;
8579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mCaller = wrapper.mCaller;
8589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mConnection = wrapper.mConnection;
8599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mWindowToken = wrapper.mWindowToken;
8609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mSurfaceHolder.setSizeFromLayout();
8619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mInitializing = true;
8629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mSession = WindowManagerGlobal.getWindowSession();
8639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mWindow.setSession(mSession);
865228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
866228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mLayout.packageName = getPackageName();
867228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mDisplayManager = (DisplayManager)getSystemService(Context.DISPLAY_SERVICE);
8699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mDisplayManager.registerDisplayListener(mDisplayListener, mCaller.getHandler());
87061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            mDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
87161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            mDisplayState = mDisplay.getState();
87261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
873a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala            if (DEBUG) Log.v(TAG, "onCreate(): " + this);
8749e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            onCreate(mSurfaceHolder);
875ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
876228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mInitializing = false;
877228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mReportedVisible = false;
8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            updateSurface(false, false, false);
8793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        }
8803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
881228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        void doDesiredSizeChanged(int desiredWidth, int desiredHeight) {
8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (!mDestroyed) {
8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                if (DEBUG) Log.v(TAG, "onDesiredSizeChanged("
8849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        + desiredWidth + "," + desiredHeight + "): " + this);
8859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mIWallpaperEngine.mReqWidth = desiredWidth;
8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mIWallpaperEngine.mReqHeight = desiredHeight;
8879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                onDesiredSizeChanged(desiredWidth, desiredHeight);
8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                doOffsetsChanged(true);
8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
8909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
891228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void doDisplayPaddingChanged(Rect padding) {
8939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (!mDestroyed) {
8949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                if (DEBUG) Log.v(TAG, "onDisplayPaddingChanged(" + padding + "): " + this);
8959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                if (!mIWallpaperEngine.mDisplayPadding.equals(padding)) {
8969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    mIWallpaperEngine.mDisplayPadding.set(padding);
8979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    updateSurface(true, false, false);
8989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                }
8999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
9009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
9019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void doVisibilityChanged(boolean visible) {
9039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (!mDestroyed) {
9049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mVisible = visible;
9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                reportVisibility();
9069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
907228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
90861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
90961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        void reportVisibility() {
91061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            if (!mDestroyed) {
911a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                mDisplayState = mDisplay == null ? Display.STATE_UNKNOWN : mDisplay.getState();
912ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                boolean visible = mVisible && mDisplayState != Display.STATE_OFF;
9138da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong                if (mReportedVisible != visible) {
9143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    mReportedVisible = visible;
9153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + visible
9168da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong                            + "): " + this);
9178da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong                    if (visible) {
9188da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong                        // If becoming visible, in preview mode the surface
9198da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong                        // may have been destroyed so now we need to make
9208da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong                        // sure it is re-created.
921228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        doOffsetsChanged(false);
9228da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong                        updateSurface(false, false, false);
923228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    }
92461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    onVisibilityChanged(visible);
92561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                }
92661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            }
927a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala        }
928ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
9293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        void doOffsetsChanged(boolean always) {
9303a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            if (mDestroyed) {
93130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                return;
93230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
93330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (!always && !mOffsetsChanged) {
9359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
9369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
9379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            float xOffset;
9399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            float yOffset;
9409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            float xOffsetStep;
9419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            float yOffsetStep;
9429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            boolean sync;
9439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            synchronized (mLock) {
94478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                xOffset = mPendingXOffset;
94578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                yOffset = mPendingYOffset;
94678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                xOffsetStep = mPendingXOffsetStep;
94778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                yOffsetStep = mPendingYOffsetStep;
94878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                sync = mPendingSync;
94978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mPendingSync = false;
95078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mOffsetMessageEnqueued = false;
95130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
95230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            if (mSurfaceCreated) {
95430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                if (mReportedVisible) {
95530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Offsets change in " + this
95630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                            + ": " + xOffset + "," + yOffset);
95730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    final int availw = mIWallpaperEngine.mReqWidth-mCurWidth;
95830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    final int xPixels = availw > 0 ? -(int)(availw*xOffset+.5f) : 0;
95930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    final int availh = mIWallpaperEngine.mReqHeight-mCurHeight;
96030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    final int yPixels = availh > 0 ? -(int)(availh*yOffset+.5f) : 0;
96130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixels, yPixels);
96230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                } else {
96330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    mOffsetsChanged = true;
96430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                }
96530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
96630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
96730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            if (sync) {
96830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                try {
96930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Reporting offsets change complete");
97078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                    mSession.wallpaperOffsetsComplete(mWindow.asBinder());
97130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                } catch (RemoteException e) {
97230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                }
97330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
97478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        }
97578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
97678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        void doCommand(WallpaperCommand cmd) {
97730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            Bundle result;
97878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            if (!mDestroyed) {
97978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                result = onCommand(cmd.action, cmd.x, cmd.y, cmd.z,
98030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                        cmd.extras, cmd.sync);
98178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            } else {
9829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                result = null;
98361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            }
98461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            if (cmd.sync) {
98561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                try {
986a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Reporting command complete");
987ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                    mSession.wallpaperCommandComplete(mWindow.asBinder(), result);
9883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                } catch (RemoteException e) {
9893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                }
9903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            }
991174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
992174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
993174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        void reportSurfaceDestroyed() {
994174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            if (mSurfaceCreated) {
995174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                mSurfaceCreated = false;
996174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                mSurfaceHolder.ungetCallbacks();
997174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
998174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (callbacks != null) {
999174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    for (SurfaceHolder.Callback c : callbacks) {
10006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                        c.surfaceDestroyed(mSurfaceHolder);
100161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    }
100261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                }
100361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                if (DEBUG) Log.v(TAG, "onSurfaceDestroyed("
1004a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                        + mSurfaceHolder + "): " + this);
1005ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                onSurfaceDestroyed(mSurfaceHolder);
10063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            }
10073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala        }
10083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1009174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        void detach() {
1010174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            if (mDestroyed) {
1011174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                return;
1012174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            }
1013174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1014174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            mDestroyed = true;
1015174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1016174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            if (mDisplayManager != null) {
10176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                mDisplayManager.unregisterDisplayListener(mDisplayListener);
101861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            }
101961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
102061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala            if (mVisible) {
1021a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                mVisible = false;
1022ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                if (DEBUG) Log.v(TAG, "onVisibilityChanged(false): " + this);
1023d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                onVisibilityChanged(false);
10243a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            }
1025d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1026228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            reportSurfaceDestroyed();
1027228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
10283a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            if (DEBUG) Log.v(TAG, "onDestroy(): " + this);
1029d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            onDestroy();
1030d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1031d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (mCreated) {
1032d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                try {
1033d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Removing window and destroying surface "
1034d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                            + mSurfaceHolder.getSurface() + " of: " + this);
1035d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1036d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    if (mInputEventReceiver != null) {
1037d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        mInputEventReceiver.dispose();
1038d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        mInputEventReceiver = null;
1039d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    }
1040d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1041d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    mSession.remove(mWindow);
1042d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                } catch (RemoteException e) {
1043d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                }
1044d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mSurfaceHolder.mSurface.release();
10458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                mCreated = false;
1046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1047228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                // Dispose the input channel after removing the window so the Window Manager
1048228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                // doesn't interpret the input channel being closed as an abnormal termination.
1049228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                if (mInputChannel != null) {
1050228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mInputChannel.dispose();
1051228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    mInputChannel = null;
1052228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                }
10538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
1054cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        }
1055228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
10564ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        private final DisplayListener mDisplayListener = new DisplayListener() {
1057228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            @Override
1058228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            public void onDisplayChanged(int displayId) {
10594ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                if (mDisplay.getDisplayId() == displayId) {
10604ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                    reportVisibility();
1061d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                }
1062d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
1063228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1064228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            @Override
1065228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            public void onDisplayRemoved(int displayId) {
1066228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
1067228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1068228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            @Override
1069228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            public void onDisplayAdded(int displayId) {
1070228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
1071228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        };
1072cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
1073cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
1074228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    class IWallpaperEngineWrapper extends IWallpaperEngine.Stub
1075228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            implements HandlerCaller.Callback {
1076228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        private final HandlerCaller mCaller;
1077228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1078228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        final IWallpaperConnection mConnection;
1079cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        final IBinder mWindowToken;
1080cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        final int mWindowType;
1081228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        final boolean mIsPreview;
1082228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        boolean mShownReported;
1083228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int mReqWidth;
1084228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int mReqHeight;
1085228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        final Rect mDisplayPadding = new Rect();
1086cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
1087cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        Engine mEngine;
1088228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1089228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        IWallpaperEngineWrapper(WallpaperService context,
1090228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                IWallpaperConnection conn, IBinder windowToken,
1091228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding) {
1092228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCaller = new HandlerCaller(context, context.getMainLooper(), this, true);
1093cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mConnection = conn;
1094cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mWindowToken = windowToken;
1095228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mWindowType = windowType;
1096228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mIsPreview = isPreview;
1097228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mReqWidth = reqWidth;
1098d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mReqHeight = reqHeight;
1099d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mDisplayPadding.set(padding);
1100d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1101d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            Message msg = mCaller.obtainMessage(DO_ATTACH);
1102d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaller.sendMessage(msg);
1103d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
1105be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        public void setDesiredSize(int width, int height) {
1106be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            Message msg = mCaller.obtainMessageII(DO_SET_DESIRED_SIZE, width, height);
1107be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mCaller.sendMessage(msg);
1108be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1109be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        public void setDisplayPadding(Rect padding) {
1111cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            Message msg = mCaller.obtainMessageO(DO_SET_DISPLAY_PADDING, padding);
1112cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mCaller.sendMessage(msg);
1113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1115d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        public void setVisibility(boolean visible) {
1116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED,
1117d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    visible ? 1 : 0);
1118228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCaller.sendMessage(msg);
1119cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        }
1120d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1121d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        public void dispatchPointer(MotionEvent event) {
1122d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (mEngine != null) {
1123d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mEngine.dispatchPointer(event);
1124d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            } else {
1125d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                event.recycle();
1126d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
11279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1128d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1129d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        public void dispatchWallpaperCommand(String action, int x, int y,
1130d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                int z, Bundle extras) {
1131d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (mEngine != null) {
1132d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mEngine.mWindow.dispatchWallpaperCommand(action, x, y, z, extras, false);
1133d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
1134d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1135d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1136228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        public void reportShown() {
1137d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (!mShownReported) {
1138228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                mShownReported = true;
1139228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                try {
11408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    mConnection.engineShown(this);
11418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                } catch (RemoteException e) {
11428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    Log.w(TAG, "Wallpaper host disappeared", e);
11438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    return;
11448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                }
1145d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
1146d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1147228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1148d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        public void destroy() {
1149d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            Message msg = mCaller.obtainMessage(DO_DETACH);
1150d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaller.sendMessage(msg);
1151d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1152d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1153d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        public void executeMessage(Message message) {
1154d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            switch (message.what) {
1155d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                case DO_ATTACH: {
115661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    try {
115761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                        mConnection.attachEngine(this);
115861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala                    } catch (RemoteException e) {
1159a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala                        Log.w(TAG, "Wallpaper host disappeared", e);
11609e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                        return;
1161ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala                    }
11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    Engine engine = onCreateEngine();
11633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    mEngine = engine;
11643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    mActiveEngines.add(engine);
11653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala                    engine.attach(this);
11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    return;
11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                case DO_DETACH: {
11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    mActiveEngines.remove(mEngine);
11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    mEngine.detach();
11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    return;
11726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                case DO_SET_DESIRED_SIZE: {
11746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    mEngine.doDesiredSizeChanged(message.arg1, message.arg2);
11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    return;
11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                case DO_SET_DISPLAY_PADDING: {
11786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    mEngine.doDisplayPaddingChanged((Rect) message.obj);
11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                case MSG_UPDATE_SURFACE:
1181836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mEngine.updateSurface(true, false, false);
1182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    break;
1183228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                case MSG_VISIBILITY_CHANGED:
11846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    if (DEBUG) Log.v(TAG, "Visibility change in " + mEngine
11859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                            + ": " + message.arg1);
11869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    mEngine.doVisibilityChanged(message.arg1 != 0);
1187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    break;
11889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                case MSG_WALLPAPER_OFFSETS: {
11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    mEngine.doOffsetsChanged(true);
11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                } break;
1191cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                case MSG_WALLPAPER_COMMAND: {
11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    WallpaperCommand cmd = (WallpaperCommand)message.obj;
11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    mEngine.doCommand(cmd);
11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                } break;
11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                case MSG_WINDOW_RESIZED: {
11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    final boolean reportDraw = message.arg1 != 0;
11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    mEngine.mOutsets.set((Rect) message.obj);
11986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    mEngine.updateSurface(true, false, reportDraw);
11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    mEngine.doOffsetsChanged(true);
12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                } break;
12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                case MSG_WINDOW_MOVED: {
12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    // Do nothing. What does it mean for a Wallpaper to move?
12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                } break;
12046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                case MSG_TOUCH_EVENT: {
120511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    boolean skip = false;
120611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    MotionEvent ev = (MotionEvent)message.obj;
12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    if (ev.getAction() == MotionEvent.ACTION_MOVE) {
120811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                        synchronized (mEngine.mLock) {
1209836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                            if (mEngine.mPendingMove == ev) {
1210836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                                mEngine.mPendingMove = null;
12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            } else {
1212cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                                // this is not the motion event we are looking for....
12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                                skip = true;
12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            }
12156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        }
121611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    }
12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    if (!skip) {
121811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                        if (DEBUG) Log.v(TAG, "Delivering touch event: " + ev);
12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        mEngine.onTouchEvent(ev);
12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    }
12216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    ev.recycle();
12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                } break;
12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                default :
122411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    Log.w(TAG, "Unknown message type " + message.what);
12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
122711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    }
12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /**
12306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala     * Implements the internal {@link IWallpaperService} interface to convert
12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala     * incoming calls to it back to calls on an {@link WallpaperService}.
1232836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala     */
1233228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    class IWallpaperServiceWrapper extends IWallpaperService.Stub {
12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        private final WallpaperService mTarget;
12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        public IWallpaperServiceWrapper(WallpaperService context) {
12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            mTarget = context;
1238cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        }
12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        @Override
12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        public void attach(IWallpaperConnection conn, IBinder windowToken,
12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding) {
12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            new IWallpaperEngineWrapper(mTarget, conn, windowToken,
12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    windowType, isPreview, reqWidth, reqHeight, padding);
12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    @Override
12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    public void onCreate() {
12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        super.onCreate();
12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    @Override
12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    public void onDestroy() {
1255836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        super.onDestroy();
1256cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        for (int i=0; i<mActiveEngines.size(); i++) {
12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            mActiveEngines.get(i).detach();
12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        mActiveEngines.clear();
12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /**
12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala     * Implement to return the implementation of the internal accessibility
12646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala     * service interface.  Subclasses should not override.
12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala     */
126611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    @Override
126711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    public final IBinder onBind(Intent intent) {
12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return new IWallpaperServiceWrapper(this);
12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /**
12726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala     * Must be implemented to return a new instance of the wallpaper's engine.
12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala     * Note that multiple instances may be active at the same time, such as
1274836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala     * when the wallpaper is currently set as the active wallpaper and the user
1275836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala     * is in the wallpaper picker viewing a preview of it as well.
1276cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     */
12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    public abstract Engine onCreateEngine();
12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    @Override
12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    protected void dump(FileDescriptor fd, PrintWriter out, String[] args) {
12816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        out.print("State of wallpaper "); out.print(this); out.println(":");
12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (int i=0; i<mActiveEngines.size(); i++) {
12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Engine engine = mActiveEngines.get(i);
12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            out.print("  Engine "); out.print(engine); out.println(":");
12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            engine.dump("    ", fd, out, args);
12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala