WallpaperService.java revision 46b9ac0ae2162309774a7478cd9d4e578747bfc2
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 198cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport com.android.internal.os.HandlerCaller; 204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport com.android.internal.view.BaseIWindow; 2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport com.android.internal.view.BaseInputHandler; 224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport com.android.internal.view.BaseSurfaceHolder; 238cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 24d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.annotation.SdkConstant; 25d68478467e3f837511196c80891d7245d0e163dfDianne Hackbornimport android.annotation.SdkConstant.SdkConstantType; 268cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.app.Service; 27759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackbornimport android.app.WallpaperManager; 28bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackbornimport android.content.BroadcastReceiver; 29bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackbornimport android.content.Context; 308cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.content.Intent; 31bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackbornimport android.content.IntentFilter; 32e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackbornimport android.content.res.Configuration; 334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.graphics.Rect; 347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackbornimport android.os.Bundle; 358cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.os.IBinder; 3619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackbornimport android.os.Looper; 378cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.os.Message; 388cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.os.RemoteException; 398cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.util.Log; 4019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackbornimport android.util.LogPrinter; 414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.Gravity; 424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.IWindowSession; 4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel; 4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputHandler; 4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputQueue; 4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.KeyEvent; 478df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackbornimport android.view.MotionEvent; 484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.SurfaceHolder; 494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.View; 5072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackbornimport android.view.ViewGroup; 514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.ViewRoot; 524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManager; 534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManagerImpl; 5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.WindowManagerPolicy; 558cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 56af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackbornimport java.util.ArrayList; 57af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn 588cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn/** 598cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * A wallpaper service is responsible for showing a live wallpaper behind 6023ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * applications that would like to sit on top of it. This service object 6123ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * itself does very little -- its only purpose is to generate instances of 62e4260f4e7da4da32bfab2737018cf9cf75215894Dianne Hackborn * {@link Engine} as needed. Implementing a wallpaper thus 6323ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * involves subclassing from this, subclassing an Engine implementation, 6423ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * and implementing {@link #onCreateEngine()} to return a new instance of 6523ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * your engine. 668cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn */ 678cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornpublic abstract class WallpaperService extends Service { 688cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn /** 698cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * The {@link Intent} that must be declared as handled by the service. 70d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * To be supported, the service must also require the 71d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * {@link android.Manifest.permission#BIND_WALLPAPER} permission so 72d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn * that other applications can not abuse it. 738cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn */ 74d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn @SdkConstant(SdkConstantType.SERVICE_ACTION) 758cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public static final String SERVICE_INTERFACE = 76d68478467e3f837511196c80891d7245d0e163dfDianne Hackborn "android.service.wallpaper.WallpaperService"; 778cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 78eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn /** 79eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * Name under which a WallpaperService component publishes information 80eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * about itself. This meta-data must reference an XML resource containing 81eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * a <code><{@link android.R.styleable#Wallpaper wallpaper}></code> 82eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * tag. 83eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn */ 84eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn public static final String SERVICE_META_DATA = "android.service.wallpaper"; 85eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn static final String TAG = "WallpaperService"; 8772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn static final boolean DEBUG = false; 884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private static final int DO_ATTACH = 10; 904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private static final int DO_DETACH = 20; 91284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn private static final int DO_SET_DESIRED_SIZE = 30; 924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private static final int MSG_UPDATE_SURFACE = 10000; 94759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn private static final int MSG_VISIBILITY_CHANGED = 10010; 9572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn private static final int MSG_WALLPAPER_OFFSETS = 10020; 967580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn private static final int MSG_WALLPAPER_COMMAND = 10025; 977341d7a104b47996445d069a695e155a07184606Dianne Hackborn private static final int MSG_WINDOW_RESIZED = 10030; 988df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn private static final int MSG_TOUCH_EVENT = 10040; 994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 10019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn private Looper mCallbackLooper; 101af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn private final ArrayList<Engine> mActiveEngines 102af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn = new ArrayList<Engine>(); 10319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn 1047580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn static final class WallpaperCommand { 1057580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn String action; 1067580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int x; 1077580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int y; 1087580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int z; 1097580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn Bundle extras; 1107580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn boolean sync; 1117580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 1127580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn 1138cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn /** 1144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * The actual implementation of a wallpaper. A wallpaper service may 1154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * have multiple instances running (for example as a real wallpaper 1164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * and as a preview), each of which is represented by its own Engine 117759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * instance. You must implement {@link WallpaperService#onCreateEngine()} 118759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * to return your concrete Engine implementation. 1198cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn */ 1204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public class Engine { 1214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperEngineWrapper mIWallpaperEngine; 1224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Copies from mIWallpaperEngine. 1244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn HandlerCaller mCaller; 1254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperConnection mConnection; 1264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IBinder mWindowToken; 1274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean mInitializing = true; 129284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn boolean mVisible; 130bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn boolean mScreenOn = true; 131bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn boolean mReportedVisible; 132284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn boolean mDestroyed; 1334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Current window state. 1354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean mCreated; 13618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn boolean mSurfaceCreated; 1374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean mIsCreating; 1384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean mDrawingAllowed; 1394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mWidth; 1404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mHeight; 1414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mFormat; 1424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mType; 14372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn int mCurWidth; 14472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn int mCurHeight; 1458df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn int mWindowFlags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; 1468df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn int mCurWindowFlags = mWindowFlags; 1474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final Rect mVisibleInsets = new Rect(); 1484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final Rect mWinFrame = new Rect(); 1494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final Rect mContentInsets = new Rect(); 150694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn final Configuration mConfiguration = new Configuration(); 1514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final WindowManager.LayoutParams mLayout 1534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn = new WindowManager.LayoutParams(); 1544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWindowSession mSession; 15546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputChannel mInputChannel; 1568cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 15772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn final Object mLock = new Object(); 15872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn boolean mOffsetMessageEnqueued; 15972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn float mPendingXOffset; 16072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn float mPendingYOffset; 161bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float mPendingXOffsetStep; 162bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float mPendingYOffsetStep; 16319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn boolean mPendingSync; 1648df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn MotionEvent mPendingMove; 16572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 166bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn final BroadcastReceiver mReceiver = new BroadcastReceiver() { 167bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn @Override 168bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn public void onReceive(Context context, Intent intent) { 169bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) { 170bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn mScreenOn = true; 171bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn reportVisibility(); 172bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) { 173bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn mScreenOn = false; 174bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn reportVisibility(); 175bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 176bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 177bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn }; 178bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn 1794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() { 1804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn @Override 1824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public boolean onAllowLockCanvas() { 1834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return mDrawingAllowed; 1844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn @Override 1874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onRelayoutContainer() { 1884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE); 1894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller.sendMessage(msg); 1904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn @Override 1934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onUpdateSurface() { 1944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE); 1954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller.sendMessage(msg); 1964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1978cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 1984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public boolean isCreating() { 1994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return mIsCreating; 2004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 2014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 202284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn @Override 203284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public void setFixedSize(int width, int height) { 204284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn throw new UnsupportedOperationException( 205284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn "Wallpapers currently only support sizing from layout"); 206284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 207284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 2084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void setKeepScreenOn(boolean screenOn) { 209284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn throw new UnsupportedOperationException( 210284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn "Wallpapers do not support keep screen on"); 2114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 2124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 2134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn }; 2148cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 21546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown final InputHandler mInputHandler = new BaseInputHandler() { 21646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown @Override 21746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown public void handleTouch(MotionEvent event, Runnable finishedCallback) { 21846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown try { 21946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown synchronized (mLock) { 22046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (event.getAction() == MotionEvent.ACTION_MOVE) { 22146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (mPendingMove != null) { 22246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mCaller.removeMessages(MSG_TOUCH_EVENT, mPendingMove); 22346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mPendingMove.recycle(); 22446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 22546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mPendingMove = event; 22646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 22746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mPendingMove = null; 22846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 22946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Message msg = mCaller.obtainMessageO(MSG_TOUCH_EVENT, 23046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown event); 23146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mCaller.sendMessage(msg); 23246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 23346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } finally { 23446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown finishedCallback.run(); 23546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 23646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 23746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown }; 23846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final BaseIWindow mWindow = new BaseIWindow() { 2408df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn @Override 2418df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn public boolean onDispatchPointer(MotionEvent event, long eventTime, 2428df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn boolean callWhenDone) { 2438df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn synchronized (mLock) { 2448df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn if (event.getAction() == MotionEvent.ACTION_MOVE) { 2458df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn if (mPendingMove != null) { 2468df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mCaller.removeMessages(MSG_TOUCH_EVENT, mPendingMove); 2478df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mPendingMove.recycle(); 2488df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 2498df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mPendingMove = event; 2508df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } else { 2518df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mPendingMove = null; 2528df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 2538df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn Message msg = mCaller.obtainMessageO(MSG_TOUCH_EVENT, 2548df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn event); 2558df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mCaller.sendMessage(msg); 2568df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 2578df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn return false; 2588df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 2598df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn 2608df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn @Override 2617341d7a104b47996445d069a695e155a07184606Dianne Hackborn public void resized(int w, int h, Rect coveredInsets, 262e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn Rect visibleInsets, boolean reportDraw, Configuration newConfig) { 2637341d7a104b47996445d069a695e155a07184606Dianne Hackborn Message msg = mCaller.obtainMessageI(MSG_WINDOW_RESIZED, 2647341d7a104b47996445d069a695e155a07184606Dianne Hackborn reportDraw ? 1 : 0); 2657341d7a104b47996445d069a695e155a07184606Dianne Hackborn mCaller.sendMessage(msg); 2667341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 2677341d7a104b47996445d069a695e155a07184606Dianne Hackborn 2688df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn @Override 269759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public void dispatchAppVisibility(boolean visible) { 270284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // We don't do this in preview mode; we'll let the preview 271284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // activity tell us when to run. 272284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (!mIWallpaperEngine.mIsPreview) { 273284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED, 274284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn visible ? 1 : 0); 275284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mCaller.sendMessage(msg); 276284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 277759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 27872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 27972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn @Override 280bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep, 281bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen boolean sync) { 28272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn synchronized (mLock) { 28319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (DEBUG) Log.v(TAG, "Dispatch wallpaper offsets: " + x + ", " + y); 28472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mPendingXOffset = x; 28572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mPendingYOffset = y; 286bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen mPendingXOffsetStep = xStep; 287bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen mPendingYOffsetStep = yStep; 28819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (sync) { 28919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mPendingSync = true; 29019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 29172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn if (!mOffsetMessageEnqueued) { 29272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mOffsetMessageEnqueued = true; 29372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn Message msg = mCaller.obtainMessage(MSG_WALLPAPER_OFFSETS); 29472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mCaller.sendMessage(msg); 29572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 29672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 29772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 29872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 2997580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn public void dispatchWallpaperCommand(String action, int x, int y, 3007580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int z, Bundle extras, boolean sync) { 3017580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn synchronized (mLock) { 3027580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (DEBUG) Log.v(TAG, "Dispatch wallpaper command: " + x + ", " + y); 3037580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn WallpaperCommand cmd = new WallpaperCommand(); 3047580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn cmd.action = action; 3057580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn cmd.x = x; 3067580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn cmd.y = y; 3077580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn cmd.z = z; 3087580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn cmd.extras = extras; 3097580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn cmd.sync = sync; 3107580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn Message msg = mCaller.obtainMessage(MSG_WALLPAPER_COMMAND); 3117580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn msg.obj = cmd; 3127580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mCaller.sendMessage(msg); 3137580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 3147580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 3154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn }; 3164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 317759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 318759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Provides access to the surface in which this wallpaper is drawn. 319759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 320759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public SurfaceHolder getSurfaceHolder() { 321759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn return mSurfaceHolder; 322759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 323759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 324759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 325759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link WallpaperManager#getDesiredMinimumWidth() 326759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * WallpaperManager.getDesiredMinimumWidth()}, returning the width 327759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * that the system would like this wallpaper to run in. 328759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 329759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public int getDesiredMinimumWidth() { 330759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn return mIWallpaperEngine.mReqWidth; 331759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 332759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 333759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 334759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link WallpaperManager#getDesiredMinimumHeight() 335759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * WallpaperManager.getDesiredMinimumHeight()}, returning the height 336759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * that the system would like this wallpaper to run in. 337759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 338759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public int getDesiredMinimumHeight() { 339759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn return mIWallpaperEngine.mReqHeight; 340759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 341759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 342759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 343284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * Return whether the wallpaper is currently visible to the user, 344284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * this is the last value supplied to 345284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * {@link #onVisibilityChanged(boolean)}. 346284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn */ 347284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public boolean isVisible() { 348bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn return mReportedVisible; 349284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 350284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 351284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn /** 3523be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn * Returns true if this engine is running in preview mode -- that is, 3533be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn * it is being shown to the user before they select it as the actual 3543be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn * wallpaper. 3553be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn */ 3563be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn public boolean isPreview() { 3573be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn return mIWallpaperEngine.mIsPreview; 3583be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 3593be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn 3603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn /** 3618df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * Control whether this wallpaper will receive raw touch events 3628df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * from the window manager as the user interacts with the window 3638df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * that is currently displaying the wallpaper. By default they 3648df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * are turned off. If enabled, the events will be received in 3658df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * {@link #onTouchEvent(MotionEvent)}. 3668df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn */ 3678df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn public void setTouchEventsEnabled(boolean enabled) { 3688df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mWindowFlags = enabled 3698df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn ? (mWindowFlags&~WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) 3708df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn : (mWindowFlags|WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 3718df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn if (mCreated) { 372cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn updateSurface(false, false); 3738df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 3748df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 3758df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn 3768df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn /** 377759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Called once to initialize the engine. After returning, the 378759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * engine's surface will be created by the framework. 379759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 380759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public void onCreate(SurfaceHolder surfaceHolder) { 3814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 383759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 384759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Called right before the engine is going away. After this the 385759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * surface will be destroyed and this Engine object is no longer 386759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * valid. 387759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 388759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public void onDestroy() { 3894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 391759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 392759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Called to inform you of the wallpaper becoming visible or 393759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * hidden. <em>It is very important that a wallpaper only use 394759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * CPU while it is visible.</em>. 395759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 396759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public void onVisibilityChanged(boolean visible) { 397759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 398759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 399759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 4008df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * Called as the user performs touch-screen interaction with the 4018df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * window that is currently showing this wallpaper. Note that the 4028df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * events you receive here are driven by the actual application the 403ae87bd089aaa2f30b4e0d68fff25ea725a14aa9eMarco Nelissen * user is interacting with, so if it is slow you will get fewer 4048df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * move events. 4058df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn */ 4068df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn public void onTouchEvent(MotionEvent event) { 4078df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 4088df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn 4098df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn /** 41072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn * Called to inform you of the wallpaper's offsets changing 41172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn * within its contain, corresponding to the container's 41272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn * call to {@link WallpaperManager#setWallpaperOffsets(IBinder, float, float) 41372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn * WallpaperManager.setWallpaperOffsets()}. 41472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn */ 41572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn public void onOffsetsChanged(float xOffset, float yOffset, 416bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float xOffsetStep, float yOffsetStep, 41772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn int xPixelOffset, int yPixelOffset) { 41872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 41972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 42072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn /** 4217580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * Process a command that was sent to the wallpaper with 42213bf8260134d516cbcc982d360d9f21067f47fa6Dianne Hackborn * {@link WallpaperManager#sendWallpaperCommand}. 4237580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * The default implementation does nothing, and always returns null 4247580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * as the result. 4257580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * 4267580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * @param action The name of the command to perform. This tells you 4277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * what to do and how to interpret the rest of the arguments. 4287580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * @param x Generic integer parameter. 4297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * @param y Generic integer parameter. 4307580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * @param z Generic integer parameter. 4317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * @param extras Any additional parameters. 4327580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * @param resultRequested If true, the caller is requesting that 4337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * a result, appropriate for the command, be returned back. 4347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * @return If returning a result, create a Bundle and place the 4357580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn * result data in to it. Otherwise return null. 4367580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn */ 4377580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn public Bundle onCommand(String action, int x, int y, int z, 4387580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn Bundle extras, boolean resultRequested) { 4397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn return null; 4407580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 4417580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn 4427580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn /** 443284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * Called when an application has changed the desired virtual size of 444284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * the wallpaper. 445284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn */ 446284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public void onDesiredSizeChanged(int desiredWidth, int desiredHeight) { 447284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 448284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 449284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn /** 450759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link SurfaceHolder.Callback#surfaceChanged 451759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * SurfaceHolder.Callback.surfaceChanged()}. 452759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 4534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { 4544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4558cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 456759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 457759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link SurfaceHolder.Callback#surfaceCreated 458759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * SurfaceHolder.Callback.surfaceCreated()}. 459759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 4604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onSurfaceCreated(SurfaceHolder holder) { 4614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4628cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 463759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 464759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link SurfaceHolder.Callback#surfaceDestroyed 465759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * SurfaceHolder.Callback.surfaceDestroyed()}. 466759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 4674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onSurfaceDestroyed(SurfaceHolder holder) { 4688cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 4698cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 470cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn void updateSurface(boolean forceRelayout, boolean forceReport) { 471284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mDestroyed) { 472284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Log.w(TAG, "Ignoring updateSurface: destroyed"); 473284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 474284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 4754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int myWidth = mSurfaceHolder.getRequestedWidth(); 476980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy if (myWidth <= 0) myWidth = ViewGroup.LayoutParams.MATCH_PARENT; 4774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int myHeight = mSurfaceHolder.getRequestedHeight(); 478980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy if (myHeight <= 0) myHeight = ViewGroup.LayoutParams.MATCH_PARENT; 4794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final boolean creating = !mCreated; 48118ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn final boolean surfaceCreating = !mSurfaceCreated; 4824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final boolean formatChanged = mFormat != mSurfaceHolder.getRequestedFormat(); 4837341d7a104b47996445d069a695e155a07184606Dianne Hackborn boolean sizeChanged = mWidth != myWidth || mHeight != myHeight; 4844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final boolean typeChanged = mType != mSurfaceHolder.getRequestedType(); 4858df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn final boolean flagsChanged = mCurWindowFlags != mWindowFlags; 48618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (forceRelayout || creating || surfaceCreating || formatChanged || sizeChanged 487cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn || typeChanged || flagsChanged) { 4884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 489284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "Changes: creating=" + creating 4904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + " format=" + formatChanged + " size=" + sizeChanged); 4914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn try { 4934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWidth = myWidth; 4944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mHeight = myHeight; 4954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mFormat = mSurfaceHolder.getRequestedFormat(); 4964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mType = mSurfaceHolder.getRequestedType(); 4974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.x = 0; 4994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.y = 0; 5004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.width = myWidth; 5014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.height = myHeight; 5024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.format = mFormat; 5048df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn 5058df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mCurWindowFlags = mWindowFlags; 5068df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mLayout.flags = mWindowFlags 5078df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 5088df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 5098df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 5108df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn ; 5114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.memoryType = mType; 5134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.token = mWindowToken; 5144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (!mCreated) { 5163be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLayout.type = mIWallpaperEngine.mWindowType; 5174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.gravity = Gravity.LEFT|Gravity.TOP; 5180586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mLayout.setTitle(WallpaperService.this.getClass().getName()); 519284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mLayout.windowAnimations = 520284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.style.Animation_Wallpaper; 52146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mInputChannel = new InputChannel(); 52246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mSession.add(mWindow, mLayout, View.VISIBLE, mContentInsets, 52346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mInputChannel); 52418ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn mCreated = true; 52546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 52646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (WindowManagerPolicy.ENABLE_NATIVE_INPUT_DISPATCH) { 52746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputQueue.registerInputChannel(mInputChannel, mInputHandler, 52846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Looper.myQueue()); 52946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 5304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSurfaceHolder.mSurfaceLock.lock(); 5334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mDrawingAllowed = true; 5344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final int relayoutResult = mSession.relayout( 5364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWindow, mLayout, mWidth, mHeight, 5374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn View.VISIBLE, false, mWinFrame, mContentInsets, 538694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn mVisibleInsets, mConfiguration, mSurfaceHolder.mSurface); 5394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 540284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface 5414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + ", frame=" + mWinFrame); 5424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5437341d7a104b47996445d069a695e155a07184606Dianne Hackborn int w = mWinFrame.width(); 5447341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (mCurWidth != w) { 5457341d7a104b47996445d069a695e155a07184606Dianne Hackborn sizeChanged = true; 5467341d7a104b47996445d069a695e155a07184606Dianne Hackborn mCurWidth = w; 5477341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 5487341d7a104b47996445d069a695e155a07184606Dianne Hackborn int h = mWinFrame.height(); 5497341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (mCurHeight != h) { 5507341d7a104b47996445d069a695e155a07184606Dianne Hackborn sizeChanged = true; 5517341d7a104b47996445d069a695e155a07184606Dianne Hackborn mCurHeight = h; 5527341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 55372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 5544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSurfaceHolder.mSurfaceLock.unlock(); 5554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 55618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (!mSurfaceHolder.mSurface.isValid()) { 55718ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn reportSurfaceDestroyed(); 55818ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (DEBUG) Log.v(TAG, "Layout: Surface destroyed"); 55918ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn return; 56018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn } 56118ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn 5624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn try { 563dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn mSurfaceHolder.ungetCallbacks(); 5644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 56518ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (surfaceCreating) { 5664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mIsCreating = true; 567284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onSurfaceCreated(" 568284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + mSurfaceHolder + "): " + this); 5694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn onSurfaceCreated(mSurfaceHolder); 570dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks(); 5714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (callbacks != null) { 5724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn for (SurfaceHolder.Callback c : callbacks) { 5734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn c.surfaceCreated(mSurfaceHolder); 5744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 57718ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (forceReport || creating || surfaceCreating 57818ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn || formatChanged || sizeChanged) { 579cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn if (DEBUG) { 580cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn RuntimeException e = new RuntimeException(); 581cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn e.fillInStackTrace(); 582cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn Log.w(TAG, "forceReport=" + forceReport + " creating=" + creating 583cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn + " formatChanged=" + formatChanged 584cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn + " sizeChanged=" + sizeChanged, e); 585cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn } 586284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onSurfaceChanged(" 587284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + mSurfaceHolder + ", " + mFormat 588284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + ", " + mCurWidth + ", " + mCurHeight 589284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + "): " + this); 59072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn onSurfaceChanged(mSurfaceHolder, mFormat, 59172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mCurWidth, mCurHeight); 592dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks(); 5934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (callbacks != null) { 5944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn for (SurfaceHolder.Callback c : callbacks) { 59572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn c.surfaceChanged(mSurfaceHolder, mFormat, 59672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mCurWidth, mCurHeight); 5974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } finally { 6014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mIsCreating = false; 60218ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn mSurfaceCreated = true; 6034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (creating || (relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) { 6044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSession.finishDrawing(mWindow); 6054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6074c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } catch (RemoteException ex) { 6084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (DEBUG) Log.v( 6104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn TAG, "Layout: x=" + mLayout.x + " y=" + mLayout.y + 6114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn " w=" + mLayout.width + " h=" + mLayout.height); 6124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 6154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn void attach(IWallpaperEngineWrapper wrapper) { 616cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn if (DEBUG) Log.v(TAG, "attach: " + this + " wrapper=" + wrapper); 617284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mDestroyed) { 618284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 619284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 620284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 6214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mIWallpaperEngine = wrapper; 6224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller = wrapper.mCaller; 6234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mConnection = wrapper.mConnection; 6244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWindowToken = wrapper.mWindowToken; 625284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mSurfaceHolder.setSizeFromLayout(); 6264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mInitializing = true; 6274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSession = ViewRoot.getWindowSession(getMainLooper()); 62846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWindow.setSession(mSession); 6304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 631bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn IntentFilter filter = new IntentFilter(); 632bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn filter.addAction(Intent.ACTION_SCREEN_ON); 633bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn filter.addAction(Intent.ACTION_SCREEN_OFF); 634bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn registerReceiver(mReceiver, filter); 635bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn 636284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onCreate(): " + this); 637759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn onCreate(mSurfaceHolder); 6384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 6394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mInitializing = false; 640cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn updateSurface(false, false); 6414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 643284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn void doDesiredSizeChanged(int desiredWidth, int desiredHeight) { 644284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (!mDestroyed) { 645284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onDesiredSizeChanged(" 646284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + desiredWidth + "," + desiredHeight + "): " + this); 647284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn onDesiredSizeChanged(desiredWidth, desiredHeight); 648284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 649284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 650284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 651284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn void doVisibilityChanged(boolean visible) { 652af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn if (!mDestroyed) { 653af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn mVisible = visible; 654af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn reportVisibility(); 655af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn } 656bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 657bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn 658bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn void reportVisibility() { 659284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (!mDestroyed) { 660bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn boolean visible = mVisible && mScreenOn; 661bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (mReportedVisible != visible) { 662bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn mReportedVisible = visible; 663bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + visible 664bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn + "): " + this); 66518ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (visible) { 66618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn // If becoming visible, in preview mode the surface 66718ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn // may have been destroyed so now we need to make 66818ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn // sure it is re-created. 66918ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn updateSurface(false, false); 67018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn } 671bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn onVisibilityChanged(visible); 672bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 673284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 674284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 675284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 676284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn void doOffsetsChanged() { 677284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mDestroyed) { 678284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 679284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 680284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 681284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn float xOffset; 682284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn float yOffset; 683bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float xOffsetStep; 684bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float yOffsetStep; 68519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn boolean sync; 686284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn synchronized (mLock) { 687284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn xOffset = mPendingXOffset; 688284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn yOffset = mPendingYOffset; 689bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen xOffsetStep = mPendingXOffsetStep; 690bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen yOffsetStep = mPendingYOffsetStep; 69119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn sync = mPendingSync; 69219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mPendingSync = false; 693284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mOffsetMessageEnqueued = false; 694284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 69518ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn 69618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (mSurfaceCreated) { 69718ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (DEBUG) Log.v(TAG, "Offsets change in " + this 69818ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn + ": " + xOffset + "," + yOffset); 69918ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn final int availw = mIWallpaperEngine.mReqWidth-mCurWidth; 70018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn final int xPixels = availw > 0 ? -(int)(availw*xOffset+.5f) : 0; 70118ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn final int availh = mIWallpaperEngine.mReqHeight-mCurHeight; 70218ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn final int yPixels = availh > 0 ? -(int)(availh*yOffset+.5f) : 0; 70318ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixels, yPixels); 70418ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn } 70519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn 70619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (sync) { 70719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn try { 70819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (DEBUG) Log.v(TAG, "Reporting offsets change complete"); 70919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mSession.wallpaperOffsetsComplete(mWindow.asBinder()); 71019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } catch (RemoteException e) { 71119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 71219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 713284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 714284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 7157580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn void doCommand(WallpaperCommand cmd) { 7167580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn Bundle result; 7177580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (!mDestroyed) { 7187580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn result = onCommand(cmd.action, cmd.x, cmd.y, cmd.z, 7197580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn cmd.extras, cmd.sync); 7207580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } else { 7217580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn result = null; 7227580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 7237580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (cmd.sync) { 7247580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn try { 7257580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (DEBUG) Log.v(TAG, "Reporting command complete"); 7267580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mSession.wallpaperCommandComplete(mWindow.asBinder(), result); 7277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } catch (RemoteException e) { 7287580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 7297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 7307580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 7317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn 73218ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn void reportSurfaceDestroyed() { 73318ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (mSurfaceCreated) { 73418ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn mSurfaceCreated = false; 735dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn mSurfaceHolder.ungetCallbacks(); 736dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks(); 737dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn if (callbacks != null) { 738dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn for (SurfaceHolder.Callback c : callbacks) { 739dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn c.surfaceDestroyed(mSurfaceHolder); 740dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn } 7414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 742284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onSurfaceDestroyed(" 743284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + mSurfaceHolder + "): " + this); 744284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn onSurfaceDestroyed(mSurfaceHolder); 7454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 74618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn } 74718ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn 74818ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn void detach() { 74918ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (mDestroyed) { 75018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn return; 75118ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn } 75218ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn 75318ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn mDestroyed = true; 75418ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn 75518ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (mVisible) { 75618ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn mVisible = false; 75718ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn if (DEBUG) Log.v(TAG, "onVisibilityChanged(false): " + this); 75818ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn onVisibilityChanged(false); 75918ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn } 76018ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn 76118ee31e89766ec78f1c25f4e307306a16fe35818Dianne Hackborn reportSurfaceDestroyed(); 762284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 763284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onDestroy(): " + this); 764284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn onDestroy(); 765284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 766bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn unregisterReceiver(mReceiver); 767bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn 7684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (mCreated) { 7694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn try { 770ba3e31d9eed67291a51b501d12fdc27625af688eDianne Hackborn if (DEBUG) Log.v(TAG, "Removing window and destroying surface " 771ba3e31d9eed67291a51b501d12fdc27625af688eDianne Hackborn + mSurfaceHolder.getSurface() + " of: " + this); 77246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 77346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (WindowManagerPolicy.ENABLE_NATIVE_INPUT_DISPATCH) { 77446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (mInputChannel != null) { 77546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputQueue.unregisterInputChannel(mInputChannel); 77646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mInputChannel.dispose(); 77746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mInputChannel = null; 77846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 77946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 78046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSession.remove(mWindow); 7824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } catch (RemoteException e) { 7834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 7840586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mSurfaceHolder.mSurface.release(); 7854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCreated = false; 7864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 7874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 7884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 7894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 7904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn class IWallpaperEngineWrapper extends IWallpaperEngine.Stub 7914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn implements HandlerCaller.Callback { 7924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private final HandlerCaller mCaller; 7934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 7944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final IWallpaperConnection mConnection; 7954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final IBinder mWindowToken; 7963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn final int mWindowType; 7973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn final boolean mIsPreview; 7984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mReqWidth; 7994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mReqHeight; 8004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 8014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Engine mEngine; 8024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 8034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperEngineWrapper(WallpaperService context, 8044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperConnection conn, IBinder windowToken, 8053be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn int windowType, boolean isPreview, int reqWidth, int reqHeight) { 80619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (DEBUG && mCallbackLooper != null) { 80719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mCallbackLooper.setMessageLogging(new LogPrinter(Log.VERBOSE, TAG)); 80819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 80919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mCaller = new HandlerCaller(context, 81019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mCallbackLooper != null 81119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn ? mCallbackLooper : context.getMainLooper(), 81219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn this); 8134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mConnection = conn; 8144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWindowToken = windowToken; 8153be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mWindowType = windowType; 8163be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mIsPreview = isPreview; 8174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mReqWidth = reqWidth; 8184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mReqHeight = reqHeight; 8194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 8204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Message msg = mCaller.obtainMessage(DO_ATTACH); 8214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller.sendMessage(msg); 8224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 8234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 824284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public void setDesiredSize(int width, int height) { 825284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Message msg = mCaller.obtainMessageII(DO_SET_DESIRED_SIZE, width, height); 826284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mCaller.sendMessage(msg); 827284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 828284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 829284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public void setVisibility(boolean visible) { 830284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED, 831284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn visible ? 1 : 0); 832284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mCaller.sendMessage(msg); 833284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 834284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 8356adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn public void dispatchPointer(MotionEvent event) { 8366adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn if (mEngine != null) { 8376adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn mEngine.mWindow.onDispatchPointer(event, event.getEventTime(), false); 8386adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn } 8396adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn } 8406adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn 8414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void destroy() { 8424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Message msg = mCaller.obtainMessage(DO_DETACH); 8434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller.sendMessage(msg); 8448cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 8458cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 8468cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public void executeMessage(Message message) { 8478cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn switch (message.what) { 8484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn case DO_ATTACH: { 849284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn try { 850284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mConnection.attachEngine(this); 851284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } catch (RemoteException e) { 852284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Log.w(TAG, "Wallpaper host disappeared", e); 853284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 854284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 8554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Engine engine = onCreateEngine(); 8564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mEngine = engine; 857af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn mActiveEngines.add(engine); 8584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn engine.attach(this); 8598cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return; 8604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 8614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn case DO_DETACH: { 862af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn mActiveEngines.remove(mEngine); 8634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mEngine.detach(); 8644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return; 8654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 866284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn case DO_SET_DESIRED_SIZE: { 867284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mEngine.doDesiredSizeChanged(message.arg1, message.arg2); 868284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 869284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 8704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn case MSG_UPDATE_SURFACE: 871cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn mEngine.updateSurface(true, false); 8724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn break; 873759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn case MSG_VISIBILITY_CHANGED: 874759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if (DEBUG) Log.v(TAG, "Visibility change in " + mEngine 875759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn + ": " + message.arg1); 876284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mEngine.doVisibilityChanged(message.arg1 != 0); 877759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn break; 87872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn case MSG_WALLPAPER_OFFSETS: { 879284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mEngine.doOffsetsChanged(); 88072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } break; 8817580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn case MSG_WALLPAPER_COMMAND: { 8827580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn WallpaperCommand cmd = (WallpaperCommand)message.obj; 8837580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mEngine.doCommand(cmd); 8847580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } break; 8857341d7a104b47996445d069a695e155a07184606Dianne Hackborn case MSG_WINDOW_RESIZED: { 8867341d7a104b47996445d069a695e155a07184606Dianne Hackborn final boolean reportDraw = message.arg1 != 0; 887cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn mEngine.updateSurface(true, false); 88804cde3413cbdb004642267f3d2139e90f9c1072eRomain Guy mEngine.doOffsetsChanged(); 8897341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (reportDraw) { 8907341d7a104b47996445d069a695e155a07184606Dianne Hackborn try { 8917341d7a104b47996445d069a695e155a07184606Dianne Hackborn mEngine.mSession.finishDrawing(mEngine.mWindow); 8927341d7a104b47996445d069a695e155a07184606Dianne Hackborn } catch (RemoteException e) { 8937341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 8947341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 8957341d7a104b47996445d069a695e155a07184606Dianne Hackborn } break; 8968df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn case MSG_TOUCH_EVENT: { 8978df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn MotionEvent ev = (MotionEvent)message.obj; 8988df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn synchronized (mEngine.mLock) { 8998df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn if (mEngine.mPendingMove == ev) { 9008df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mEngine.mPendingMove = null; 9018df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 9028df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 9036adba2467ca524b4c4f3d775de6aa10a9ad57aeaDianne Hackborn if (DEBUG) Log.v(TAG, "Delivering touch event: " + ev); 9048df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mEngine.onTouchEvent(ev); 9058df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn ev.recycle(); 9068df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } break; 9078cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn default : 9084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Log.w(TAG, "Unknown message type " + message.what); 9098cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 9108cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 9118cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 9124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 9134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn /** 9144c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * Implements the internal {@link IWallpaperService} interface to convert 9154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * incoming calls to it back to calls on an {@link WallpaperService}. 9164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn */ 9174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn class IWallpaperServiceWrapper extends IWallpaperService.Stub { 9184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private final WallpaperService mTarget; 9194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 9204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public IWallpaperServiceWrapper(WallpaperService context) { 9214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mTarget = context; 9224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 9234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 9243be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn public void attach(IWallpaperConnection conn, IBinder windowToken, 9253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn int windowType, boolean isPreview, int reqWidth, int reqHeight) { 9263be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn new IWallpaperEngineWrapper(mTarget, conn, windowToken, 9273be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn windowType, isPreview, reqWidth, reqHeight); 9284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 9294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 9304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 931af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn @Override 932af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn public void onCreate() { 933af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn super.onCreate(); 934af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn } 935af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn 936af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn @Override 937af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn public void onDestroy() { 938af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn super.onDestroy(); 939af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn for (int i=0; i<mActiveEngines.size(); i++) { 940af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn mActiveEngines.get(i).detach(); 941af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn } 942af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn mActiveEngines.clear(); 943af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn } 944af1f42be96a6ffa7a9b63e199e1614281ea3282dDianne Hackborn 9454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn /** 9464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * Implement to return the implementation of the internal accessibility 9474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * service interface. Subclasses should not override. 9484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn */ 9494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn @Override 9504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public final IBinder onBind(Intent intent) { 9514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return new IWallpaperServiceWrapper(this); 9524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 9534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 95419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn /** 95519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * This allows subclasses to change the thread that most callbacks 95619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * occur on. Currently hidden because it is mostly needed for the 95719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * image wallpaper (which runs in the system process and doesn't want 95819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * to get stuck running on that seriously in use main thread). Not 95919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * exposed right now because the semantics of this are not totally 96019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * well defined and some callbacks can still happen on the main thread). 96119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * @hide 96219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn */ 96319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn public void setCallbackLooper(Looper looper) { 96419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mCallbackLooper = looper; 96519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 96619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn 96723ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn /** 96823ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * Must be implemented to return a new instance of the wallpaper's engine. 96923ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * Note that multiple instances may be active at the same time, such as 97023ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * when the wallpaper is currently set as the active wallpaper and the user 97123ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn * is in the wallpaper picker viewing a preview of it as well. 97223ef7b4836d66d31430fedee2aac36275bb30d4bDianne Hackborn */ 9734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public abstract Engine onCreateEngine(); 9748cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn} 975