DreamService.java revision f6d466895b74d620d646abbec1c8911f3a0ce0bb
1be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn/** 2be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Copyright (C) 2012 The Android Open Source Project 3be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 4be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * you may not use this file except in compliance with the License. 6be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * You may obtain a copy of the License at 7be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 8be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 10be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * See the License for the specific language governing permissions and 14be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * limitations under the License. 15be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 16be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornpackage android.service.dreams; 17be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 182d78490292090eeab84694330978c9ad7fad2d37Daniel Sandlerimport java.io.FileDescriptor; 192d78490292090eeab84694330978c9ad7fad2d37Daniel Sandlerimport java.io.PrintWriter; 202d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 21be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.annotation.SdkConstant; 22be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.annotation.SdkConstant.SdkConstantType; 232687550272ba061448f5d5b914700dc335299ee7Jeff Brownimport android.app.AlarmManager; 24be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.app.Service; 25be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.content.Intent; 264c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackbornimport android.graphics.PixelFormat; 27be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.graphics.drawable.ColorDrawable; 28be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.Handler; 29be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.IBinder; 302687550272ba061448f5d5b914700dc335299ee7Jeff Brownimport android.os.RemoteException; 31be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.ServiceManager; 32be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.util.Slog; 33be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.ActionMode; 34be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.KeyEvent; 35be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.Menu; 36be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.MenuItem; 37be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.MotionEvent; 38be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.View; 39be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.ViewGroup; 40be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.Window; 41be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.WindowManager; 42c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandlerimport android.view.WindowManagerGlobal; 43be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.WindowManager.LayoutParams; 44be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.accessibility.AccessibilityEvent; 45be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 46be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport com.android.internal.policy.PolicyManager; 472687550272ba061448f5d5b914700dc335299ee7Jeff Brownimport com.android.internal.util.DumpUtils; 482687550272ba061448f5d5b914700dc335299ee7Jeff Brownimport com.android.internal.util.DumpUtils.Dump; 49be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 50be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn/** 516c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * Extend this class to implement a custom dream (available to the user as a "Daydream"). 52be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 53be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Dreams are interactive screensavers launched when a charging device is idle, or docked in a 54be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * desk dock. Dreams provide another modality for apps to express themselves, tailored for 55be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * an exhibition/lean-back experience.</p> 56be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 576c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * <p>The {@code DreamService} lifecycle is as follows:</p> 586237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <ol> 596237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onAttachedToWindow} 606237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Use this for initial setup, such as calling {@link #setContentView setContentView()}.</li> 616237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onDreamingStarted} 626237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Your dream has started, so you should begin animations or other behaviors here.</li> 636237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onDreamingStopped} 646237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Use this to stop the things you started in {@link #onDreamingStarted}.</li> 656237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onDetachedFromWindow} 666c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * <p>Use this to dismantle resources (for example, detach from handlers 676c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * and listeners).</li> 686237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * </ol> 692d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 702d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>In addition, onCreate and onDestroy (from the Service interface) will also be called, but 712d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * initialization and teardown should be done by overriding the hooks above.</p> 722d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 736c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * <p>To be available to the system, your {@code DreamService} should be declared in the 746c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * manifest as follows:</p> 75be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <pre> 763a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <service 77be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name=".MyDream" 78be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:exported="true" 79be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:icon="@drawable/my_icon" 80be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:label="@string/my_dream_label" > 81be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 823a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <intent-filter> 833a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <action android:name="android.service.dreams.DreamService" /> 843a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <category android:name="android.intent.category.DEFAULT" /> 853a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </intent-filter> 86be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 873a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <!-- Point to additional information for this dream (optional) --> 883a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <meta-data 89be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name="android.service.dream" 90be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:resource="@xml/my_dream" /> 913a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </service> 923a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </pre> 933a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * 946237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>If specified with the {@code <meta-data>} element, 956237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * additional information for the dream is defined using the 966237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link android.R.styleable#Dream <dream>} element in a separate XML file. 976237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * Currently, the only addtional 986237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * information you can provide is for a settings activity that allows the user to configure 996237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * the dream behavior. For example:</p> 1006237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p class="code-caption">res/xml/my_dream.xml</p> 1016237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <pre> 1023a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <dream xmlns:android="http://schemas.android.com/apk/res/android" 1033a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * android:settingsActivity="com.example.app/.MyDreamSettingsActivity" /> 104be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * </pre> 1056237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>This makes a Settings button available alongside your dream's listing in the 1066237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * system settings, which when pressed opens the specified activity.</p> 1076237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1086237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1096237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>To specify your dream layout, call {@link #setContentView}, typically during the 1106237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow} callback. For example:</p> 1116237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <pre> 1126237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * public class MyDream extends DreamService { 1136237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1146237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * @Override 1156237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * public void onAttachedToWindow() { 1166237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * super.onAttachedToWindow(); 1176237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1186237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Exit dream upon user touch 1196237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setInteractive(false); 1206237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Hide system UI 1216237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setFullscreen(true); 1226237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Set the dream layout 1236237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setContentView(R.layout.dream); 1246237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * } 1256237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * } 1266237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * </pre> 127eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * 128eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * <p>When targeting api level 21 and above, you must declare the service in your manifest file 129eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * with the {@link android.Manifest.permission#BIND_DREAM_SERVICE} permission. For example:</p> 130eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * <pre> 131eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * <service 132eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * android:name=".MyDream" 133eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * android:exported="true" 134eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * android:icon="@drawable/my_icon" 135eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * android:label="@string/my_dream_label" 136eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * android:permission="android.permission.BIND_DREAM_SERVICE" > 137eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * ... 138eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * </service> 139eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * </pre> 140be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 141be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornpublic class DreamService extends Service implements Window.Callback { 142be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final String TAG = DreamService.class.getSimpleName() + "[" + getClass().getSimpleName() + "]"; 143be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 144be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 145be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The name of the dream manager service. 146be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @hide 147be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 148be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_SERVICE = "dreams"; 149be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 150be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 151be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The {@link Intent} that must be declared as handled by the service. 152be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 153be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @SdkConstant(SdkConstantType.SERVICE_ACTION) 154be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String SERVICE_INTERFACE = 155be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn "android.service.dreams.DreamService"; 156be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 157be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 158be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Name under which a Dream publishes information about itself. 159be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * This meta-data must reference an XML resource containing 160be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * a <code><{@link android.R.styleable#Dream dream}></code> 161be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * tag. 162be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 163be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_META_DATA = "android.service.dream"; 164be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1652687550272ba061448f5d5b914700dc335299ee7Jeff Brown private final IDreamManager mSandman; 166be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final Handler mHandler = new Handler(); 167be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IBinder mWindowToken; 168be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private Window mWindow; 169344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown private boolean mInteractive; 170be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mLowProfile = true; 171344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown private boolean mFullscreen; 172a934fd142ec59b297b31c1f0b664e0c0d5e61ebaChris Wren private boolean mScreenBright = true; 173344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown private boolean mStarted; 174f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown private boolean mWaking; 175be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFinished; 1762687550272ba061448f5d5b914700dc335299ee7Jeff Brown private boolean mCanDoze; 1772687550272ba061448f5d5b914700dc335299ee7Jeff Brown private boolean mDozing; 178bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private boolean mWindowless; 1792687550272ba061448f5d5b914700dc335299ee7Jeff Brown private DozeHardware mDozeHardware; 180be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1812d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private boolean mDebug = false; 1822d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 1832687550272ba061448f5d5b914700dc335299ee7Jeff Brown public DreamService() { 1842687550272ba061448f5d5b914700dc335299ee7Jeff Brown mSandman = IDreamManager.Stub.asInterface(ServiceManager.getService(DREAM_SERVICE)); 1852687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 1862687550272ba061448f5d5b914700dc335299ee7Jeff Brown 1872d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 1882d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @hide 1892d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 1902d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void setDebug(boolean dbg) { 1912d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mDebug = dbg; 1922d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 1932d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 194be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin Window.Callback methods 195be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 196be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 197be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyEvent(KeyEvent event) { 198be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // TODO: create more flexible version of mInteractive that allows use of KEYCODE_BACK 199be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 200f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on keyEvent"); 201f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 202be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 203be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 204f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on back key"); 205f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 206be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 207be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 208be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyEvent(event); 209be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 210be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 211be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 212be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 213be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyShortcutEvent(KeyEvent event) { 2142d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 215f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on keyShortcutEvent"); 216f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 217be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 218be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 219be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyShortcutEvent(event); 220be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 221be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 222be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 223be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 224be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTouchEvent(MotionEvent event) { 2252d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // TODO: create more flexible version of mInteractive that allows clicks 226be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // but finish()es on any other kind of activity 2272d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 228f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on touchEvent"); 229f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 230be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 231be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 232be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTouchEvent(event); 233be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 234be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 235be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 236be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 237be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTrackballEvent(MotionEvent event) { 238be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 239f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on trackballEvent"); 240f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 241be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 242be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 243be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTrackballEvent(event); 244be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 245be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 246be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 247be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 248be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchGenericMotionEvent(MotionEvent event) { 2492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 250f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on genericMotionEvent"); 251f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 252be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 253be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 254be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchGenericMotionEvent(event); 255be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 256be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 257be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 258be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 259be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 260be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 261be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 262be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 263be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 264be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 265be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View onCreatePanelView(int featureId) { 266be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 267be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 268be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 269be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 270be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 271be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onCreatePanelMenu(int featureId, Menu menu) { 272be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 273be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 274be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 275be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 276be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 277be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onPreparePanel(int featureId, View view, Menu menu) { 278be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 279be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 280be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 281be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 282be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 283be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuOpened(int featureId, Menu menu) { 284be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 285be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 286be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 287be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 288be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 289be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuItemSelected(int featureId, MenuItem item) { 290be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 291be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 292be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 293be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 294be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 295be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowAttributesChanged(LayoutParams attrs) { 296be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 297be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 298be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 299be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 300be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onContentChanged() { 301be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 302be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 303be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 304be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 305be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 306be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 307be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 308be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 309be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 310be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onAttachedToWindow() { 311be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 312be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 313be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 314be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 315be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDetachedFromWindow() { 316be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 317be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 318be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 319be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 320be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onPanelClosed(int featureId, Menu menu) { 321be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 322be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 323be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 324be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 325be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onSearchRequested() { 326be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 327be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 328be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 329be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 330be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 331be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback callback) { 332be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 333be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 334be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 335be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 336be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 337be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeStarted(ActionMode mode) { 338be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 339be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 340be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 341be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 342be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeFinished(ActionMode mode) { 343be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 344be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // end Window.Callback methods 345be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 346be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin public api 347be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 348be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.WindowManager} for the dream. 349be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindowManager()}. 350be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 351be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window manager, or null if the dream is not started. 352be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 353be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public WindowManager getWindowManager() { 354344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown return mWindow != null ? mWindow.getWindowManager() : null; 355be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 356be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 357be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 358be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.Window} for the dream. 359be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindow()}. 360be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 361be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window, or null if the dream is not started. 362be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 363be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public Window getWindow() { 364be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow; 365be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 366be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 367be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 368be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Inflates a layout resource and set it to be the content view for this Dream. 369be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#setContentView(int)}. 370be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 371be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 372be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 373be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param layoutResID Resource ID to be inflated. 3742d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 375be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 376be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 377be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 378be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(int layoutResID) { 379be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(layoutResID); 380be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 381be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 382be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 383be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 3846237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * Behaves similarly to {@link android.app.Activity#setContentView(android.view.View)} in an activity, 385be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * including using {@link ViewGroup.LayoutParams#MATCH_PARENT} as the layout height and width of the view. 386be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 3876237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Note: This requires a window, so you should usually call it during 3886237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow()} and never earlier (you <strong>cannot</strong> call it 3896237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * during {@link #onCreate}).</p> 390be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 391be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 392be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 393be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 394be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view) { 395be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view); 396be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 397be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 398be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 399be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 4002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Behaves similarly to 4016237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link android.app.Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)} 4026237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * in an activity. 403be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 4046237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Note: This requires a window, so you should usually call it during 4056237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow()} and never earlier (you <strong>cannot</strong> call it 4066237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * during {@link #onCreate}).</p> 407be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 408be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 409be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 410be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 411be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 412be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 413be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 414be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view, ViewGroup.LayoutParams params) { 415be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view, params); 416be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 417be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 418be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 419be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Adds a view to the Dream's window, leaving other content views in place. 420be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 421be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 422be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 423be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 424be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 425be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 426be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void addContentView(View view, ViewGroup.LayoutParams params) { 427be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().addContentView(view, params); 428be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 429be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 430be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 431be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Finds a view that was identified by the id attribute from the XML that 432be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * was processed in {@link #onCreate}. 433be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 434be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 435be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 436be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The view if found or null otherwise. 437be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 438be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View findViewById(int id) { 439be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindow().findViewById(id); 440be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 441be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 442be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 443be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as interactive to receive input events. 444be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 445be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Non-interactive dreams (default) will dismiss on the first input event.</p> 446be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 447be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Interactive dreams should call {@link #finish()} to dismiss themselves.</p> 448be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 449be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param interactive True if this dream will handle input events. 450be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 451be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setInteractive(boolean interactive) { 452be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mInteractive = interactive; 453be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 454be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 455be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 456be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is interactive. Defaults to false. 457be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 458be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setInteractive(boolean) 459be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 460be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isInteractive() { 461be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mInteractive; 462be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 463be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 464be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 465be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view. 466be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 467be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param lowProfile True to set View.SYSTEM_UI_FLAG_LOW_PROFILE 4684c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide There is no reason to have this -- dreams can set this flag 4694c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on their own content view, and from there can actually do the 4704c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * correct interactions with it (seeing when it is cleared etc). 471be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 472be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setLowProfile(boolean lowProfile) { 4732687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mLowProfile != lowProfile) { 4742687550272ba061448f5d5b914700dc335299ee7Jeff Brown mLowProfile = lowProfile; 4752687550272ba061448f5d5b914700dc335299ee7Jeff Brown int flag = View.SYSTEM_UI_FLAG_LOW_PROFILE; 4762687550272ba061448f5d5b914700dc335299ee7Jeff Brown applySystemUiVisibilityFlags(mLowProfile ? flag : 0, flag); 4772687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 478be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 479be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 480be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 481be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in low profile mode. Defaults to true. 482be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 483be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setLowProfile(boolean) 4844c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide 485be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 486be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isLowProfile() { 487be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_LOW_PROFILE, mLowProfile); 488be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 489be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 490be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 4914c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * Controls {@link android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} 4924c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on the dream's window. 493be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 4944c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @param fullscreen If true, the fullscreen flag will be set; else it 4954c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * will be cleared. 496be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 497be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setFullscreen(boolean fullscreen) { 4982687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mFullscreen != fullscreen) { 4992687550272ba061448f5d5b914700dc335299ee7Jeff Brown mFullscreen = fullscreen; 5002687550272ba061448f5d5b914700dc335299ee7Jeff Brown int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN; 5012687550272ba061448f5d5b914700dc335299ee7Jeff Brown applyWindowFlags(mFullscreen ? flag : 0, flag); 5022687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 503be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 504be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 505be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 506be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in fullscreen mode. Defaults to false. 507be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 508be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setFullscreen(boolean) 509be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 510be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isFullscreen() { 5114c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn return mFullscreen; 512be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 513be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 514be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 515be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as keeping the screen bright while dreaming. 516be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 517be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param screenBright True to keep the screen bright while dreaming. 518be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 519be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setScreenBright(boolean screenBright) { 5202687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mScreenBright != screenBright) { 5212687550272ba061448f5d5b914700dc335299ee7Jeff Brown mScreenBright = screenBright; 5222687550272ba061448f5d5b914700dc335299ee7Jeff Brown int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 5232687550272ba061448f5d5b914700dc335299ee7Jeff Brown applyWindowFlags(mScreenBright ? flag : 0, flag); 5242687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 525be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 526be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 527be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 5282687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Returns whether or not this dream keeps the screen bright while dreaming. 5292687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Defaults to false, allowing the screen to dim if necessary. 530be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 531be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setScreenBright(boolean) 532be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 533be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isScreenBright() { 534be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindowFlagValue(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, mScreenBright); 535be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 536be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 537be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 538bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * Marks this dream as windowless. Only available to doze dreams. 539bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * 540bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * @hide 541bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock */ 542bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public void setWindowless(boolean windowless) { 543bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindowless = windowless; 544bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 545bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 546bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock /** 547bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * Returns whether or not this dream is windowless. Only available to doze dreams. 548bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * 549bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * @hide 550bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock */ 551bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public boolean isWindowless() { 552bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock return mWindowless; 553bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 554bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 555bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock /** 5562687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Returns true if this dream is allowed to doze. 5572687550272ba061448f5d5b914700dc335299ee7Jeff Brown * <p> 5582687550272ba061448f5d5b914700dc335299ee7Jeff Brown * The value returned by this method is only meaningful when the dream has started. 5592687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p> 5602687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 5612687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @return True if this dream can doze. 5622687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @see #startDozing 5632687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @hide experimental 5642687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 5652687550272ba061448f5d5b914700dc335299ee7Jeff Brown public boolean canDoze() { 5662687550272ba061448f5d5b914700dc335299ee7Jeff Brown return mCanDoze; 5672687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 5682687550272ba061448f5d5b914700dc335299ee7Jeff Brown 5692687550272ba061448f5d5b914700dc335299ee7Jeff Brown /** 5702687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Starts dozing, entering a deep dreamy sleep. 5712687550272ba061448f5d5b914700dc335299ee7Jeff Brown * <p> 5722687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Dozing enables the system to conserve power while the user is not actively interacting 5732687550272ba061448f5d5b914700dc335299ee7Jeff Brown * with the device. While dozing, the display will remain on in a low-power state 5742687550272ba061448f5d5b914700dc335299ee7Jeff Brown * and will continue to show its previous contents but the application processor and 5752687550272ba061448f5d5b914700dc335299ee7Jeff Brown * other system components will be allowed to suspend when possible. 5762687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p><p> 5772687550272ba061448f5d5b914700dc335299ee7Jeff Brown * While the application processor is suspended, the dream may stop executing code 5782687550272ba061448f5d5b914700dc335299ee7Jeff Brown * for long periods of time. Prior to being suspended, the dream may schedule periodic 5792687550272ba061448f5d5b914700dc335299ee7Jeff Brown * wake-ups to render new content by scheduling an alarm with the {@link AlarmManager}. 5802687550272ba061448f5d5b914700dc335299ee7Jeff Brown * The dream may also keep the CPU awake by acquiring a 5812687550272ba061448f5d5b914700dc335299ee7Jeff Brown * {@link android.os.PowerManager#PARTIAL_WAKE_LOCK partial wake lock} when necessary. 5822687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Note that since the purpose of doze mode is to conserve power (especially when 5832687550272ba061448f5d5b914700dc335299ee7Jeff Brown * running on battery), the dream should not wake the CPU very often or keep it 5842687550272ba061448f5d5b914700dc335299ee7Jeff Brown * awake for very long. 5852687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p><p> 5862687550272ba061448f5d5b914700dc335299ee7Jeff Brown * It is a good idea to call this method some time after the dream's entry animation 5872687550272ba061448f5d5b914700dc335299ee7Jeff Brown * has completed and the dream is ready to doze. It is important to completely 5882687550272ba061448f5d5b914700dc335299ee7Jeff Brown * finish all of the work needed before dozing since the application processor may 5892687550272ba061448f5d5b914700dc335299ee7Jeff Brown * be suspended at any moment once this method is called unless other wake locks 5902687550272ba061448f5d5b914700dc335299ee7Jeff Brown * are being held. 5912687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p><p> 5922687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Call {@link #stopDozing} or {@link #finish} to stop dozing. 5932687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p> 5942687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 5952687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @see #stopDozing 5962687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @hide experimental 5972687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 5982687550272ba061448f5d5b914700dc335299ee7Jeff Brown public void startDozing() { 5992687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mCanDoze && !mDozing) { 6002687550272ba061448f5d5b914700dc335299ee7Jeff Brown mDozing = true; 6012687550272ba061448f5d5b914700dc335299ee7Jeff Brown try { 6022687550272ba061448f5d5b914700dc335299ee7Jeff Brown mSandman.startDozing(mWindowToken); 6032687550272ba061448f5d5b914700dc335299ee7Jeff Brown } catch (RemoteException ex) { 6042687550272ba061448f5d5b914700dc335299ee7Jeff Brown // system server died 6052687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6062687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6072687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6082687550272ba061448f5d5b914700dc335299ee7Jeff Brown 6092687550272ba061448f5d5b914700dc335299ee7Jeff Brown /** 6102687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Stops dozing, returns to active dreaming. 6112687550272ba061448f5d5b914700dc335299ee7Jeff Brown * <p> 6122687550272ba061448f5d5b914700dc335299ee7Jeff Brown * This method reverses the effect of {@link #startDozing}. From this moment onward, 6132687550272ba061448f5d5b914700dc335299ee7Jeff Brown * the application processor will be kept awake as long as the dream is running 6142687550272ba061448f5d5b914700dc335299ee7Jeff Brown * or until the dream starts dozing again. 6152687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p> 6162687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 6172687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @see #startDozing 6182687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @hide experimental 6192687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 6202687550272ba061448f5d5b914700dc335299ee7Jeff Brown public void stopDozing() { 6212687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mDozing) { 6222687550272ba061448f5d5b914700dc335299ee7Jeff Brown mDozing = false; 6232687550272ba061448f5d5b914700dc335299ee7Jeff Brown try { 6242687550272ba061448f5d5b914700dc335299ee7Jeff Brown mSandman.stopDozing(mWindowToken); 6252687550272ba061448f5d5b914700dc335299ee7Jeff Brown } catch (RemoteException ex) { 6262687550272ba061448f5d5b914700dc335299ee7Jeff Brown // system server died 6272687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6282687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6292687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6302687550272ba061448f5d5b914700dc335299ee7Jeff Brown 6312687550272ba061448f5d5b914700dc335299ee7Jeff Brown /** 6322687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Returns true if the dream will allow the system to enter a low-power state while 6332687550272ba061448f5d5b914700dc335299ee7Jeff Brown * it is running without actually turning off the screen. Defaults to false, 6342687550272ba061448f5d5b914700dc335299ee7Jeff Brown * keeping the application processor awake while the dream is running. 6352687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 6362687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @return True if the dream is dozing. 6372687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 6382687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @see #setDozing(boolean) 6392687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @hide experimental 6402687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 6412687550272ba061448f5d5b914700dc335299ee7Jeff Brown public boolean isDozing() { 6422687550272ba061448f5d5b914700dc335299ee7Jeff Brown return mDozing; 6432687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6442687550272ba061448f5d5b914700dc335299ee7Jeff Brown 6452687550272ba061448f5d5b914700dc335299ee7Jeff Brown /** 6462687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Gets an object that may be used to access low-level hardware features that a 6472687550272ba061448f5d5b914700dc335299ee7Jeff Brown * dream may use to provide a richer user experience while dozing. 6482687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 6492687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @return An instance of {@link DozeHardware} or null if this device does not offer 6502687550272ba061448f5d5b914700dc335299ee7Jeff Brown * hardware support for dozing. 6512687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 6522687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @hide experimental 6532687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 6542687550272ba061448f5d5b914700dc335299ee7Jeff Brown public DozeHardware getDozeHardware() { 655344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mCanDoze && mDozeHardware == null && mWindowToken != null) { 6562687550272ba061448f5d5b914700dc335299ee7Jeff Brown try { 6572687550272ba061448f5d5b914700dc335299ee7Jeff Brown IDozeHardware hardware = mSandman.getDozeHardware(mWindowToken); 6582687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (hardware != null) { 6592687550272ba061448f5d5b914700dc335299ee7Jeff Brown mDozeHardware = new DozeHardware(hardware); 6602687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6612687550272ba061448f5d5b914700dc335299ee7Jeff Brown } catch (RemoteException ex) { 6622687550272ba061448f5d5b914700dc335299ee7Jeff Brown // system server died 6632687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6642687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6652687550272ba061448f5d5b914700dc335299ee7Jeff Brown return mDozeHardware; 6662687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6672687550272ba061448f5d5b914700dc335299ee7Jeff Brown 6682687550272ba061448f5d5b914700dc335299ee7Jeff Brown /** 6692d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is constructed. 670be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 671be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 672be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onCreate() { 6732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onCreate() on thread " + Thread.currentThread().getId()); 674be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn super.onCreate(); 675be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 676be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 677be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 6782d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the dream's window has been created and is visible and animation may now begin. 6792d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 6802d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStarted() { 6812d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStarted()"); 6822d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 6832d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 6842d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 6852d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 6862d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is stopped, either by external request or by calling finish(), 6872d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * before the window has been removed. 688be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 6892d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStopped() { 6902d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStopped()"); 691be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // hook for subclasses 692be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 693be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 694f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown /** 695f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * Called when the dream is being asked to stop itself and wake. 696f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * <p> 697f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * The default implementation simply calls {@link #finish} which ends the dream 698f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * immediately. Subclasses may override this function to perform a smooth exit 699f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * transition then call {@link #finish} afterwards. 700f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * </p><p> 701f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * Note that the dream will only be given a short period of time (currently about 702f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * five seconds) to wake up. If the dream does not finish itself in a timely manner 703f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * then the system will forcibly finish it once the time allowance is up. 704f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * </p> 705f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown */ 706f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown public void onWakeUp() { 707f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown finish(); 708f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 709f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 710be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 711be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 712be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public final IBinder onBind(Intent intent) { 7132d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onBind() intent = " + intent); 714be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return new DreamServiceWrapper(); 715be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 716be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 717be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 7182687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Stops the dream and detaches from the window. 7192687550272ba061448f5d5b914700dc335299ee7Jeff Brown * <p> 7202687550272ba061448f5d5b914700dc335299ee7Jeff Brown * When the dream ends, the system will be allowed to go to sleep fully unless there 7212687550272ba061448f5d5b914700dc335299ee7Jeff Brown * is a reason for it to be awake such as recent user activity or wake locks being held. 7222687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p> 723be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 7242d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public final void finish() { 725f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "finish(): mFinished=" + mFinished); 726f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 727f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (!mFinished) { 728f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mFinished = true; 729f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 730f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mWindowToken == null) { 731f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown Slog.w(TAG, "Finish was called before the dream was attached."); 732f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } else { 733f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown try { 734f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mSandman.finishSelf(mWindowToken, true /*immediate*/); 735f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } catch (RemoteException ex) { 736f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // system server died 737f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 738f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 739f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 740f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown stopSelf(); // if launched via any other means 741f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 742f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 743f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 744f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown /** 745f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * Wakes the dream up gently. 746f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * <p> 747f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * Calls {@link #onWakeUp} to give the dream a chance to perform an exit transition. 748f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * When the transition is over, the dream should call {@link #finish}. 749f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * </p> 750f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown */ 751f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown public final void wakeUp() { 752f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(false); 753f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 754f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 755f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown private void wakeUp(boolean fromSystem) { 756f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "wakeUp(): fromSystem=" + fromSystem 757f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown + ", mWaking=" + mWaking + ", mFinished=" + mFinished); 758f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 759f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (!mWaking && !mFinished) { 760f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mWaking = true; 761f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 762f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // As a minor optimization, invoke the callback first in case it simply 763f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // calls finish() immediately so there wouldn't be much point in telling 764f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // the system that we are finishing the dream gently. 765f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown onWakeUp(); 766f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 767f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // Now tell the system we are waking gently, unless we already told 768f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // it we were finishing immediately. 769f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (!fromSystem && !mFinished) { 770f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mWindowToken == null) { 771f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown Slog.w(TAG, "WakeUp was called before the dream was attached."); 772f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } else { 773f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown try { 774f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mSandman.finishSelf(mWindowToken, false /*immediate*/); 775f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } catch (RemoteException ex) { 776f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // system server died 777f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 778f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 779f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 780f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 781be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 782be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 783be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 784be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 785be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDestroy() { 7862d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDestroy()"); 7872d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 788c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler 789c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // Just in case destroy came in before detach, let's take care of that now 790c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler detach(); 791c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler 792c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler super.onDestroy(); 7932d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7942d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 7952d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // end public api 7962d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 7972d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 798c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler * Called by DreamController.stopDream() when the Dream is about to be unbound and destroyed. 7992d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 8002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 8012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 8022d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private final void detach() { 803344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mStarted) { 804344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mDebug) Slog.v(TAG, "detach(): Calling onDreamingStopped()"); 805344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mStarted = false; 806344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown onDreamingStopped(); 8072d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 8082d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 809344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mWindow != null) { 810344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown // force our window to be removed synchronously 811344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mDebug) Slog.v(TAG, "detach(): Removing window from window manager"); 812344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mWindow.getWindowManager().removeViewImmediate(mWindow.getDecorView()); 813344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mWindow = null; 814344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown } 815be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 816344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mWindowToken != null) { 817344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown // the following will print a log message if it finds any other leaked windows 818344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown WindowManagerGlobal.getInstance().closeAll(mWindowToken, 819344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown this.getClass().getName(), "Dream"); 820344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mWindowToken = null; 821bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mCanDoze = false; 822344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown } 823be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 824be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 8252d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 8262d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the Dream is ready to be shown. 8272d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 8282d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 8292d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 8302d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @param windowToken A window token that will allow a window to be created in the correct layer. 8312d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 8322687550272ba061448f5d5b914700dc335299ee7Jeff Brown private final void attach(IBinder windowToken, boolean canDoze) { 8332d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindowToken != null) { 8342d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.e(TAG, "attach() called when already attached with token=" + mWindowToken); 8352d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 8362d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 837f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mFinished || mWaking) { 8382687550272ba061448f5d5b914700dc335299ee7Jeff Brown Slog.w(TAG, "attach() called after dream already finished"); 8392687550272ba061448f5d5b914700dc335299ee7Jeff Brown try { 840f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mSandman.finishSelf(windowToken, true /*immediate*/); 8412687550272ba061448f5d5b914700dc335299ee7Jeff Brown } catch (RemoteException ex) { 8422687550272ba061448f5d5b914700dc335299ee7Jeff Brown // system server died 8432687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 8442687550272ba061448f5d5b914700dc335299ee7Jeff Brown return; 8452687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 8462d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 8472d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Attached on thread " + Thread.currentThread().getId()); 848be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 849be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowToken = windowToken; 850344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mCanDoze = canDoze; 851bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (mWindowless && !mCanDoze) { 852bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock throw new IllegalStateException("Only doze dreams can be windowless"); 853344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown } 854bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (!mWindowless) { 855bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindow = PolicyManager.makeNewWindow(this); 856bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindow.setCallback(this); 857bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindow.requestFeature(Window.FEATURE_NO_TITLE); 858bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindow.setBackgroundDrawable(new ColorDrawable(0xFF000000)); 859bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindow.setFormat(PixelFormat.OPAQUE); 860be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 861bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (mDebug) Slog.v(TAG, String.format("Attaching window token: %s to window of type %s", 862bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock windowToken, WindowManager.LayoutParams.TYPE_DREAM)); 863bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 864bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock WindowManager.LayoutParams lp = mWindow.getAttributes(); 865bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock lp.type = WindowManager.LayoutParams.TYPE_DREAM; 866bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock lp.token = windowToken; 867bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock lp.windowAnimations = com.android.internal.R.style.Animation_Dream; 868bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock lp.flags |= ( WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 869bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR 870bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 871bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 872bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 873bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock | (mFullscreen ? WindowManager.LayoutParams.FLAG_FULLSCREEN : 0) 874bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock | (mScreenBright ? WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON : 0) 875bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock ); 876bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindow.setAttributes(lp); 877bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindow.setWindowManager(null, windowToken, "dream", true); 878bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 879bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock applySystemUiVisibilityFlags( 880bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock (mLowProfile ? View.SYSTEM_UI_FLAG_LOW_PROFILE : 0), 881bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock View.SYSTEM_UI_FLAG_LOW_PROFILE); 882bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 883bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock try { 884bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock getWindowManager().addView(mWindow.getDecorView(), mWindow.getAttributes()); 885bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } catch (WindowManager.BadTokenException ex) { 886bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock // This can happen because the dream manager service will remove the token 887bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock // immediately without necessarily waiting for the dream to start. 888bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock // We should receive a finish message soon. 889bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock Slog.i(TAG, "attach() called after window token already removed, dream will " 890bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock + "finish soon"); 891bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindow = null; 892bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock return; 893bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 894bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 895037c33eae74bee2774897d969d48947f9abe254fJeff Brown // We need to defer calling onDreamingStarted until after onWindowAttached, 896037c33eae74bee2774897d969d48947f9abe254fJeff Brown // which is posted to the handler by addView, so we post onDreamingStarted 897037c33eae74bee2774897d969d48947f9abe254fJeff Brown // to the handler also. Need to watch out here in case detach occurs before 898037c33eae74bee2774897d969d48947f9abe254fJeff Brown // this callback is invoked. 899037c33eae74bee2774897d969d48947f9abe254fJeff Brown mHandler.post(new Runnable() { 900037c33eae74bee2774897d969d48947f9abe254fJeff Brown @Override 901037c33eae74bee2774897d969d48947f9abe254fJeff Brown public void run() { 902bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (mWindow != null || mWindowless) { 903037c33eae74bee2774897d969d48947f9abe254fJeff Brown if (mDebug) Slog.v(TAG, "Calling onDreamingStarted()"); 904037c33eae74bee2774897d969d48947f9abe254fJeff Brown mStarted = true; 905037c33eae74bee2774897d969d48947f9abe254fJeff Brown onDreamingStarted(); 906037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 907037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 908037c33eae74bee2774897d969d48947f9abe254fJeff Brown }); 909be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 910be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 911be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getWindowFlagValue(int flag, boolean defaultValue) { 912be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow == null ? defaultValue : (mWindow.getAttributes().flags & flag) != 0; 913be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 914be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 915be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applyWindowFlags(int flags, int mask) { 916be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mWindow != null) { 917be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 918be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.flags = applyFlags(lp.flags, flags, mask); 919be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 920344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mWindow.getWindowManager().updateViewLayout(mWindow.getDecorView(), lp); 921be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 922be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 923be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 924be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getSystemUiVisibilityFlagValue(int flag, boolean defaultValue) { 925be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 926be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return v == null ? defaultValue : (v.getSystemUiVisibility() & flag) != 0; 927be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 928be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 929be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applySystemUiVisibilityFlags(int flags, int mask) { 930be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 931be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (v != null) { 932be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn v.setSystemUiVisibility(applyFlags(v.getSystemUiVisibility(), flags, mask)); 933be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 934be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 935be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 936be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private int applyFlags(int oldFlags, int flags, int mask) { 937be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return (oldFlags&~mask) | (flags&mask); 938be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 939be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 9402d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 9416612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock protected void dump(final FileDescriptor fd, PrintWriter pw, final String[] args) { 9422687550272ba061448f5d5b914700dc335299ee7Jeff Brown DumpUtils.dumpAsync(mHandler, new Dump() { 9432687550272ba061448f5d5b914700dc335299ee7Jeff Brown @Override 9442687550272ba061448f5d5b914700dc335299ee7Jeff Brown public void dump(PrintWriter pw) { 9456612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock dumpOnHandler(fd, pw, args); 9462687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 9472687550272ba061448f5d5b914700dc335299ee7Jeff Brown }, pw, 1000); 9482d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 9492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 9506612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock /** @hide */ 9516612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock protected void dumpOnHandler(FileDescriptor fd, PrintWriter pw, String[] args) { 9526612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.print(TAG + ": "); 9536612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (mWindowToken == null) { 9546612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.println("stopped"); 9556612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock } else { 9566612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.println("running (token=" + mWindowToken + ")"); 9576612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock } 9586612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.println(" window: " + mWindow); 9596612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.print(" flags:"); 9606612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isInteractive()) pw.print(" interactive"); 9616612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isLowProfile()) pw.print(" lowprofile"); 9626612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isFullscreen()) pw.print(" fullscreen"); 9636612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isScreenBright()) pw.print(" bright"); 9646612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isWindowless()) pw.print(" windowless"); 9656612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isDozing()) pw.print(" dozing"); 9666612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.println(); 9676612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock } 9686612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock 9692687550272ba061448f5d5b914700dc335299ee7Jeff Brown private final class DreamServiceWrapper extends IDreamService.Stub { 9702687550272ba061448f5d5b914700dc335299ee7Jeff Brown @Override 9712687550272ba061448f5d5b914700dc335299ee7Jeff Brown public void attach(final IBinder windowToken, final boolean canDoze) { 9722d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 9732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 9742d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 9752687550272ba061448f5d5b914700dc335299ee7Jeff Brown DreamService.this.attach(windowToken, canDoze); 9762d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 9772d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 9782d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 9792687550272ba061448f5d5b914700dc335299ee7Jeff Brown 9802687550272ba061448f5d5b914700dc335299ee7Jeff Brown @Override 9812d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void detach() { 9822d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 9832d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 9842d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 9852d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.detach(); 9862d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 9872d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 988be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 989be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 990f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown @Override 991f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown public void wakeUp() { 992f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mHandler.post(new Runnable() { 993f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown @Override 994f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown public void run() { 995f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown DreamService.this.wakeUp(true /*fromSystem*/); 996f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 997f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown }); 998f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 999f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 1000be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn} 1001