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><{@link android.R.styleable#Wallpaper wallpaper}></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