WallpaperService.java revision eb034652c2037a47ebfd99779e8383bb8bb528af
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; 214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport com.android.internal.view.BaseSurfaceHolder; 228cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 238cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.app.Service; 24759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackbornimport android.app.WallpaperManager; 258cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.content.Intent; 264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.graphics.Rect; 278cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.os.IBinder; 288cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.os.Message; 298cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.os.RemoteException; 308cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornimport android.util.Log; 314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.Gravity; 324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.IWindowSession; 338df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackbornimport android.view.MotionEvent; 344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.SurfaceHolder; 354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.View; 3672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackbornimport android.view.ViewGroup; 374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.ViewRoot; 384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManager; 394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport android.view.WindowManagerImpl; 408cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 418cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn/** 428cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * A wallpaper service is responsible for showing a live wallpaper behind 438cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * applications that would like to sit on top of it. 444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * @hide Live Wallpaper 458cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn */ 468cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackbornpublic abstract class WallpaperService extends Service { 478cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn /** 488cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn * The {@link Intent} that must be declared as handled by the service. 498cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn */ 508cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public static final String SERVICE_INTERFACE = 518cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn "android.service.wallpaper.WallpaperService"; 528cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 53eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn /** 54eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * Name under which a WallpaperService component publishes information 55eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * about itself. This meta-data must reference an XML resource containing 56eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * a <code><{@link android.R.styleable#Wallpaper wallpaper}></code> 57eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * tag. 58eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn */ 59eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn public static final String SERVICE_META_DATA = "android.service.wallpaper"; 60eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn static final String TAG = "WallpaperService"; 6272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn static final boolean DEBUG = false; 634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private static final int DO_ATTACH = 10; 654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private static final int DO_DETACH = 20; 66284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn private static final int DO_SET_DESIRED_SIZE = 30; 674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private static final int MSG_UPDATE_SURFACE = 10000; 69759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn private static final int MSG_VISIBILITY_CHANGED = 10010; 7072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn private static final int MSG_WALLPAPER_OFFSETS = 10020; 717341d7a104b47996445d069a695e155a07184606Dianne Hackborn private static final int MSG_WINDOW_RESIZED = 10030; 728df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn private static final int MSG_TOUCH_EVENT = 10040; 734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 748cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn /** 754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * The actual implementation of a wallpaper. A wallpaper service may 764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * have multiple instances running (for example as a real wallpaper 774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * and as a preview), each of which is represented by its own Engine 78759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * instance. You must implement {@link WallpaperService#onCreateEngine()} 79759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * to return your concrete Engine implementation. 808cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn */ 814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public class Engine { 824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperEngineWrapper mIWallpaperEngine; 834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Copies from mIWallpaperEngine. 854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn HandlerCaller mCaller; 864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperConnection mConnection; 874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IBinder mWindowToken; 884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean mInitializing = true; 90284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn boolean mVisible; 91284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn boolean mDestroyed; 924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Current window state. 944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean mCreated; 954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean mIsCreating; 964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean mDrawingAllowed; 974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mWidth; 984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mHeight; 994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mFormat; 1004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mType; 10172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn int mCurWidth; 10272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn int mCurHeight; 1038df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn int mWindowFlags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; 1048df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn int mCurWindowFlags = mWindowFlags; 1054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean mDestroyReportNeeded; 1064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final Rect mVisibleInsets = new Rect(); 1074c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final Rect mWinFrame = new Rect(); 1084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final Rect mContentInsets = new Rect(); 1094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final WindowManager.LayoutParams mLayout 1114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn = new WindowManager.LayoutParams(); 1124c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWindowSession mSession; 1138cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 11472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn final Object mLock = new Object(); 11572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn boolean mOffsetMessageEnqueued; 11672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn float mPendingXOffset; 11772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn float mPendingYOffset; 1188df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn MotionEvent mPendingMove; 11972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 1204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() { 1214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn @Override 1234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public boolean onAllowLockCanvas() { 1244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return mDrawingAllowed; 1254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn @Override 1284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onRelayoutContainer() { 1294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE); 1304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller.sendMessage(msg); 1314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn @Override 1344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onUpdateSurface() { 1354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Message msg = mCaller.obtainMessage(MSG_UPDATE_SURFACE); 1364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller.sendMessage(msg); 1374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1388cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 1394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public boolean isCreating() { 1404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return mIsCreating; 1414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 143284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn @Override 144284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public void setFixedSize(int width, int height) { 145284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn throw new UnsupportedOperationException( 146284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn "Wallpapers currently only support sizing from layout"); 147284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 148284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 1494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void setKeepScreenOn(boolean screenOn) { 150284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn throw new UnsupportedOperationException( 151284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn "Wallpapers do not support keep screen on"); 1524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn }; 1558cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 1564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final BaseIWindow mWindow = new BaseIWindow() { 1578df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn @Override 1588df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn public boolean onDispatchPointer(MotionEvent event, long eventTime, 1598df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn boolean callWhenDone) { 1608df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn synchronized (mLock) { 1618df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn if (event.getAction() == MotionEvent.ACTION_MOVE) { 1628df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn if (mPendingMove != null) { 1638df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mCaller.removeMessages(MSG_TOUCH_EVENT, mPendingMove); 1648df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mPendingMove.recycle(); 1658df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 1668df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mPendingMove = event; 1678df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } else { 1688df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mPendingMove = null; 1698df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 1708df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn Message msg = mCaller.obtainMessageO(MSG_TOUCH_EVENT, 1718df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn event); 1728df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mCaller.sendMessage(msg); 1738df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 1748df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn return false; 1758df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 1768df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn 1778df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn @Override 1787341d7a104b47996445d069a695e155a07184606Dianne Hackborn public void resized(int w, int h, Rect coveredInsets, 1797341d7a104b47996445d069a695e155a07184606Dianne Hackborn Rect visibleInsets, boolean reportDraw) { 1807341d7a104b47996445d069a695e155a07184606Dianne Hackborn Message msg = mCaller.obtainMessageI(MSG_WINDOW_RESIZED, 1817341d7a104b47996445d069a695e155a07184606Dianne Hackborn reportDraw ? 1 : 0); 1827341d7a104b47996445d069a695e155a07184606Dianne Hackborn mCaller.sendMessage(msg); 1837341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 1847341d7a104b47996445d069a695e155a07184606Dianne Hackborn 1858df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn @Override 186759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public void dispatchAppVisibility(boolean visible) { 187284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // We don't do this in preview mode; we'll let the preview 188284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // activity tell us when to run. 189284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (!mIWallpaperEngine.mIsPreview) { 190284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED, 191284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn visible ? 1 : 0); 192284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mCaller.sendMessage(msg); 193284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 194759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 19572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 19672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn @Override 19772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn public void dispatchWallpaperOffsets(float x, float y) { 19872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn synchronized (mLock) { 19972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mPendingXOffset = x; 20072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mPendingYOffset = y; 20172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn if (!mOffsetMessageEnqueued) { 20272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mOffsetMessageEnqueued = true; 20372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn Message msg = mCaller.obtainMessage(MSG_WALLPAPER_OFFSETS); 20472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mCaller.sendMessage(msg); 20572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 20672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 20772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 20872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 2094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn }; 2104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 211759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 212759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Provides access to the surface in which this wallpaper is drawn. 213759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 214759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public SurfaceHolder getSurfaceHolder() { 215759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn return mSurfaceHolder; 216759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 217759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 218759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 219759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link WallpaperManager#getDesiredMinimumWidth() 220759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * WallpaperManager.getDesiredMinimumWidth()}, returning the width 221759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * that the system would like this wallpaper to run in. 222759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 223759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public int getDesiredMinimumWidth() { 224759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn return mIWallpaperEngine.mReqWidth; 225759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 226759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 227759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 228759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link WallpaperManager#getDesiredMinimumHeight() 229759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * WallpaperManager.getDesiredMinimumHeight()}, returning the height 230759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * that the system would like this wallpaper to run in. 231759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 232759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public int getDesiredMinimumHeight() { 233759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn return mIWallpaperEngine.mReqHeight; 234759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 235759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 236759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 237284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * Return whether the wallpaper is currently visible to the user, 238284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * this is the last value supplied to 239284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * {@link #onVisibilityChanged(boolean)}. 240284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn */ 241284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public boolean isVisible() { 242284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return mVisible; 243284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 244284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 245284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn /** 2463be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn * Returns true if this engine is running in preview mode -- that is, 2473be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn * it is being shown to the user before they select it as the actual 2483be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn * wallpaper. 2493be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn */ 2503be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn public boolean isPreview() { 2513be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn return mIWallpaperEngine.mIsPreview; 2523be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 2533be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn 2543be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn /** 2558df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * Control whether this wallpaper will receive raw touch events 2568df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * from the window manager as the user interacts with the window 2578df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * that is currently displaying the wallpaper. By default they 2588df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * are turned off. If enabled, the events will be received in 2598df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * {@link #onTouchEvent(MotionEvent)}. 2608df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn */ 2618df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn public void setTouchEventsEnabled(boolean enabled) { 2628df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mWindowFlags = enabled 2638df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn ? (mWindowFlags&~WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) 2648df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn : (mWindowFlags|WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 2658df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn if (mCreated) { 266cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn updateSurface(false, false); 2678df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 2688df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 2698df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn 2708df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn /** 271759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Called once to initialize the engine. After returning, the 272759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * engine's surface will be created by the framework. 273759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 274759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public void onCreate(SurfaceHolder surfaceHolder) { 2754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 2764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 277759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 278759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Called right before the engine is going away. After this the 279759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * surface will be destroyed and this Engine object is no longer 280759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * valid. 281759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 282759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public void onDestroy() { 2834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 2844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 285759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 286759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Called to inform you of the wallpaper becoming visible or 287759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * hidden. <em>It is very important that a wallpaper only use 288759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * CPU while it is visible.</em>. 289759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 290759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn public void onVisibilityChanged(boolean visible) { 291759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 292759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 293759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 2948df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * Called as the user performs touch-screen interaction with the 2958df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * window that is currently showing this wallpaper. Note that the 2968df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * events you receive here are driven by the actual application the 2978df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * user is interacting with, so if it is slow you will get viewer 2988df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn * move events. 2998df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn */ 3008df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn public void onTouchEvent(MotionEvent event) { 3018df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 3028df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn 3038df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn /** 30472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn * Called to inform you of the wallpaper's offsets changing 30572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn * within its contain, corresponding to the container's 30672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn * call to {@link WallpaperManager#setWallpaperOffsets(IBinder, float, float) 30772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn * WallpaperManager.setWallpaperOffsets()}. 30872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn */ 30972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn public void onOffsetsChanged(float xOffset, float yOffset, 31072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn int xPixelOffset, int yPixelOffset) { 31172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 31272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 31372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn /** 314284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * Called when an application has changed the desired virtual size of 315284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn * the wallpaper. 316284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn */ 317284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public void onDesiredSizeChanged(int desiredWidth, int desiredHeight) { 318284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 319284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 320284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn /** 321759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link SurfaceHolder.Callback#surfaceChanged 322759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * SurfaceHolder.Callback.surfaceChanged()}. 323759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 3244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { 3254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3268cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 327759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 328759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link SurfaceHolder.Callback#surfaceCreated 329759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * SurfaceHolder.Callback.surfaceCreated()}. 330759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 3314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onSurfaceCreated(SurfaceHolder holder) { 3324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3338cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 334759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn /** 335759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * Convenience for {@link SurfaceHolder.Callback#surfaceDestroyed 336759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn * SurfaceHolder.Callback.surfaceDestroyed()}. 337759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn */ 3384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void onSurfaceDestroyed(SurfaceHolder holder) { 3398cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 3408cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 341cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn void updateSurface(boolean forceRelayout, boolean forceReport) { 342284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mDestroyed) { 343284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Log.w(TAG, "Ignoring updateSurface: destroyed"); 344284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 345284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 3464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int myWidth = mSurfaceHolder.getRequestedWidth(); 34772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn if (myWidth <= 0) myWidth = ViewGroup.LayoutParams.FILL_PARENT; 3484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int myHeight = mSurfaceHolder.getRequestedHeight(); 34972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn if (myHeight <= 0) myHeight = ViewGroup.LayoutParams.FILL_PARENT; 3504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 3514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final boolean creating = !mCreated; 3524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final boolean formatChanged = mFormat != mSurfaceHolder.getRequestedFormat(); 3537341d7a104b47996445d069a695e155a07184606Dianne Hackborn boolean sizeChanged = mWidth != myWidth || mHeight != myHeight; 3544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final boolean typeChanged = mType != mSurfaceHolder.getRequestedType(); 3558df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn final boolean flagsChanged = mCurWindowFlags != mWindowFlags; 356cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn if (forceRelayout || creating || formatChanged || sizeChanged 357cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn || typeChanged || flagsChanged) { 3584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 359284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "Changes: creating=" + creating 3604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + " format=" + formatChanged + " size=" + sizeChanged); 3614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 3624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn try { 3634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWidth = myWidth; 3644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mHeight = myHeight; 3654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mFormat = mSurfaceHolder.getRequestedFormat(); 3664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mType = mSurfaceHolder.getRequestedType(); 3674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 3684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.x = 0; 3694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.y = 0; 3704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.width = myWidth; 3714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.height = myHeight; 3724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 3734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.format = mFormat; 3748df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn 3758df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mCurWindowFlags = mWindowFlags; 3768df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mLayout.flags = mWindowFlags 3778df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 3788df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 3798df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 3808df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn ; 3814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 3824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.memoryType = mType; 3834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.token = mWindowToken; 3844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 3854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (!mCreated) { 3863be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLayout.type = mIWallpaperEngine.mWindowType; 3874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mLayout.gravity = Gravity.LEFT|Gravity.TOP; 3880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mLayout.setTitle(WallpaperService.this.getClass().getName()); 389284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mLayout.windowAnimations = 390284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.style.Animation_Wallpaper; 3914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSession.add(mWindow, mLayout, View.VISIBLE, mContentInsets); 3924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 3934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 3944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSurfaceHolder.mSurfaceLock.lock(); 3954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mDrawingAllowed = true; 3964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 3974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final int relayoutResult = mSession.relayout( 3984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWindow, mLayout, mWidth, mHeight, 3994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn View.VISIBLE, false, mWinFrame, mContentInsets, 4004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mVisibleInsets, mSurfaceHolder.mSurface); 4014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 402284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface 4034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + ", frame=" + mWinFrame); 4044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4057341d7a104b47996445d069a695e155a07184606Dianne Hackborn int w = mWinFrame.width(); 4067341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (mCurWidth != w) { 4077341d7a104b47996445d069a695e155a07184606Dianne Hackborn sizeChanged = true; 4087341d7a104b47996445d069a695e155a07184606Dianne Hackborn mCurWidth = w; 4097341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 4107341d7a104b47996445d069a695e155a07184606Dianne Hackborn int h = mWinFrame.height(); 4117341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (mCurHeight != h) { 4127341d7a104b47996445d069a695e155a07184606Dianne Hackborn sizeChanged = true; 4137341d7a104b47996445d069a695e155a07184606Dianne Hackborn mCurHeight = h; 4147341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 41572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 4164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSurfaceHolder.mSurfaceLock.unlock(); 4174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn try { 4194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mDestroyReportNeeded = true; 4204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn SurfaceHolder.Callback callbacks[] = null; 4224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn synchronized (mSurfaceHolder.mCallbacks) { 4234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final int N = mSurfaceHolder.mCallbacks.size(); 4244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (N > 0) { 4254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn callbacks = new SurfaceHolder.Callback[N]; 4264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSurfaceHolder.mCallbacks.toArray(callbacks); 4274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (!mCreated) { 4314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mIsCreating = true; 432284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onSurfaceCreated(" 433284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + mSurfaceHolder + "): " + this); 4344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn onSurfaceCreated(mSurfaceHolder); 4354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (callbacks != null) { 4364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn for (SurfaceHolder.Callback c : callbacks) { 4374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn c.surfaceCreated(mSurfaceHolder); 4384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 441cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn if (forceReport || creating || formatChanged || sizeChanged) { 442cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn if (DEBUG) { 443cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn RuntimeException e = new RuntimeException(); 444cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn e.fillInStackTrace(); 445cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn Log.w(TAG, "forceReport=" + forceReport + " creating=" + creating 446cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn + " formatChanged=" + formatChanged 447cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn + " sizeChanged=" + sizeChanged, e); 448cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn } 449284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onSurfaceChanged(" 450284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + mSurfaceHolder + ", " + mFormat 451284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + ", " + mCurWidth + ", " + mCurHeight 452284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + "): " + this); 45372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn onSurfaceChanged(mSurfaceHolder, mFormat, 45472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mCurWidth, mCurHeight); 4554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (callbacks != null) { 4564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn for (SurfaceHolder.Callback c : callbacks) { 45772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn c.surfaceChanged(mSurfaceHolder, mFormat, 45872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn mCurWidth, mCurHeight); 4594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } finally { 4634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mIsCreating = false; 4644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCreated = true; 4654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (creating || (relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) { 4664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSession.finishDrawing(mWindow); 4674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } catch (RemoteException ex) { 4704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (DEBUG) Log.v( 4724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn TAG, "Layout: x=" + mLayout.x + " y=" + mLayout.y + 4734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn " w=" + mLayout.width + " h=" + mLayout.height); 4744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn void attach(IWallpaperEngineWrapper wrapper) { 478cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn if (DEBUG) Log.v(TAG, "attach: " + this + " wrapper=" + wrapper); 479284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mDestroyed) { 480284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 481284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 482284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 4834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mIWallpaperEngine = wrapper; 4844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller = wrapper.mCaller; 4854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mConnection = wrapper.mConnection; 4864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWindowToken = wrapper.mWindowToken; 487284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mSurfaceHolder.setSizeFromLayout(); 4884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mInitializing = true; 4894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSession = ViewRoot.getWindowSession(getMainLooper()); 4904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWindow.setSession(mSession); 4914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 492284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onCreate(): " + this); 493759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn onCreate(mSurfaceHolder); 4944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 4954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mInitializing = false; 496cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn updateSurface(false, false); 4974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 4984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 499284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn void doDesiredSizeChanged(int desiredWidth, int desiredHeight) { 500284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (!mDestroyed) { 501284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onDesiredSizeChanged(" 502284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + desiredWidth + "," + desiredHeight + "): " + this); 503284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn onDesiredSizeChanged(desiredWidth, desiredHeight); 504284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 505284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 506284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 507284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn void doVisibilityChanged(boolean visible) { 508284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (!mDestroyed) { 509284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mVisible = visible; 510284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + visible 511284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + "): " + this); 512284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn onVisibilityChanged(visible); 513284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 514284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 515284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 516284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn void doOffsetsChanged() { 517284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mDestroyed) { 518284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 519284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 520284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 521284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn float xOffset; 522284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn float yOffset; 523284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn synchronized (mLock) { 524284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn xOffset = mPendingXOffset; 525284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn yOffset = mPendingYOffset; 526284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mOffsetMessageEnqueued = false; 527284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 528284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "Offsets change in " + this 529284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + ": " + xOffset + "," + yOffset); 530284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn final int availw = mIWallpaperEngine.mReqWidth-mCurWidth; 531284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn final int xPixels = availw > 0 ? -(int)(availw*xOffset+.5f) : 0; 532284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn final int availh = mIWallpaperEngine.mReqHeight-mCurHeight; 533284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn final int yPixels = availh > 0 ? -(int)(availh*yOffset+.5f) : 0; 534284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn onOffsetsChanged(xOffset, yOffset, xPixels, yPixels); 535284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 536284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 5374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn void detach() { 538284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mDestroyed = true; 539284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 540284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mVisible) { 541284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mVisible = false; 542284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onVisibilityChanged(false): " + this); 543284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn onVisibilityChanged(false); 544284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 545284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 5464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (mDestroyReportNeeded) { 5474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mDestroyReportNeeded = false; 5484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn SurfaceHolder.Callback callbacks[]; 5494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn synchronized (mSurfaceHolder.mCallbacks) { 5504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn callbacks = new SurfaceHolder.Callback[ 5514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSurfaceHolder.mCallbacks.size()]; 5524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSurfaceHolder.mCallbacks.toArray(callbacks); 5534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn for (SurfaceHolder.Callback c : callbacks) { 5554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn c.surfaceDestroyed(mSurfaceHolder); 5564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 557284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onSurfaceDestroyed(" 558284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn + mSurfaceHolder + "): " + this); 559284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn onSurfaceDestroyed(mSurfaceHolder); 5604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 561284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 562284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (DEBUG) Log.v(TAG, "onDestroy(): " + this); 563284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn onDestroy(); 564284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 5654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (mCreated) { 5664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn try { 5674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mSession.remove(mWindow); 5684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } catch (RemoteException e) { 5694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5700586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mSurfaceHolder.mSurface.release(); 5714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCreated = false; 5724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 5754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn class IWallpaperEngineWrapper extends IWallpaperEngine.Stub 5774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn implements HandlerCaller.Callback { 5784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private final HandlerCaller mCaller; 5794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final IWallpaperConnection mConnection; 5814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final IBinder mWindowToken; 5823be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn final int mWindowType; 5833be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn final boolean mIsPreview; 5844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mReqWidth; 5854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int mReqHeight; 5864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Engine mEngine; 5884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 5894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperEngineWrapper(WallpaperService context, 5904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn IWallpaperConnection conn, IBinder windowToken, 5913be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn int windowType, boolean isPreview, int reqWidth, int reqHeight) { 5924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller = new HandlerCaller(context, this); 5934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mConnection = conn; 5944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWindowToken = windowToken; 5953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mWindowType = windowType; 5963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mIsPreview = isPreview; 5974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mReqWidth = reqWidth; 5984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mReqHeight = reqHeight; 5994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 6004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Message msg = mCaller.obtainMessage(DO_ATTACH); 6014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller.sendMessage(msg); 6024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 604284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public void setDesiredSize(int width, int height) { 605284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Message msg = mCaller.obtainMessageII(DO_SET_DESIRED_SIZE, width, height); 606284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mCaller.sendMessage(msg); 607284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 608284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 609284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn public void setVisibility(boolean visible) { 610284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Message msg = mCaller.obtainMessageI(MSG_VISIBILITY_CHANGED, 611284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn visible ? 1 : 0); 612284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mCaller.sendMessage(msg); 613284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 614284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn 6154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public void destroy() { 6164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Message msg = mCaller.obtainMessage(DO_DETACH); 6174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mCaller.sendMessage(msg); 6188cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 6198cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn 6208cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn public void executeMessage(Message message) { 6218cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn switch (message.what) { 6224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn case DO_ATTACH: { 623284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn try { 624284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mConnection.attachEngine(this); 625284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } catch (RemoteException e) { 626284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn Log.w(TAG, "Wallpaper host disappeared", e); 627284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 628284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 6294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Engine engine = onCreateEngine(); 6304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mEngine = engine; 6314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn engine.attach(this); 6328cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn return; 6334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn case DO_DETACH: { 6354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mEngine.detach(); 6364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return; 6374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 638284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn case DO_SET_DESIRED_SIZE: { 639284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mEngine.doDesiredSizeChanged(message.arg1, message.arg2); 640284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 641284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 6424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn case MSG_UPDATE_SURFACE: 643cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn mEngine.updateSurface(true, false); 6444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn break; 645759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn case MSG_VISIBILITY_CHANGED: 646759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if (DEBUG) Log.v(TAG, "Visibility change in " + mEngine 647759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn + ": " + message.arg1); 648284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mEngine.doVisibilityChanged(message.arg1 != 0); 649759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn break; 65072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn case MSG_WALLPAPER_OFFSETS: { 651284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn mEngine.doOffsetsChanged(); 65272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } break; 6537341d7a104b47996445d069a695e155a07184606Dianne Hackborn case MSG_WINDOW_RESIZED: { 6547341d7a104b47996445d069a695e155a07184606Dianne Hackborn final boolean reportDraw = message.arg1 != 0; 655cbf15048240ecf460957ac3de98a7efbccbbb754Dianne Hackborn mEngine.updateSurface(true, false); 6567341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (reportDraw) { 6577341d7a104b47996445d069a695e155a07184606Dianne Hackborn try { 6587341d7a104b47996445d069a695e155a07184606Dianne Hackborn mEngine.mSession.finishDrawing(mEngine.mWindow); 6597341d7a104b47996445d069a695e155a07184606Dianne Hackborn } catch (RemoteException e) { 6607341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 6617341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 6627341d7a104b47996445d069a695e155a07184606Dianne Hackborn } break; 6638df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn case MSG_TOUCH_EVENT: { 6648df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn MotionEvent ev = (MotionEvent)message.obj; 6658df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn synchronized (mEngine.mLock) { 6668df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn if (mEngine.mPendingMove == ev) { 6678df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mEngine.mPendingMove = null; 6688df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 6698df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } 6708df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn mEngine.onTouchEvent(ev); 6718df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn ev.recycle(); 6728df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn } break; 6738cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn default : 6744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn Log.w(TAG, "Unknown message type " + message.what); 6758cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 6768cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 6778cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn } 6784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 6794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn /** 6804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * Implements the internal {@link IWallpaperService} interface to convert 6814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * incoming calls to it back to calls on an {@link WallpaperService}. 6824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn */ 6834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn class IWallpaperServiceWrapper extends IWallpaperService.Stub { 6844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn private final WallpaperService mTarget; 6854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 6864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public IWallpaperServiceWrapper(WallpaperService context) { 6874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mTarget = context; 6884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 6903be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn public void attach(IWallpaperConnection conn, IBinder windowToken, 6913be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn int windowType, boolean isPreview, int reqWidth, int reqHeight) { 6923be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn new IWallpaperEngineWrapper(mTarget, conn, windowToken, 6933be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn windowType, isPreview, reqWidth, reqHeight); 6944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 6964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 6974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn /** 6984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * Implement to return the implementation of the internal accessibility 6994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn * service interface. Subclasses should not override. 7004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn */ 7014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn @Override 7024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public final IBinder onBind(Intent intent) { 7034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return new IWallpaperServiceWrapper(this); 7044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 7054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 7064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn public abstract Engine onCreateEngine(); 7078cc6a5026aeb5cf9cc36529426fe0cc66714f5fbDianne Hackborn} 708