18cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn/*
28cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * Copyright (C) 2009 The Android Open Source Project
38cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn *
48cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
58cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * you may not use this file except in compliance with the License.
68cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * You may obtain a copy of the License at
78cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn *
88cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
98cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn *
108cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * Unless required by applicable law or agreed to in writing, software
118cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
128cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * See the License for the specific language governing permissions and
148cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * limitations under the License.
158cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn */
168cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
178cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornpackage android.service.wallpaper;
188cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
19067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.content.res.TypedArray;
204544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynskiimport android.graphics.Canvas;
21067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.view.WindowInsets;
223d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
23067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport com.android.internal.R;
248cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport com.android.internal.os.HandlerCaller;
25a0938021718867edd267d4905f3c17ef2944aa65Griff Hazenimport com.android.internal.util.ScreenShapeHelper;
264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport com.android.internal.view.BaseIWindow;
274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport com.android.internal.view.BaseSurfaceHolder;
288cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
29d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.annotation.SdkConstant;
30d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.annotation.SdkConstant.SdkConstantType;
318cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.app.Service;
32759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackbornimport android.app.WallpaperManager;
33bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackbornimport android.content.Context;
348cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.content.Intent;
35e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackbornimport android.content.res.Configuration;
3662bf4a0283e855e2fb5f40f36909501e5b4a09ebMathias Agopianimport android.graphics.PixelFormat;
374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.graphics.Rect;
383d110b239153a6c7423a99f02ef859201205eee2Jeff Brownimport android.hardware.display.DisplayManager;
393d110b239153a6c7423a99f02ef859201205eee2Jeff Brownimport android.hardware.display.DisplayManager.DisplayListener;
407580493b014a2c7ea883cd291255798dc72ebbffDianne Hackbornimport android.os.Bundle;
418cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.os.IBinder;
4219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackbornimport android.os.Looper;
438cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.os.Message;
448cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.os.RemoteException;
458cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.util.Log;
466881a10557acf3b0270de54799d6f19437acf584Craig Mautnerimport android.view.Display;
474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.Gravity;
484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.IWindowSession;
4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel;
50c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownimport android.view.InputDevice;
514952dfd16a0f839559ffa78f5016394caf85294fJeff Brownimport android.view.InputEvent;
5232cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brownimport android.view.InputEventReceiver;
538df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackbornimport android.view.MotionEvent;
544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.SurfaceHolder;
554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.View;
5672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackbornimport android.view.ViewGroup;
574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManager;
58526505da256a9af8542e592c566bd87334d075e6Jorim Jaggiimport android.view.WindowManager.LayoutParams;
5998365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.WindowManagerGlobal;
608cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
61527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackbornimport java.io.FileDescriptor;
62527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackbornimport java.io.PrintWriter;
63af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackbornimport java.util.ArrayList;
64af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn
658cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn/**
668cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * A wallpaper service is responsible for showing a live wallpaper behind
6723ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * applications that would like to sit on top of it.  This service object
6823ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * itself does very little -- its only purpose is to generate instances of
69e4260f4e7da4da32bfab2737018cf9cf75215894Dianne Hackborn * {@link Engine} as needed.  Implementing a wallpaper thus
7023ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * involves subclassing from this, subclassing an Engine implementation,
7123ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * and implementing {@link #onCreateEngine()} to return a new instance of
7223ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * your engine.
738cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn */
748cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornpublic abstract class WallpaperService extends Service {
758cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    /**
768cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn     * The {@link Intent} that must be declared as handled by the service.
77d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * To be supported, the service must also require the
78d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * {@link android.Manifest.permission#BIND_WALLPAPER} permission so
79d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn     * that other applications can not abuse it.
808cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn     */
81d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn    @SdkConstant(SdkConstantType.SERVICE_ACTION)
828cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    public static final String SERVICE_INTERFACE =
83d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn            "android.service.wallpaper.WallpaperService";
848cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
85eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
86eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Name under which a WallpaperService component publishes information
87eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * about itself.  This meta-data must reference an XML resource containing
88eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * a <code>&lt;{@link android.R.styleable#Wallpaper wallpaper}&gt;</code>
89eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * tag.
90eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
91eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public static final String SERVICE_META_DATA = "android.service.wallpaper";
92b1ef36965bf17e791afd16a9a34bcbb32f495f68Craig Mautner
934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    static final String TAG = "WallpaperService";
9472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn    static final boolean DEBUG = false;
954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    private static final int DO_ATTACH = 10;
974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    private static final int DO_DETACH = 20;
98284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn    private static final int DO_SET_DESIRED_SIZE = 30;
99067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    private static final int DO_SET_DISPLAY_PADDING = 40;
100067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
1014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    private static final int MSG_UPDATE_SURFACE = 10000;
102759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    private static final int MSG_VISIBILITY_CHANGED = 10010;
10372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn    private static final int MSG_WALLPAPER_OFFSETS = 10020;
1047580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    private static final int MSG_WALLPAPER_COMMAND = 10025;
1057341d7a104b47996445d069a695e155a07184606Dianne Hackborn    private static final int MSG_WINDOW_RESIZED = 10030;
1065702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner    private static final int MSG_WINDOW_MOVED = 10035;
1078df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    private static final int MSG_TOUCH_EVENT = 10040;
1084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
109af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn    private final ArrayList<Engine> mActiveEngines
110af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn            = new ArrayList<Engine>();
11119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn
1127580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    static final class WallpaperCommand {
1137580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        String action;
1147580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        int x;
1157580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        int y;
1167580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        int z;
1177580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        Bundle extras;
1187580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        boolean sync;
1197580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    }
1207580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn
1218cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    /**
1224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     * The actual implementation of a wallpaper.  A wallpaper service may
1234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     * have multiple instances running (for example as a real wallpaper
1244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     * and as a preview), each of which is represented by its own Engine
125759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn     * instance.  You must implement {@link WallpaperService#onCreateEngine()}
126759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn     * to return your concrete Engine implementation.
1278cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn     */
1284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public class Engine {
1294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperEngineWrapper mIWallpaperEngine;
1304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Copies from mIWallpaperEngine.
1324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        HandlerCaller mCaller;
1334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperConnection mConnection;
1344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IBinder mWindowToken;
1354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        boolean mInitializing = true;
137284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        boolean mVisible;
138bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        boolean mReportedVisible;
139284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        boolean mDestroyed;
1404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Current window state.
1424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        boolean mCreated;
14318ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn        boolean mSurfaceCreated;
1444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        boolean mIsCreating;
1454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        boolean mDrawingAllowed;
1469e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn        boolean mOffsetsChanged;
14735be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        boolean mFixedSizeAllowed;
1484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int mWidth;
1494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int mHeight;
1504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int mFormat;
1514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int mType;
15272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        int mCurWidth;
15372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        int mCurHeight;
1548df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        int mWindowFlags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
155a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase        int mWindowPrivateFlags =
156a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                WindowManager.LayoutParams.PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS;
1578df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        int mCurWindowFlags = mWindowFlags;
158a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase        int mCurWindowPrivateFlags = mWindowPrivateFlags;
1594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final Rect mVisibleInsets = new Rect();
1604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final Rect mWinFrame = new Rect();
161c4aad01cbbb69c916ef323693e1fd0560b0eccbaDianne Hackborn        final Rect mOverscanInsets = new Rect();
1624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final Rect mContentInsets = new Rect();
163fa10423fa00f3495e451016acba9b6848eb995c9Adrian Roos        final Rect mStableInsets = new Rect();
1642217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski        final Rect mOutsets = new Rect();
165067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        final Rect mDispatchedOverscanInsets = new Rect();
166067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        final Rect mDispatchedContentInsets = new Rect();
167067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        final Rect mDispatchedStableInsets = new Rect();
1682217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski        final Rect mDispatchedOutsets = new Rect();
169067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        final Rect mFinalSystemInsets = new Rect();
170067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        final Rect mFinalStableInsets = new Rect();
1712e95a488e0a12d4263d101e888fdd89fd123aec3Jorim Jaggi        final Rect mBackdropFrame = new Rect();
172694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        final Configuration mConfiguration = new Configuration();
173067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
1744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final WindowManager.LayoutParams mLayout
1754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                = new WindowManager.LayoutParams();
1764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWindowSession mSession;
17746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        InputChannel mInputChannel;
1788cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
17972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        final Object mLock = new Object();
18072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        boolean mOffsetMessageEnqueued;
18172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        float mPendingXOffset;
18272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        float mPendingYOffset;
183bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float mPendingXOffsetStep;
184bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float mPendingYOffsetStep;
18519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        boolean mPendingSync;
1868df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        MotionEvent mPendingMove;
1873d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
1883d110b239153a6c7423a99f02ef859201205eee2Jeff Brown        DisplayManager mDisplayManager;
1893d110b239153a6c7423a99f02ef859201205eee2Jeff Brown        Display mDisplay;
1904544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski        private int mDisplayState;
1913d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
1924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() {
19362bf4a0283e855e2fb5f40f36909501e5b4a09ebMathias Agopian            {
19424572375323dee79e3b456af07640ca194fd40bfJeff Brown                mRequestedFormat = PixelFormat.RGBX_8888;
19562bf4a0283e855e2fb5f40f36909501e5b4a09ebMathias Agopian            }
1964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            @Override
1984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            public boolean onAllowLockCanvas() {
1994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                return mDrawingAllowed;
2004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
2024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            @Override
2034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            public void onRelayoutContainer() {
2044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE);
2054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mCaller.sendMessage(msg);
2064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2074c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
2084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            @Override
2094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            public void onUpdateSurface() {
2104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE);
2114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mCaller.sendMessage(msg);
2124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2138cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
2144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            public boolean isCreating() {
2154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                return mIsCreating;
2164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
218a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn            @Override
219a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn            public void setFixedSize(int width, int height) {
22035be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey                if (!mFixedSizeAllowed) {
221a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn                    // Regular apps can't do this.  It can only work for
222a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn                    // certain designs of window animations, so you can't
223a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn                    // rely on it.
224a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn                    throw new UnsupportedOperationException(
225a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn                            "Wallpapers currently only support sizing from layout");
226a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn                }
227b8f939fb5759fc25fced8df3304d6288b0c25430Michael Jurka                super.setFixedSize(width, height);
228a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn            }
229a48a37f025dd875bfb1e46b673a3a54fb8e6b26bDianne Hackborn
2304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            public void setKeepScreenOn(boolean screenOn) {
231284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                throw new UnsupportedOperationException(
232284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        "Wallpapers do not support keep screen on");
2334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
2344544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski
2354544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski            @Override
2364544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski            public Canvas lockCanvas() {
2374544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                if (mDisplayState == Display.STATE_DOZE
2384544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                        || mDisplayState == Display.STATE_DOZE_SUSPEND) {
2394544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                    try {
2404544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                        mSession.pokeDrawLock(mWindow);
2414544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                    } catch (RemoteException e) {
2424544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                        // System server died, can be ignored.
2434544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                    }
2444544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                }
2454544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                return super.lockCanvas();
2464544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski            }
2474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        };
24832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown
24932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        final class WallpaperInputEventReceiver extends InputEventReceiver {
25032cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            public WallpaperInputEventReceiver(InputChannel inputChannel, Looper looper) {
25132cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                super(inputChannel, looper);
25232cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            }
25332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown
25446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            @Override
25532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            public void onInputEvent(InputEvent event) {
2563915bb845b032dc184dba5e60970b803390ca3edJeff Brown                boolean handled = false;
25746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                try {
2584952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                    if (event instanceof MotionEvent
2594952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                            && (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
26032cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                        MotionEvent dup = MotionEvent.obtainNoHistory((MotionEvent)event);
26132cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                        dispatchPointer(dup);
2623915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        handled = true;
263c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    }
26446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                } finally {
26532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                    finishInputEvent(event, handled);
26646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
26746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
26832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        }
26932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        WallpaperInputEventReceiver mInputEventReceiver;
27032cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown
2714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final BaseIWindow mWindow = new BaseIWindow() {
2728df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn            @Override
273c4aad01cbbb69c916ef323693e1fd0560b0eccbaDianne Hackborn            public void resized(Rect frame, Rect overscanInsets, Rect contentInsets,
2742217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                    Rect visibleInsets, Rect stableInsets, Rect outsets, boolean reportDraw,
2750ffd49cbe0ab4c13fd5528abacade898a8cff481Jorim Jaggi                    Configuration newConfig, Rect backDropRect, boolean forceLayout,
2760ffd49cbe0ab4c13fd5528abacade898a8cff481Jorim Jaggi                    boolean alwaysConsumeNavBar) {
27703850591954faf5280fd581dd04cd6958eda0124Filip Gruszczynski                Message msg = mCaller.obtainMessageIO(MSG_WINDOW_RESIZED,
27803850591954faf5280fd581dd04cd6958eda0124Filip Gruszczynski                        reportDraw ? 1 : 0, outsets);
2797341d7a104b47996445d069a695e155a07184606Dianne Hackborn                mCaller.sendMessage(msg);
2807341d7a104b47996445d069a695e155a07184606Dianne Hackborn            }
2815702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner
2825702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner            @Override
2835702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner            public void moved(int newX, int newY) {
2845702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner                Message msg = mCaller.obtainMessageII(MSG_WINDOW_MOVED, newX, newY);
2855702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner                mCaller.sendMessage(msg);
2865702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner            }
2875702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner
2888df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn            @Override
289759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            public void dispatchAppVisibility(boolean visible) {
290284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                // We don't do this in preview mode; we'll let the preview
291284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                // activity tell us when to run.
292284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (!mIWallpaperEngine.mIsPreview) {
293284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED,
294284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                            visible ? 1 : 0);
295284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    mCaller.sendMessage(msg);
296284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
297759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            }
29872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn
29972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            @Override
300bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
301bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                    boolean sync) {
30272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                synchronized (mLock) {
30319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    if (DEBUG) Log.v(TAG, "Dispatch wallpaper offsets: " + x + ", " + y);
30472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                    mPendingXOffset = x;
30572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                    mPendingYOffset = y;
306bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                    mPendingXOffsetStep = xStep;
307bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                    mPendingYOffsetStep = yStep;
30819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    if (sync) {
30919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                        mPendingSync = true;
31019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    }
31172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                    if (!mOffsetMessageEnqueued) {
31272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                        mOffsetMessageEnqueued = true;
31372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                        Message msg = mCaller.obtainMessage(MSG_WALLPAPER_OFFSETS);
31472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                        mCaller.sendMessage(msg);
31572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                    }
31672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                }
31772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            }
3185702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner
3195702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner            @Override
3207580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            public void dispatchWallpaperCommand(String action, int x, int y,
3217580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    int z, Bundle extras, boolean sync) {
3227580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                synchronized (mLock) {
3237580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    if (DEBUG) Log.v(TAG, "Dispatch wallpaper command: " + x + ", " + y);
3247580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    WallpaperCommand cmd = new WallpaperCommand();
3257580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    cmd.action = action;
3267580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    cmd.x = x;
3277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    cmd.y = y;
3287580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    cmd.z = z;
3297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    cmd.extras = extras;
3307580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    cmd.sync = sync;
3317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    Message msg = mCaller.obtainMessage(MSG_WALLPAPER_COMMAND);
3327580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    msg.obj = cmd;
3337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mCaller.sendMessage(msg);
3347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
3357580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
3364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        };
3374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
338759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        /**
339759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * Provides access to the surface in which this wallpaper is drawn.
340759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         */
341759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        public SurfaceHolder getSurfaceHolder() {
342759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            return mSurfaceHolder;
343759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        }
344759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn
345759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        /**
346759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * Convenience for {@link WallpaperManager#getDesiredMinimumWidth()
347759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * WallpaperManager.getDesiredMinimumWidth()}, returning the width
348759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * that the system would like this wallpaper to run in.
349759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         */
350759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        public int getDesiredMinimumWidth() {
351759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            return mIWallpaperEngine.mReqWidth;
352759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        }
353759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn
354759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        /**
355759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * Convenience for {@link WallpaperManager#getDesiredMinimumHeight()
356759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * WallpaperManager.getDesiredMinimumHeight()}, returning the height
357759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * that the system would like this wallpaper to run in.
358759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         */
359759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        public int getDesiredMinimumHeight() {
360759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            return mIWallpaperEngine.mReqHeight;
361759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        }
362759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn
363759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        /**
364284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn         * Return whether the wallpaper is currently visible to the user,
365284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn         * this is the last value supplied to
366284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn         * {@link #onVisibilityChanged(boolean)}.
367284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn         */
368284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        public boolean isVisible() {
369bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn            return mReportedVisible;
370284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
371284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn
372284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        /**
3733be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn         * Returns true if this engine is running in preview mode -- that is,
3743be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn         * it is being shown to the user before they select it as the actual
3753be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn         * wallpaper.
3763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn         */
3773be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn        public boolean isPreview() {
3783be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            return mIWallpaperEngine.mIsPreview;
3793be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn        }
3803be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn
3813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn        /**
3828df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         * Control whether this wallpaper will receive raw touch events
3838df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         * from the window manager as the user interacts with the window
3848df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         * that is currently displaying the wallpaper.  By default they
3858df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         * are turned off.  If enabled, the events will be received in
3868df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         * {@link #onTouchEvent(MotionEvent)}.
3878df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         */
3888df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        public void setTouchEventsEnabled(boolean enabled) {
3898df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn            mWindowFlags = enabled
3908df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                    ? (mWindowFlags&~WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
3918df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                    : (mWindowFlags|WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
3928df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn            if (mCreated) {
393d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                updateSurface(false, false, false);
3948df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn            }
3958df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        }
396a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase
397a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase        /**
398a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase         * Control whether this wallpaper will receive notifications when the wallpaper
399a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase         * has been scrolled. By default, wallpapers will receive notifications, although
400a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase         * the default static image wallpapers do not. It is a performance optimization to
401a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase         * set this to false.
402a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase         *
403a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase         * @param enabled whether the wallpaper wants to receive offset notifications
404a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase         */
405a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase        public void setOffsetNotificationsEnabled(boolean enabled) {
406a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase            mWindowPrivateFlags = enabled
407a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    ? (mWindowPrivateFlags |
408a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                        WindowManager.LayoutParams.PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS)
409a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    : (mWindowPrivateFlags &
410a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                        ~WindowManager.LayoutParams.PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS);
411a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase            if (mCreated) {
412a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                updateSurface(false, false, false);
413a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase            }
414a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase        }
41535be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey
41635be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        /** {@hide} */
41735be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        public void setFixedSizeAllowed(boolean allowed) {
41835be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey            mFixedSizeAllowed = allowed;
41935be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey        }
42035be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey
4218df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        /**
422759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * Called once to initialize the engine.  After returning, the
423759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * engine's surface will be created by the framework.
424759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         */
425759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        public void onCreate(SurfaceHolder surfaceHolder) {
4264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
427067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
428759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        /**
429759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * Called right before the engine is going away.  After this the
430759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * surface will be destroyed and this Engine object is no longer
431759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * valid.
432759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         */
433759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        public void onDestroy() {
4344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
435067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
436759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        /**
437759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * Called to inform you of the wallpaper becoming visible or
438759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * hidden.  <em>It is very important that a wallpaper only use
439759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * CPU while it is visible.</em>.
440759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         */
441759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        public void onVisibilityChanged(boolean visible) {
442759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        }
443067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
444067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        /**
445067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn         * Called with the current insets that are in effect for the wallpaper.
446067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn         * This gives you the part of the overall wallpaper surface that will
447067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn         * generally be visible to the user (ignoring position offsets applied to it).
448067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn         *
449067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn         * @param insets Insets to apply.
450067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn         */
451067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onApplyWindowInsets(WindowInsets insets) {
452067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
453067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
454759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        /**
4558df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         * Called as the user performs touch-screen interaction with the
4568df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         * window that is currently showing this wallpaper.  Note that the
4578df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         * events you receive here are driven by the actual application the
458ae87bd089aaa2f30b4e0d68fff25ea725a14aa9eMarco Nelissen         * user is interacting with, so if it is slow you will get fewer
4598df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         * move events.
4608df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn         */
4618df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        public void onTouchEvent(MotionEvent event) {
4628df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        }
463067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
4648df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        /**
46572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn         * Called to inform you of the wallpaper's offsets changing
46672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn         * within its contain, corresponding to the container's
46772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn         * call to {@link WallpaperManager#setWallpaperOffsets(IBinder, float, float)
46872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn         * WallpaperManager.setWallpaperOffsets()}.
46972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn         */
47072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        public void onOffsetsChanged(float xOffset, float yOffset,
471bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                float xOffsetStep, float yOffsetStep,
47272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                int xPixelOffset, int yPixelOffset) {
47372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        }
474067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
47572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        /**
4767580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * Process a command that was sent to the wallpaper with
47713bf8260134d516cbcc982d360d9f21067f47fa6Dianne Hackborn         * {@link WallpaperManager#sendWallpaperCommand}.
4787580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * The default implementation does nothing, and always returns null
4797580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * as the result.
4807580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         *
4817580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * @param action The name of the command to perform.  This tells you
4827580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * what to do and how to interpret the rest of the arguments.
4837580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * @param x Generic integer parameter.
4847580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * @param y Generic integer parameter.
4857580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * @param z Generic integer parameter.
4867580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * @param extras Any additional parameters.
4877580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * @param resultRequested If true, the caller is requesting that
4887580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * a result, appropriate for the command, be returned back.
4897580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * @return If returning a result, create a Bundle and place the
4907580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         * result data in to it.  Otherwise return null.
4917580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn         */
4927580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        public Bundle onCommand(String action, int x, int y, int z,
4937580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                Bundle extras, boolean resultRequested) {
4947580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            return null;
4957580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
496067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
4977580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        /**
498284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn         * Called when an application has changed the desired virtual size of
499284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn         * the wallpaper.
500284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn         */
501284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        public void onDesiredSizeChanged(int desiredWidth, int desiredHeight) {
502284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
503067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
504284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        /**
505759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * Convenience for {@link SurfaceHolder.Callback#surfaceChanged
506759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * SurfaceHolder.Callback.surfaceChanged()}.
507759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         */
5084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
5094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
5108cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
511759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        /**
5121d28f9c0aabee7f9e1c38451a4baf13109244c18Dianne Hackborn         * Convenience for {@link SurfaceHolder.Callback2#surfaceRedrawNeeded
513d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn         * SurfaceHolder.Callback.surfaceRedrawNeeded()}.
514d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn         */
515d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        public void onSurfaceRedrawNeeded(SurfaceHolder holder) {
516d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        }
517d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
518d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        /**
519759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * Convenience for {@link SurfaceHolder.Callback#surfaceCreated
520759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * SurfaceHolder.Callback.surfaceCreated()}.
521759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         */
5224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onSurfaceCreated(SurfaceHolder holder) {
5234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
5248cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
525759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        /**
526759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * Convenience for {@link SurfaceHolder.Callback#surfaceDestroyed
527759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         * SurfaceHolder.Callback.surfaceDestroyed()}.
528759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn         */
5294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void onSurfaceDestroyed(SurfaceHolder holder) {
5308cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        }
53100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
532527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn        protected void dump(String prefix, FileDescriptor fd, PrintWriter out, String[] args) {
533527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            out.print(prefix); out.print("mInitializing="); out.print(mInitializing);
534527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mDestroyed="); out.println(mDestroyed);
535527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            out.print(prefix); out.print("mVisible="); out.print(mVisible);
536527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mReportedVisible="); out.println(mReportedVisible);
5373d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            out.print(prefix); out.print("mDisplay="); out.println(mDisplay);
538527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            out.print(prefix); out.print("mCreated="); out.print(mCreated);
539527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mSurfaceCreated="); out.print(mSurfaceCreated);
540527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mIsCreating="); out.print(mIsCreating);
541527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mDrawingAllowed="); out.println(mDrawingAllowed);
542527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            out.print(prefix); out.print("mWidth="); out.print(mWidth);
543527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mCurWidth="); out.print(mCurWidth);
544527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mHeight="); out.print(mHeight);
545527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mCurHeight="); out.println(mCurHeight);
546527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            out.print(prefix); out.print("mType="); out.print(mType);
547527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mWindowFlags="); out.print(mWindowFlags);
548527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mCurWindowFlags="); out.println(mCurWindowFlags);
549d052a9416ae3f7e42fc1e7de0740021df385ee48Dianne Hackborn            out.print(prefix); out.print("mWindowPrivateFlags="); out.print(mWindowPrivateFlags);
550a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    out.print(" mCurWindowPrivateFlags="); out.println(mCurWindowPrivateFlags);
551527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            out.print(prefix); out.print("mVisibleInsets=");
552527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(mVisibleInsets.toShortString());
553527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mWinFrame="); out.print(mWinFrame.toShortString());
554527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(" mContentInsets="); out.println(mContentInsets.toShortString());
555527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            out.print(prefix); out.print("mConfiguration="); out.println(mConfiguration);
556527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            out.print(prefix); out.print("mLayout="); out.println(mLayout);
557527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            synchronized (mLock) {
558527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                out.print(prefix); out.print("mPendingXOffset="); out.print(mPendingXOffset);
559527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                        out.print(" mPendingXOffset="); out.println(mPendingXOffset);
560527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                out.print(prefix); out.print("mPendingXOffsetStep=");
561527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                        out.print(mPendingXOffsetStep);
562527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                        out.print(" mPendingXOffsetStep="); out.println(mPendingXOffsetStep);
563527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                out.print(prefix); out.print("mOffsetMessageEnqueued=");
564527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                        out.print(mOffsetMessageEnqueued);
565527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                        out.print(" mPendingSync="); out.println(mPendingSync);
566527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                if (mPendingMove != null) {
567527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                    out.print(prefix); out.print("mPendingMove="); out.println(mPendingMove);
568527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn                }
569527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            }
570527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn        }
571527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn
57200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        private void dispatchPointer(MotionEvent event) {
57333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            if (event.isTouchEvent()) {
57433bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                synchronized (mLock) {
57533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                    if (event.getAction() == MotionEvent.ACTION_MOVE) {
57633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                        mPendingMove = event;
57733bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                    } else {
57833bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                        mPendingMove = null;
57933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                    }
58000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                }
58133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                Message msg = mCaller.obtainMessageO(MSG_TOUCH_EVENT, event);
58233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                mCaller.sendMessage(msg);
58332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            } else {
58432cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                event.recycle();
58500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
58600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
5878cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
588d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn        void updateSurface(boolean forceRelayout, boolean forceReport, boolean redrawNeeded) {
589284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (mDestroyed) {
590284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                Log.w(TAG, "Ignoring updateSurface: destroyed");
591284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
592067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
593067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            boolean fixedSize = false;
5944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            int myWidth = mSurfaceHolder.getRequestedWidth();
595980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy            if (myWidth <= 0) myWidth = ViewGroup.LayoutParams.MATCH_PARENT;
596067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            else fixedSize = true;
5974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            int myHeight = mSurfaceHolder.getRequestedHeight();
598980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy            if (myHeight <= 0) myHeight = ViewGroup.LayoutParams.MATCH_PARENT;
599067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            else fixedSize = true;
600067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
6014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            final boolean creating = !mCreated;
60218ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            final boolean surfaceCreating = !mSurfaceCreated;
6034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            final boolean formatChanged = mFormat != mSurfaceHolder.getRequestedFormat();
6047341d7a104b47996445d069a695e155a07184606Dianne Hackborn            boolean sizeChanged = mWidth != myWidth || mHeight != myHeight;
605067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            boolean insetsChanged = !mCreated;
6064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            final boolean typeChanged = mType != mSurfaceHolder.getRequestedType();
607a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase            final boolean flagsChanged = mCurWindowFlags != mWindowFlags ||
608a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    mCurWindowPrivateFlags != mWindowPrivateFlags;
60918ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            if (forceRelayout || creating || surfaceCreating || formatChanged || sizeChanged
610bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    || typeChanged || flagsChanged || redrawNeeded
611bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    || !mIWallpaperEngine.mShownReported) {
6124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
613284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (DEBUG) Log.v(TAG, "Changes: creating=" + creating
6144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        + " format=" + formatChanged + " size=" + sizeChanged);
6154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
6164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                try {
6174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mWidth = myWidth;
6184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mHeight = myHeight;
6194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mFormat = mSurfaceHolder.getRequestedFormat();
6204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mType = mSurfaceHolder.getRequestedType();
6214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
6224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mLayout.x = 0;
6234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mLayout.y = 0;
6244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mLayout.width = myWidth;
6254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mLayout.height = myHeight;
6264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
6274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mLayout.format = mFormat;
6288df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
6298df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                    mCurWindowFlags = mWindowFlags;
6308df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                    mLayout.flags = mWindowFlags
6318df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                            | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
632526505da256a9af8542e592c566bd87334d075e6Jorim Jaggi                            | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
6338df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                            | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
634526505da256a9af8542e592c566bd87334d075e6Jorim Jaggi                            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
635a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    mCurWindowPrivateFlags = mWindowPrivateFlags;
636a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    mLayout.privateFlags = mWindowPrivateFlags;
6374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
6384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mLayout.memoryType = mType;
6394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mLayout.token = mWindowToken;
6404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
6414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    if (!mCreated) {
642d66ba06a8727fa27d1f4bcb867be17b5f576384cFilip Gruszczynski                        // Retrieve watch round info
643067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        TypedArray windowStyle = obtainStyledAttributes(
644067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                                com.android.internal.R.styleable.Window);
645067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        windowStyle.recycle();
646067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
647067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        // Add window
6483be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        mLayout.type = mIWallpaperEngine.mWindowType;
649aac0d4ed026d1cfbcf3fa81c6e4eb96f4347ca17Fabrice Di Meglio                        mLayout.gravity = Gravity.START|Gravity.TOP;
6500586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        mLayout.setTitle(WallpaperService.this.getClass().getName());
651284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        mLayout.windowAnimations =
652284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                                com.android.internal.R.style.Animation_Wallpaper;
65346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                        mInputChannel = new InputChannel();
6546881a10557acf3b0270de54799d6f19437acf584Craig Mautner                        if (mSession.addToDisplay(mWindow, mWindow.mSeq, mLayout, View.VISIBLE,
6550ec1328f85a08a610868856c688ebb8196c79c17Filip Gruszczynski                            Display.DEFAULT_DISPLAY, mContentInsets, mStableInsets, mOutsets,
65637d7a68de7e353c31a3a4736054cd86f0e002eafAdrian Roos                                mInputChannel) < 0) {
657d9463f50c8c1aa8969502b117777a4c185971c08Mattias Petersson                            Log.w(TAG, "Failed to add window while updating wallpaper surface.");
658d9463f50c8c1aa8969502b117777a4c185971c08Mattias Petersson                            return;
659d9463f50c8c1aa8969502b117777a4c185971c08Mattias Petersson                        }
66018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        mCreated = true;
66146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
66232cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                        mInputEventReceiver = new WallpaperInputEventReceiver(
66332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                                mInputChannel, Looper.myLooper());
6644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
6652217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski
6664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mSurfaceHolder.mSurfaceLock.lock();
6674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mDrawingAllowed = true;
6684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
669067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    if (!fixedSize) {
670067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mLayout.surfaceInsets.set(mIWallpaperEngine.mDisplayPadding);
6712217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                        mLayout.surfaceInsets.left += mOutsets.left;
6722217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                        mLayout.surfaceInsets.top += mOutsets.top;
6732217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                        mLayout.surfaceInsets.right += mOutsets.right;
6742217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                        mLayout.surfaceInsets.bottom += mOutsets.bottom;
675067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    } else {
676067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mLayout.surfaceInsets.set(0, 0, 0, 0);
677067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    }
6784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    final int relayoutResult = mSession.relayout(
6799a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                        mWindow, mWindow.mSeq, mLayout, mWidth, mHeight,
680c4aad01cbbb69c916ef323693e1fd0560b0eccbaDianne Hackborn                            View.VISIBLE, 0, mWinFrame, mOverscanInsets, mContentInsets,
6812e95a488e0a12d4263d101e888fdd89fd123aec3Jorim Jaggi                            mVisibleInsets, mStableInsets, mOutsets, mBackdropFrame,
6822e95a488e0a12d4263d101e888fdd89fd123aec3Jorim Jaggi                            mConfiguration, mSurfaceHolder.mSurface);
6834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
684284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface
6854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            + ", frame=" + mWinFrame);
6862217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski
6872ae3805efb920ee032535aad6599049e49525048Adrian Roos                    int w = mWinFrame.width();
6882ae3805efb920ee032535aad6599049e49525048Adrian Roos                    int h = mWinFrame.height();
689067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
690067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    if (!fixedSize) {
691067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        final Rect padding = mIWallpaperEngine.mDisplayPadding;
6922217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                        w += padding.left + padding.right + mOutsets.left + mOutsets.right;
6932217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                        h += padding.top + padding.bottom + mOutsets.top + mOutsets.bottom;
694067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mOverscanInsets.left += padding.left;
695067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mOverscanInsets.top += padding.top;
696067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mOverscanInsets.right += padding.right;
697067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mOverscanInsets.bottom += padding.bottom;
698067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mContentInsets.left += padding.left;
699067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mContentInsets.top += padding.top;
700067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mContentInsets.right += padding.right;
701067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mContentInsets.bottom += padding.bottom;
702067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mStableInsets.left += padding.left;
703067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mStableInsets.top += padding.top;
704067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mStableInsets.right += padding.right;
705067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        mStableInsets.bottom += padding.bottom;
706067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    }
707067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
7087341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    if (mCurWidth != w) {
7097341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        sizeChanged = true;
7107341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        mCurWidth = w;
7117341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    }
7127341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    if (mCurHeight != h) {
7137341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        sizeChanged = true;
7147341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        mCurHeight = h;
7157341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    }
71630bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown
7172217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                    if (DEBUG) {
7182217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                        Log.v(TAG, "Wallpaper size has changed: (" + mCurWidth + ", " + mCurHeight);
7192217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                    }
7202217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski
721067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    insetsChanged |= !mDispatchedOverscanInsets.equals(mOverscanInsets);
722067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    insetsChanged |= !mDispatchedContentInsets.equals(mContentInsets);
723067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    insetsChanged |= !mDispatchedStableInsets.equals(mStableInsets);
7242217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                    insetsChanged |= !mDispatchedOutsets.equals(mOutsets);
725067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
72630bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown                    mSurfaceHolder.setSurfaceFrameSize(w, h);
7274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mSurfaceHolder.mSurfaceLock.unlock();
7284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
72918ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                    if (!mSurfaceHolder.mSurface.isValid()) {
73018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        reportSurfaceDestroyed();
73118ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        if (DEBUG) Log.v(TAG, "Layout: Surface destroyed");
73218ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        return;
73318ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                    }
7349e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn
7359e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    boolean didSurface = false;
7369e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn
7374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    try {
738dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolder.ungetCallbacks();
7394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
74018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        if (surfaceCreating) {
7414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            mIsCreating = true;
7429e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            didSurface = true;
743284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                            if (DEBUG) Log.v(TAG, "onSurfaceCreated("
744284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                                    + mSurfaceHolder + "): " + this);
7454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            onSurfaceCreated(mSurfaceHolder);
746dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
7474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            if (callbacks != null) {
7484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                for (SurfaceHolder.Callback c : callbacks) {
7494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                    c.surfaceCreated(mSurfaceHolder);
7504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                }
7514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            }
7524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        }
753d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
75498365d7663cbd82979a5700faf0050220b01084dJeff Brown                        redrawNeeded |= creating || (relayoutResult
75598365d7663cbd82979a5700faf0050220b01084dJeff Brown                                & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0;
756d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
75718ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        if (forceReport || creating || surfaceCreating
75818ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                                || formatChanged || sizeChanged) {
759cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn                            if (DEBUG) {
760cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn                                RuntimeException e = new RuntimeException();
761cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn                                e.fillInStackTrace();
762cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn                                Log.w(TAG, "forceReport=" + forceReport + " creating=" + creating
763cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn                                        + " formatChanged=" + formatChanged
764cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn                                        + " sizeChanged=" + sizeChanged, e);
765cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn                            }
766284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                            if (DEBUG) Log.v(TAG, "onSurfaceChanged("
767284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                                    + mSurfaceHolder + ", " + mFormat
768284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                                    + ", " + mCurWidth + ", " + mCurHeight
769284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                                    + "): " + this);
7709e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            didSurface = true;
77172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                            onSurfaceChanged(mSurfaceHolder, mFormat,
77272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                                    mCurWidth, mCurHeight);
773dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
7744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            if (callbacks != null) {
7754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                for (SurfaceHolder.Callback c : callbacks) {
77672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                                    c.surfaceChanged(mSurfaceHolder, mFormat,
77772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                                            mCurWidth, mCurHeight);
7784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                                }
7794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            }
7804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        }
781d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
782067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        if (insetsChanged) {
783067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            mDispatchedOverscanInsets.set(mOverscanInsets);
7842217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                            mDispatchedOverscanInsets.left += mOutsets.left;
7852217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                            mDispatchedOverscanInsets.top += mOutsets.top;
7862217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                            mDispatchedOverscanInsets.right += mOutsets.right;
7872217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                            mDispatchedOverscanInsets.bottom += mOutsets.bottom;
788067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            mDispatchedContentInsets.set(mContentInsets);
789067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            mDispatchedStableInsets.set(mStableInsets);
7902217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                            mDispatchedOutsets.set(mOutsets);
791067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            mFinalSystemInsets.set(mDispatchedOverscanInsets);
792067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            mFinalStableInsets.set(mDispatchedStableInsets);
793067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            WindowInsets insets = new WindowInsets(mFinalSystemInsets,
79401f280d376218c5a007fc29f70b876375ad24204Adam Powell                                    null, mFinalStableInsets,
7950ffd49cbe0ab4c13fd5528abacade898a8cff481Jorim Jaggi                                    getResources().getConfiguration().isScreenRound(), false);
7962217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                            if (DEBUG) {
7972217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                                Log.v(TAG, "dispatching insets=" + insets);
7982217f61e51ba4b19c56b19297c1e9cf74d7d860fFilip Gruszczynski                            }
799067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            onApplyWindowInsets(insets);
800067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                        }
801067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
802d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        if (redrawNeeded) {
803d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            onSurfaceRedrawNeeded(mSurfaceHolder);
804d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
805d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            if (callbacks != null) {
806d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                for (SurfaceHolder.Callback c : callbacks) {
807d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                    if (c instanceof SurfaceHolder.Callback2) {
808d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                        ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded(
809d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                                mSurfaceHolder);
810d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                    }
811d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                }
812d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            }
813d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        }
814d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
8159e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                        if (didSurface && !mReportedVisible) {
8169e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            // This wallpaper is currently invisible, but its
8179e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            // surface has changed.  At this point let's tell it
8189e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            // again that it is invisible in case the report about
8199e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            // the surface caused it to start running.  We really
8209e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            // don't want wallpapers running when not visible.
8219e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            if (mIsCreating) {
8229e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                // Some wallpapers will ignore this call if they
8239e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                // had previously been told they were invisble,
8249e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                // so if we are creating a new surface then toggle
8259e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                // the state to get them to notice.
8269e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                if (DEBUG) Log.v(TAG, "onVisibilityChanged(true) at surface: "
8279e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                        + this);
8289e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                onVisibilityChanged(true);
8299e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            }
8309e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            if (DEBUG) Log.v(TAG, "onVisibilityChanged(false) at surface: "
8319e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                        + this);
8329e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            onVisibilityChanged(false);
8339e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                        }
8349e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn
8354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    } finally {
8364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        mIsCreating = false;
83718ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        mSurfaceCreated = true;
838d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        if (redrawNeeded) {
8394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            mSession.finishDrawing(mWindow);
8404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        }
841bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                        mIWallpaperEngine.reportShown();
8424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
8434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                } catch (RemoteException ex) {
8444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
8454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (DEBUG) Log.v(
8464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    TAG, "Layout: x=" + mLayout.x + " y=" + mLayout.y +
8474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    " w=" + mLayout.width + " h=" + mLayout.height);
8484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
8494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
8504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
8514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        void attach(IWallpaperEngineWrapper wrapper) {
852cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn            if (DEBUG) Log.v(TAG, "attach: " + this + " wrapper=" + wrapper);
853284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (mDestroyed) {
854284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                return;
855284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
856284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn
8574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mIWallpaperEngine = wrapper;
8584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mCaller = wrapper.mCaller;
8594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mConnection = wrapper.mConnection;
8604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mWindowToken = wrapper.mWindowToken;
861284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            mSurfaceHolder.setSizeFromLayout();
8624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mInitializing = true;
863f9e989d5f09e72f5c9a59d713521f37d3fdd93ddJeff Brown            mSession = WindowManagerGlobal.getWindowSession();
86446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
8654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mWindow.setSession(mSession);
8669fe6cb5cc2cc86a370d47afc44d27fa7086a15beDianne Hackborn
8674544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski            mLayout.packageName = getPackageName();
8684544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski
8693d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            mDisplayManager = (DisplayManager)getSystemService(Context.DISPLAY_SERVICE);
8703d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            mDisplayManager.registerDisplayListener(mDisplayListener, mCaller.getHandler());
8713d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            mDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
8724544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski            mDisplayState = mDisplay.getState();
8739fe6cb5cc2cc86a370d47afc44d27fa7086a15beDianne Hackborn
874284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (DEBUG) Log.v(TAG, "onCreate(): " + this);
875759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            onCreate(mSurfaceHolder);
8764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
8774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mInitializing = false;
8789e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn            mReportedVisible = false;
879d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn            updateSurface(false, false, false);
8804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
881067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
882284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        void doDesiredSizeChanged(int desiredWidth, int desiredHeight) {
883284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (!mDestroyed) {
884284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (DEBUG) Log.v(TAG, "onDesiredSizeChanged("
885284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        + desiredWidth + "," + desiredHeight + "): " + this);
886dcfae5c0fdc917f15a3e9ab75ee1d819b6db26baJoe Onorato                mIWallpaperEngine.mReqWidth = desiredWidth;
887dcfae5c0fdc917f15a3e9ab75ee1d819b6db26baJoe Onorato                mIWallpaperEngine.mReqHeight = desiredHeight;
888284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                onDesiredSizeChanged(desiredWidth, desiredHeight);
8899e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                doOffsetsChanged(true);
890284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
891284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
892067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
893067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        void doDisplayPaddingChanged(Rect padding) {
894067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            if (!mDestroyed) {
895067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                if (DEBUG) Log.v(TAG, "onDisplayPaddingChanged(" + padding + "): " + this);
896067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                if (!mIWallpaperEngine.mDisplayPadding.equals(padding)) {
897067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    mIWallpaperEngine.mDisplayPadding.set(padding);
898067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    updateSurface(true, false, false);
899067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                }
900067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            }
901067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
902067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
903284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        void doVisibilityChanged(boolean visible) {
904af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn            if (!mDestroyed) {
905af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn                mVisible = visible;
906af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn                reportVisibility();
907af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn            }
908bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        }
909067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
910bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn        void reportVisibility() {
911284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (!mDestroyed) {
9124544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                mDisplayState = mDisplay == null ? Display.STATE_UNKNOWN : mDisplay.getState();
9134544b927d7f3575bf609490b42d521a12bf95a07Filip Gruszczynski                boolean visible = mVisible && mDisplayState != Display.STATE_OFF;
914bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                if (mReportedVisible != visible) {
915bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                    mReportedVisible = visible;
916bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                    if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + visible
917bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            + "): " + this);
91818ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                    if (visible) {
91918ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        // If becoming visible, in preview mode the surface
92018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        // may have been destroyed so now we need to make
92118ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                        // sure it is re-created.
9229e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                        doOffsetsChanged(false);
923d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        updateSurface(false, false, false);
92418ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                    }
925bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                    onVisibilityChanged(visible);
926bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                }
927284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
928284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
929284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn
9309e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn        void doOffsetsChanged(boolean always) {
931284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (mDestroyed) {
932284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                return;
933284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
9349e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn
9359e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn            if (!always && !mOffsetsChanged) {
9369e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                return;
9379e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn            }
9389e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn
939284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            float xOffset;
940284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            float yOffset;
941bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            float xOffsetStep;
942bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            float yOffsetStep;
94319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            boolean sync;
944284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            synchronized (mLock) {
945284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                xOffset = mPendingXOffset;
946284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                yOffset = mPendingYOffset;
947bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                xOffsetStep = mPendingXOffsetStep;
948bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                yOffsetStep = mPendingYOffsetStep;
94919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                sync = mPendingSync;
95019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                mPendingSync = false;
951284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                mOffsetMessageEnqueued = false;
952284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
9539e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn
95418ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            if (mSurfaceCreated) {
9559e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                if (mReportedVisible) {
9569e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    if (DEBUG) Log.v(TAG, "Offsets change in " + this
9579e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            + ": " + xOffset + "," + yOffset);
9589e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    final int availw = mIWallpaperEngine.mReqWidth-mCurWidth;
9599e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    final int xPixels = availw > 0 ? -(int)(availw*xOffset+.5f) : 0;
9609e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    final int availh = mIWallpaperEngine.mReqHeight-mCurHeight;
9619e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    final int yPixels = availh > 0 ? -(int)(availh*yOffset+.5f) : 0;
9629e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixels, yPixels);
9639e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                } else {
9649e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    mOffsetsChanged = true;
9659e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                }
96618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            }
96719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn
96819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            if (sync) {
96919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                try {
97019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    if (DEBUG) Log.v(TAG, "Reporting offsets change complete");
97119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    mSession.wallpaperOffsetsComplete(mWindow.asBinder());
97219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                } catch (RemoteException e) {
97319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
97419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            }
975284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
976284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn
9777580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        void doCommand(WallpaperCommand cmd) {
9787580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            Bundle result;
9797580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (!mDestroyed) {
9807580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                result = onCommand(cmd.action, cmd.x, cmd.y, cmd.z,
9817580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        cmd.extras, cmd.sync);
9827580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            } else {
9837580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                result = null;
9847580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
9857580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (cmd.sync) {
9867580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                try {
9877580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    if (DEBUG) Log.v(TAG, "Reporting command complete");
9887580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mSession.wallpaperCommandComplete(mWindow.asBinder(), result);
9897580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                } catch (RemoteException e) {
9907580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
9917580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
9927580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
9937580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn
99418ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn        void reportSurfaceDestroyed() {
99518ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            if (mSurfaceCreated) {
99618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                mSurfaceCreated = false;
997dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mSurfaceHolder.ungetCallbacks();
998dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
999dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (callbacks != null) {
1000dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    for (SurfaceHolder.Callback c : callbacks) {
1001dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        c.surfaceDestroyed(mSurfaceHolder);
1002dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
10034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1004284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (DEBUG) Log.v(TAG, "onSurfaceDestroyed("
1005284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        + mSurfaceHolder + "): " + this);
1006284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                onSurfaceDestroyed(mSurfaceHolder);
10074c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
100818ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn        }
100918ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn
101018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn        void detach() {
101118ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            if (mDestroyed) {
101218ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                return;
101318ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            }
101418ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn
101518ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            mDestroyed = true;
10163d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
10173d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            if (mDisplayManager != null) {
10183d110b239153a6c7423a99f02ef859201205eee2Jeff Brown                mDisplayManager.unregisterDisplayListener(mDisplayListener);
10193d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            }
10203d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
102118ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            if (mVisible) {
102218ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                mVisible = false;
102318ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                if (DEBUG) Log.v(TAG, "onVisibilityChanged(false): " + this);
102418ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn                onVisibilityChanged(false);
102518ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            }
102618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn
102718ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn            reportSurfaceDestroyed();
1028284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn
1029284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (DEBUG) Log.v(TAG, "onDestroy(): " + this);
1030284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            onDestroy();
10313d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
10324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (mCreated) {
10334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                try {
1034ba3e31d9eed67291a51b501d12fdc27625af688eDianne Hackborn                    if (DEBUG) Log.v(TAG, "Removing window and destroying surface "
1035ba3e31d9eed67291a51b501d12fdc27625af688eDianne Hackborn                            + mSurfaceHolder.getSurface() + " of: " + this);
103646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
103732cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                    if (mInputEventReceiver != null) {
103832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                        mInputEventReceiver.dispose();
103932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                        mInputEventReceiver = null;
104046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    }
104146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mSession.remove(mWindow);
10434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                } catch (RemoteException e) {
10444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
10450586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mSurfaceHolder.mSurface.release();
10464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mCreated = false;
1047349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
104800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                // Dispose the input channel after removing the window so the Window Manager
104900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                // doesn't interpret the input channel being closed as an abnormal termination.
105000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (mInputChannel != null) {
105100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputChannel.dispose();
105200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputChannel = null;
1053349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                }
10544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
10554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
10563d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
10573d110b239153a6c7423a99f02ef859201205eee2Jeff Brown        private final DisplayListener mDisplayListener = new DisplayListener() {
10583d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            @Override
10593d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            public void onDisplayChanged(int displayId) {
10603d110b239153a6c7423a99f02ef859201205eee2Jeff Brown                if (mDisplay.getDisplayId() == displayId) {
10613d110b239153a6c7423a99f02ef859201205eee2Jeff Brown                    reportVisibility();
10623d110b239153a6c7423a99f02ef859201205eee2Jeff Brown                }
10633d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            }
10643d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
10653d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            @Override
10663d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            public void onDisplayRemoved(int displayId) {
10673d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            }
10683d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
10693d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            @Override
10703d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            public void onDisplayAdded(int displayId) {
10713d110b239153a6c7423a99f02ef859201205eee2Jeff Brown            }
10723d110b239153a6c7423a99f02ef859201205eee2Jeff Brown        };
10734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
10743d110b239153a6c7423a99f02ef859201205eee2Jeff Brown
10754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    class IWallpaperEngineWrapper extends IWallpaperEngine.Stub
10764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            implements HandlerCaller.Callback {
10774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        private final HandlerCaller mCaller;
10784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
10794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final IWallpaperConnection mConnection;
10804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        final IBinder mWindowToken;
10813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn        final int mWindowType;
10823be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn        final boolean mIsPreview;
1083bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn        boolean mShownReported;
10844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int mReqWidth;
10854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int mReqHeight;
1086067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        final Rect mDisplayPadding = new Rect();
1087067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
10884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        Engine mEngine;
1089067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
10904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        IWallpaperEngineWrapper(WallpaperService context,
10914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                IWallpaperConnection conn, IBinder windowToken,
1092067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding) {
1093aa8dc2ee18c15a5c7fb897d2f41116950fd30fe6Mita Yun            mCaller = new HandlerCaller(context, context.getMainLooper(), this, true);
10944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mConnection = conn;
10954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mWindowToken = windowToken;
10963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mWindowType = windowType;
10973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mIsPreview = isPreview;
10984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mReqWidth = reqWidth;
10994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mReqHeight = reqHeight;
1100067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mDisplayPadding.set(padding);
11014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
11024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            Message msg = mCaller.obtainMessage(DO_ATTACH);
11034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mCaller.sendMessage(msg);
11044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1105067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
1106284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        public void setDesiredSize(int width, int height) {
1107284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            Message msg = mCaller.obtainMessageII(DO_SET_DESIRED_SIZE, width, height);
1108284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            mCaller.sendMessage(msg);
1109284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
1110067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
1111067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void setDisplayPadding(Rect padding) {
1112067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            Message msg = mCaller.obtainMessageO(DO_SET_DISPLAY_PADDING, padding);
1113067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mCaller.sendMessage(msg);
1114067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
1115067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
1116284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        public void setVisibility(boolean visible) {
1117284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED,
1118284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    visible ? 1 : 0);
1119284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            mCaller.sendMessage(msg);
1120284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
1121284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn
11226adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn        public void dispatchPointer(MotionEvent event) {
11236adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn            if (mEngine != null) {
112400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mEngine.dispatchPointer(event);
112532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            } else {
112632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                event.recycle();
11276adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn            }
11286adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn        }
11299f3bdfe3eb04723efa07a2d0e6a7709da1191fa5Jeff Brown
11309f3bdfe3eb04723efa07a2d0e6a7709da1191fa5Jeff Brown        public void dispatchWallpaperCommand(String action, int x, int y,
11319f3bdfe3eb04723efa07a2d0e6a7709da1191fa5Jeff Brown                int z, Bundle extras) {
11329f3bdfe3eb04723efa07a2d0e6a7709da1191fa5Jeff Brown            if (mEngine != null) {
11339f3bdfe3eb04723efa07a2d0e6a7709da1191fa5Jeff Brown                mEngine.mWindow.dispatchWallpaperCommand(action, x, y, z, extras, false);
11349f3bdfe3eb04723efa07a2d0e6a7709da1191fa5Jeff Brown            }
11359f3bdfe3eb04723efa07a2d0e6a7709da1191fa5Jeff Brown        }
11369f3bdfe3eb04723efa07a2d0e6a7709da1191fa5Jeff Brown
1137bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn        public void reportShown() {
1138bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn            if (!mShownReported) {
1139bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                mShownReported = true;
1140bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                try {
1141bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    mConnection.engineShown(this);
1142bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                } catch (RemoteException e) {
1143bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    Log.w(TAG, "Wallpaper host disappeared", e);
1144bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                    return;
1145bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn                }
1146bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn            }
1147bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn        }
1148bce0cbb40d060f71a7de86d5668eb690e7073c19Dianne Hackborn
11494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public void destroy() {
11504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            Message msg = mCaller.obtainMessage(DO_DETACH);
11514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mCaller.sendMessage(msg);
11528cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        }
11538cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn
11548cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        public void executeMessage(Message message) {
11558cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            switch (message.what) {
11564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                case DO_ATTACH: {
1157284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    try {
1158284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        mConnection.attachEngine(this);
1159284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    } catch (RemoteException e) {
1160284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        Log.w(TAG, "Wallpaper host disappeared", e);
1161284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        return;
1162284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    }
11634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    Engine engine = onCreateEngine();
11644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mEngine = engine;
1165af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn                    mActiveEngines.add(engine);
11664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    engine.attach(this);
11678cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn                    return;
11684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
11694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                case DO_DETACH: {
1170af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn                    mActiveEngines.remove(mEngine);
11714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mEngine.detach();
11724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    return;
11734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1174284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                case DO_SET_DESIRED_SIZE: {
1175284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    mEngine.doDesiredSizeChanged(message.arg1, message.arg2);
1176284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    return;
1177284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
1178067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                case DO_SET_DISPLAY_PADDING: {
1179067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    mEngine.doDisplayPaddingChanged((Rect) message.obj);
1180067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                }
11814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                case MSG_UPDATE_SURFACE:
1182d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    mEngine.updateSurface(true, false, false);
11834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    break;
1184759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                case MSG_VISIBILITY_CHANGED:
1185759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    if (DEBUG) Log.v(TAG, "Visibility change in " + mEngine
1186759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                            + ": " + message.arg1);
1187284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    mEngine.doVisibilityChanged(message.arg1 != 0);
1188759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    break;
118972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                case MSG_WALLPAPER_OFFSETS: {
11909e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    mEngine.doOffsetsChanged(true);
119172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                } break;
11927580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                case MSG_WALLPAPER_COMMAND: {
11937580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    WallpaperCommand cmd = (WallpaperCommand)message.obj;
11947580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mEngine.doCommand(cmd);
11957580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                } break;
11967341d7a104b47996445d069a695e155a07184606Dianne Hackborn                case MSG_WINDOW_RESIZED: {
11977341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    final boolean reportDraw = message.arg1 != 0;
119803850591954faf5280fd581dd04cd6958eda0124Filip Gruszczynski                    mEngine.mOutsets.set((Rect) message.obj);
1199d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    mEngine.updateSurface(true, false, reportDraw);
12009e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    mEngine.doOffsetsChanged(true);
12017341d7a104b47996445d069a695e155a07184606Dianne Hackborn                } break;
12025702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner                case MSG_WINDOW_MOVED: {
12035702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner                    // Do nothing. What does it mean for a Wallpaper to move?
12045702d4dfb5b81491f873a3617f8d8fc8dc5279e6Craig Mautner                } break;
12058df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                case MSG_TOUCH_EVENT: {
1206840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                    boolean skip = false;
12078df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                    MotionEvent ev = (MotionEvent)message.obj;
1208840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                    if (ev.getAction() == MotionEvent.ACTION_MOVE) {
1209840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                        synchronized (mEngine.mLock) {
1210840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                            if (mEngine.mPendingMove == ev) {
1211840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                                mEngine.mPendingMove = null;
1212840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                            } else {
1213840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                                // this is not the motion event we are looking for....
1214840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                                skip = true;
1215840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                            }
12168df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                        }
12178df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                    }
1218840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                    if (!skip) {
1219840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                        if (DEBUG) Log.v(TAG, "Delivering touch event: " + ev);
1220840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                        mEngine.onTouchEvent(ev);
1221840db1f678ed15f0f3e9c58310b1e80ebb1f331aJeff Brown                    }
12228df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                    ev.recycle();
12238df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn                } break;
12248cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn                default :
12254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    Log.w(TAG, "Unknown message type " + message.what);
12268cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn            }
12278cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn        }
12288cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn    }
12294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
12304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    /**
12314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     * Implements the internal {@link IWallpaperService} interface to convert
12324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     * incoming calls to it back to calls on an {@link WallpaperService}.
12334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     */
12344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    class IWallpaperServiceWrapper extends IWallpaperService.Stub {
12354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        private final WallpaperService mTarget;
12364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
12374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        public IWallpaperServiceWrapper(WallpaperService context) {
12384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            mTarget = context;
12394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
12404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1241b1ef36965bf17e791afd16a9a34bcbb32f495f68Craig Mautner        @Override
12423be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn        public void attach(IWallpaperConnection conn, IBinder windowToken,
1243067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding) {
12443be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            new IWallpaperEngineWrapper(mTarget, conn, windowToken,
1245067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    windowType, isPreview, reqWidth, reqHeight, padding);
12464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
12474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
1248b1ef36965bf17e791afd16a9a34bcbb32f495f68Craig Mautner
1249af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn    @Override
1250af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn    public void onCreate() {
1251af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn        super.onCreate();
1252af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn    }
1253af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn
1254af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn    @Override
1255af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn    public void onDestroy() {
1256af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn        super.onDestroy();
1257af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn        for (int i=0; i<mActiveEngines.size(); i++) {
1258af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn            mActiveEngines.get(i).detach();
1259af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn        }
1260af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn        mActiveEngines.clear();
1261af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn    }
1262af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn
12634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    /**
12644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     * Implement to return the implementation of the internal accessibility
12654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     * service interface.  Subclasses should not override.
12664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn     */
12674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    @Override
12684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public final IBinder onBind(Intent intent) {
12694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return new IWallpaperServiceWrapper(this);
12704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
1271b1ef36965bf17e791afd16a9a34bcbb32f495f68Craig Mautner
127223ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn    /**
127323ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn     * Must be implemented to return a new instance of the wallpaper's engine.
127423ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn     * Note that multiple instances may be active at the same time, such as
127523ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn     * when the wallpaper is currently set as the active wallpaper and the user
127623ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn     * is in the wallpaper picker viewing a preview of it as well.
127723ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn     */
12784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public abstract Engine onCreateEngine();
1279527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn
1280527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn    @Override
1281527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn    protected void dump(FileDescriptor fd, PrintWriter out, String[] args) {
1282527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn        out.print("State of wallpaper "); out.print(this); out.println(":");
1283527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn        for (int i=0; i<mActiveEngines.size(); i++) {
1284527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            Engine engine = mActiveEngines.get(i);
1285527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            out.print("  Engine "); out.print(engine); out.println(":");
1286527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn            engine.dump("    ", fd, out, args);
1287527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn        }
1288527de8e3de4c2bad9ba0fc0e50f8fb3f95ba4681Dianne Hackborn    }
12898cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn}
1290