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 187b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.IdRes; 197b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.LayoutRes; 20c051955392840cb94bd6f0b2a8107a48d2ffc8b0Scott Kennedyimport android.annotation.Nullable; 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; 309ede1d260284bbf0b47ca6f0315e943058624520Adrian Roosimport android.os.IRemoteCallback; 31970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brownimport android.os.PowerManager; 32970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brownimport android.os.RemoteException; 33be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.ServiceManager; 3475e097965cc273d33192555b0e65de3dbc1753ceClara Bayarriimport android.util.MathUtils; 35be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.util.Slog; 36be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.ActionMode; 37970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brownimport android.view.Display; 38be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.KeyEvent; 39be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.Menu; 40be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.MenuItem; 41be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.MotionEvent; 426a975b3c3597a4ad9202432f3c3d867a03d43fa4Tim Kilbournimport android.view.SearchEvent; 43be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.View; 44be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.ViewGroup; 45be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.Window; 46be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.WindowManager; 47be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.WindowManager.LayoutParams; 4875e097965cc273d33192555b0e65de3dbc1753ceClara Bayarriimport android.view.WindowManagerGlobal; 49be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.accessibility.AccessibilityEvent; 50be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5175e097965cc273d33192555b0e65de3dbc1753ceClara Bayarriimport com.android.internal.policy.PhoneWindow; 522687550272ba061448f5d5b914700dc335299ee7Jeff Brownimport com.android.internal.util.DumpUtils; 532687550272ba061448f5d5b914700dc335299ee7Jeff Brownimport com.android.internal.util.DumpUtils.Dump; 54be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5575e097965cc273d33192555b0e65de3dbc1753ceClara Bayarriimport java.io.FileDescriptor; 5675e097965cc273d33192555b0e65de3dbc1753ceClara Bayarriimport java.io.PrintWriter; 5775e097965cc273d33192555b0e65de3dbc1753ceClara Bayarriimport java.util.List; 5875e097965cc273d33192555b0e65de3dbc1753ceClara Bayarri 59be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn/** 606c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * Extend this class to implement a custom dream (available to the user as a "Daydream"). 61be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 62be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Dreams are interactive screensavers launched when a charging device is idle, or docked in a 63be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * desk dock. Dreams provide another modality for apps to express themselves, tailored for 64be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * an exhibition/lean-back experience.</p> 65be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 666c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * <p>The {@code DreamService} lifecycle is as follows:</p> 676237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <ol> 686237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onAttachedToWindow} 696237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Use this for initial setup, such as calling {@link #setContentView setContentView()}.</li> 706237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onDreamingStarted} 716237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Your dream has started, so you should begin animations or other behaviors here.</li> 726237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onDreamingStopped} 736237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Use this to stop the things you started in {@link #onDreamingStarted}.</li> 746237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onDetachedFromWindow} 756c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * <p>Use this to dismantle resources (for example, detach from handlers 766c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * and listeners).</li> 776237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * </ol> 782d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 792d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>In addition, onCreate and onDestroy (from the Service interface) will also be called, but 802d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * initialization and teardown should be done by overriding the hooks above.</p> 812d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 826c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * <p>To be available to the system, your {@code DreamService} should be declared in the 836c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * manifest as follows:</p> 84be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <pre> 853a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <service 86be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name=".MyDream" 87be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:exported="true" 88be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:icon="@drawable/my_icon" 89be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:label="@string/my_dream_label" > 90be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 913a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <intent-filter> 923a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <action android:name="android.service.dreams.DreamService" /> 933a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <category android:name="android.intent.category.DEFAULT" /> 943a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </intent-filter> 95be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 963a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <!-- Point to additional information for this dream (optional) --> 973a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <meta-data 98be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name="android.service.dream" 99be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:resource="@xml/my_dream" /> 1003a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </service> 1013a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </pre> 1023a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * 10371fbb81b14958b80fe55738607740c6630e4e9daNeil Fuller * <p>If specified with the {@code <meta-data>} element, 1046237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * additional information for the dream is defined using the 1056237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link android.R.styleable#Dream <dream>} element in a separate XML file. 1066237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * Currently, the only addtional 1076237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * information you can provide is for a settings activity that allows the user to configure 1086237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * the dream behavior. For example:</p> 1096237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p class="code-caption">res/xml/my_dream.xml</p> 1106237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <pre> 1113a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <dream xmlns:android="http://schemas.android.com/apk/res/android" 1123a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * android:settingsActivity="com.example.app/.MyDreamSettingsActivity" /> 113be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * </pre> 1146237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>This makes a Settings button available alongside your dream's listing in the 1156237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * system settings, which when pressed opens the specified activity.</p> 1166237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1176237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1186237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>To specify your dream layout, call {@link #setContentView}, typically during the 1196237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow} callback. For example:</p> 1206237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <pre> 1216237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * public class MyDream extends DreamService { 1226237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1236237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * @Override 1246237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * public void onAttachedToWindow() { 1256237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * super.onAttachedToWindow(); 1266237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1276237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Exit dream upon user touch 1286237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setInteractive(false); 1296237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Hide system UI 1306237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setFullscreen(true); 1316237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Set the dream layout 1326237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setContentView(R.layout.dream); 1336237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * } 1346237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * } 1356237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * </pre> 136eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * 137eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * <p>When targeting api level 21 and above, you must declare the service in your manifest file 138eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * with the {@link android.Manifest.permission#BIND_DREAM_SERVICE} permission. For example:</p> 139eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * <pre> 140eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * <service 141eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * android:name=".MyDream" 142eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * android:exported="true" 143eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * android:icon="@drawable/my_icon" 144eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * android:label="@string/my_dream_label" 145970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * android:permission="android.permission.BIND_DREAM_SERVICE"> 146970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * <intent-filter> 147970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * <action android:name=”android.service.dreams.DreamService” /> 148970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * <category android:name=”android.intent.category.DEFAULT” /> 149970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * </intent-filter> 150eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * </service> 151eb8d1be6acad180eabde84f19196b9ecaba81353John Spurlock * </pre> 152be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 153be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornpublic class DreamService extends Service implements Window.Callback { 154be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final String TAG = DreamService.class.getSimpleName() + "[" + getClass().getSimpleName() + "]"; 155be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 156be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 157be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The name of the dream manager service. 158be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @hide 159be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 160be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_SERVICE = "dreams"; 161be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 162be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 163be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The {@link Intent} that must be declared as handled by the service. 164be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 165be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @SdkConstant(SdkConstantType.SERVICE_ACTION) 166be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String SERVICE_INTERFACE = 167be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn "android.service.dreams.DreamService"; 168be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 169be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 170be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Name under which a Dream publishes information about itself. 171be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * This meta-data must reference an XML resource containing 172be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * a <code><{@link android.R.styleable#Dream dream}></code> 173be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * tag. 174be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 175be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_META_DATA = "android.service.dream"; 176be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1772687550272ba061448f5d5b914700dc335299ee7Jeff Brown private final IDreamManager mSandman; 178be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final Handler mHandler = new Handler(); 179be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IBinder mWindowToken; 180be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private Window mWindow; 181344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown private boolean mInteractive; 182be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mLowProfile = true; 183344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown private boolean mFullscreen; 184a934fd142ec59b297b31c1f0b664e0c0d5e61ebaChris Wren private boolean mScreenBright = true; 185344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown private boolean mStarted; 186f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown private boolean mWaking; 187be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFinished; 1882687550272ba061448f5d5b914700dc335299ee7Jeff Brown private boolean mCanDoze; 1892687550272ba061448f5d5b914700dc335299ee7Jeff Brown private boolean mDozing; 190bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock private boolean mWindowless; 191970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown private int mDozeScreenState = Display.STATE_UNKNOWN; 192970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown private int mDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT; 193be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1942d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private boolean mDebug = false; 1952d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 1962687550272ba061448f5d5b914700dc335299ee7Jeff Brown public DreamService() { 1972687550272ba061448f5d5b914700dc335299ee7Jeff Brown mSandman = IDreamManager.Stub.asInterface(ServiceManager.getService(DREAM_SERVICE)); 1982687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 1992687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 2012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @hide 2022d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 2032d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void setDebug(boolean dbg) { 2042d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mDebug = dbg; 2052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 2062d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 207be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin Window.Callback methods 208be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 209be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 210be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyEvent(KeyEvent event) { 211be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // TODO: create more flexible version of mInteractive that allows use of KEYCODE_BACK 212be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 213f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on keyEvent"); 214f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 215be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 216be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 217f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on back key"); 218f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 219be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 220be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 221be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyEvent(event); 222be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 223be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 224be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 225be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 226be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyShortcutEvent(KeyEvent event) { 2272d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 228f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on keyShortcutEvent"); 229f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 230be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 231be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 232be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyShortcutEvent(event); 233be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 234be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 235be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 236be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 237be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTouchEvent(MotionEvent event) { 2382d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // TODO: create more flexible version of mInteractive that allows clicks 239be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // but finish()es on any other kind of activity 2402d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 241f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on touchEvent"); 242f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 243be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 244be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 245be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTouchEvent(event); 246be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 247be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 248be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 249be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 250be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTrackballEvent(MotionEvent event) { 251be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 252f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on trackballEvent"); 253f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 254be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 255be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 256be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTrackballEvent(event); 257be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 258be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 259be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 260be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 261be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchGenericMotionEvent(MotionEvent event) { 2622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 263f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "Waking up on genericMotionEvent"); 264f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(); 265be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 266be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 267be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchGenericMotionEvent(event); 268be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 269be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 270be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 271be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 272be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 273be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 274be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 275be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 276be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 277be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 278be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View onCreatePanelView(int featureId) { 279be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 280be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 281be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 282be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 283be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 284be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onCreatePanelMenu(int featureId, Menu menu) { 285be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 286be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 287be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 288be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 289be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 290be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onPreparePanel(int featureId, View view, Menu menu) { 291be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 292be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 293be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 294be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 295be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 296be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuOpened(int featureId, Menu menu) { 297be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 298be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 299be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 300be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 301be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 302be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuItemSelected(int featureId, MenuItem item) { 303be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 304be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 305be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 306be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 307be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 308be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowAttributesChanged(LayoutParams attrs) { 309be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 310be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 311be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 312be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 313be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onContentChanged() { 314be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 315be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 316be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 317be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 318be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 319be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 320be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 321be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 322be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 323be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onAttachedToWindow() { 324be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 325be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 326be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 327be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 328be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDetachedFromWindow() { 329be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 330be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 331be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 332be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 333be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onPanelClosed(int featureId, Menu menu) { 334be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 335be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 336be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 337be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 3386a975b3c3597a4ad9202432f3c3d867a03d43fa4Tim Kilbourn public boolean onSearchRequested(SearchEvent event) { 3396a975b3c3597a4ad9202432f3c3d867a03d43fa4Tim Kilbourn return onSearchRequested(); 3406a975b3c3597a4ad9202432f3c3d867a03d43fa4Tim Kilbourn } 3416a975b3c3597a4ad9202432f3c3d867a03d43fa4Tim Kilbourn 3426a975b3c3597a4ad9202432f3c3d867a03d43fa4Tim Kilbourn /** {@inheritDoc} */ 3436a975b3c3597a4ad9202432f3c3d867a03d43fa4Tim Kilbourn @Override 344be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onSearchRequested() { 345be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 346be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 347be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 348be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 349be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 350be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback callback) { 351be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 352be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 353be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 354be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 355be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 3564423d91de5300d3fd318bf5bc2d4d7e5bb856abfClara Bayarri public ActionMode onWindowStartingActionMode( 3574423d91de5300d3fd318bf5bc2d4d7e5bb856abfClara Bayarri android.view.ActionMode.Callback callback, int type) { 3584423d91de5300d3fd318bf5bc2d4d7e5bb856abfClara Bayarri return null; 3594423d91de5300d3fd318bf5bc2d4d7e5bb856abfClara Bayarri } 3604423d91de5300d3fd318bf5bc2d4d7e5bb856abfClara Bayarri 3614423d91de5300d3fd318bf5bc2d4d7e5bb856abfClara Bayarri /** {@inheritDoc} */ 3624423d91de5300d3fd318bf5bc2d4d7e5bb856abfClara Bayarri @Override 363be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeStarted(ActionMode mode) { 364be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 365be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 366be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 367be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 368be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeFinished(ActionMode mode) { 369be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 370be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // end Window.Callback methods 371be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 372be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin public api 373be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 374be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.WindowManager} for the dream. 375be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindowManager()}. 376be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 377be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window manager, or null if the dream is not started. 378be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 379be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public WindowManager getWindowManager() { 380344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown return mWindow != null ? mWindow.getWindowManager() : null; 381be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 382be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 383be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 384be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.Window} for the dream. 385be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindow()}. 386be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 387be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window, or null if the dream is not started. 388be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 389be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public Window getWindow() { 390be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow; 391be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 392be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 393be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 394be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Inflates a layout resource and set it to be the content view for this Dream. 395be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#setContentView(int)}. 396be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 397be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 398be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 399be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param layoutResID Resource ID to be inflated. 4002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 401be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 402be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 403be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 4047b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public void setContentView(@LayoutRes int layoutResID) { 405be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(layoutResID); 406be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 407be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 408be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 409be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 4106237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * Behaves similarly to {@link android.app.Activity#setContentView(android.view.View)} in an activity, 411be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * including using {@link ViewGroup.LayoutParams#MATCH_PARENT} as the layout height and width of the view. 412be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 4136237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Note: This requires a window, so you should usually call it during 4146237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow()} and never earlier (you <strong>cannot</strong> call it 4156237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * during {@link #onCreate}).</p> 416be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 417be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 418be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 419be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 420be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view) { 421be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view); 422be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 423be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 424be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 425be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 4262d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Behaves similarly to 4276237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link android.app.Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)} 4286237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * in an activity. 429be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 4306237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Note: This requires a window, so you should usually call it during 4316237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow()} and never earlier (you <strong>cannot</strong> call it 4326237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * during {@link #onCreate}).</p> 433be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 434be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 435be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 436be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 437be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 438be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 439be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 440be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view, ViewGroup.LayoutParams params) { 441be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view, params); 442be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 443be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 444be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 445be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Adds a view to the Dream's window, leaving other content views in place. 446be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 447be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 448be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 449be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 450be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 451be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 452be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void addContentView(View view, ViewGroup.LayoutParams params) { 453be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().addContentView(view, params); 454be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 455be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 456be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 457be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Finds a view that was identified by the id attribute from the XML that 458be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * was processed in {@link #onCreate}. 459be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 460be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 461be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 462be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The view if found or null otherwise. 463be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 464c051955392840cb94bd6f0b2a8107a48d2ffc8b0Scott Kennedy @Nullable 46504fd470ce0166abb36d9be829d6e9b98a55eaf35Alan Viverette public <T extends View> T findViewById(@IdRes int id) { 466be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindow().findViewById(id); 467be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 468be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 469be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 470be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as interactive to receive input events. 471be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 472be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Non-interactive dreams (default) will dismiss on the first input event.</p> 473be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 474be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Interactive dreams should call {@link #finish()} to dismiss themselves.</p> 475be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 476be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param interactive True if this dream will handle input events. 477be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 478be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setInteractive(boolean interactive) { 479be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mInteractive = interactive; 480be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 481be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 482be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 483be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is interactive. Defaults to false. 484be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 485be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setInteractive(boolean) 486be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 487be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isInteractive() { 488be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mInteractive; 489be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 490be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 491be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 492be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view. 493be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 494be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param lowProfile True to set View.SYSTEM_UI_FLAG_LOW_PROFILE 4954c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide There is no reason to have this -- dreams can set this flag 4964c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on their own content view, and from there can actually do the 4974c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * correct interactions with it (seeing when it is cleared etc). 498be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 499be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setLowProfile(boolean lowProfile) { 5002687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mLowProfile != lowProfile) { 5012687550272ba061448f5d5b914700dc335299ee7Jeff Brown mLowProfile = lowProfile; 5022687550272ba061448f5d5b914700dc335299ee7Jeff Brown int flag = View.SYSTEM_UI_FLAG_LOW_PROFILE; 5032687550272ba061448f5d5b914700dc335299ee7Jeff Brown applySystemUiVisibilityFlags(mLowProfile ? flag : 0, flag); 5042687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 505be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 506be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 507be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 508be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in low profile mode. Defaults to true. 509be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 510be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setLowProfile(boolean) 5114c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide 512be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 513be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isLowProfile() { 514be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_LOW_PROFILE, mLowProfile); 515be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 516be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 517be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 5184c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * Controls {@link android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} 5194c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on the dream's window. 520be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 5214c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @param fullscreen If true, the fullscreen flag will be set; else it 5224c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * will be cleared. 523be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 524be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setFullscreen(boolean fullscreen) { 5252687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mFullscreen != fullscreen) { 5262687550272ba061448f5d5b914700dc335299ee7Jeff Brown mFullscreen = fullscreen; 5272687550272ba061448f5d5b914700dc335299ee7Jeff Brown int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN; 5282687550272ba061448f5d5b914700dc335299ee7Jeff Brown applyWindowFlags(mFullscreen ? flag : 0, flag); 5292687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 530be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 531be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 532be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 533be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in fullscreen mode. Defaults to false. 534be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 535be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setFullscreen(boolean) 536be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 537be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isFullscreen() { 5384c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn return mFullscreen; 539be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 540be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 541be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 542be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as keeping the screen bright while dreaming. 543be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 544be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param screenBright True to keep the screen bright while dreaming. 545be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 546be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setScreenBright(boolean screenBright) { 5472687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mScreenBright != screenBright) { 5482687550272ba061448f5d5b914700dc335299ee7Jeff Brown mScreenBright = screenBright; 5492687550272ba061448f5d5b914700dc335299ee7Jeff Brown int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 5502687550272ba061448f5d5b914700dc335299ee7Jeff Brown applyWindowFlags(mScreenBright ? flag : 0, flag); 5512687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 552be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 553be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 554be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 5552687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Returns whether or not this dream keeps the screen bright while dreaming. 5562687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Defaults to false, allowing the screen to dim if necessary. 557be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 558be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setScreenBright(boolean) 559be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 560be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isScreenBright() { 561be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindowFlagValue(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, mScreenBright); 562be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 563be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 564be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 565bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * Marks this dream as windowless. Only available to doze dreams. 566bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * 567bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * @hide 568bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock */ 569bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public void setWindowless(boolean windowless) { 570bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mWindowless = windowless; 571bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 572bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 573bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock /** 574bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * Returns whether or not this dream is windowless. Only available to doze dreams. 575bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * 576bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock * @hide 577bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock */ 578bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock public boolean isWindowless() { 579bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock return mWindowless; 580bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 581bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 582bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock /** 5832687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Returns true if this dream is allowed to doze. 5842687550272ba061448f5d5b914700dc335299ee7Jeff Brown * <p> 5852687550272ba061448f5d5b914700dc335299ee7Jeff Brown * The value returned by this method is only meaningful when the dream has started. 5862687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p> 5872687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 5882687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @return True if this dream can doze. 5892687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @see #startDozing 590970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide For use by system UI components only. 5912687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 5922687550272ba061448f5d5b914700dc335299ee7Jeff Brown public boolean canDoze() { 5932687550272ba061448f5d5b914700dc335299ee7Jeff Brown return mCanDoze; 5942687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 5952687550272ba061448f5d5b914700dc335299ee7Jeff Brown 5962687550272ba061448f5d5b914700dc335299ee7Jeff Brown /** 5972687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Starts dozing, entering a deep dreamy sleep. 5982687550272ba061448f5d5b914700dc335299ee7Jeff Brown * <p> 5992687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Dozing enables the system to conserve power while the user is not actively interacting 6002687550272ba061448f5d5b914700dc335299ee7Jeff Brown * with the device. While dozing, the display will remain on in a low-power state 6012687550272ba061448f5d5b914700dc335299ee7Jeff Brown * and will continue to show its previous contents but the application processor and 6022687550272ba061448f5d5b914700dc335299ee7Jeff Brown * other system components will be allowed to suspend when possible. 6032687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p><p> 6042687550272ba061448f5d5b914700dc335299ee7Jeff Brown * While the application processor is suspended, the dream may stop executing code 6052687550272ba061448f5d5b914700dc335299ee7Jeff Brown * for long periods of time. Prior to being suspended, the dream may schedule periodic 6062687550272ba061448f5d5b914700dc335299ee7Jeff Brown * wake-ups to render new content by scheduling an alarm with the {@link AlarmManager}. 6072687550272ba061448f5d5b914700dc335299ee7Jeff Brown * The dream may also keep the CPU awake by acquiring a 6082687550272ba061448f5d5b914700dc335299ee7Jeff Brown * {@link android.os.PowerManager#PARTIAL_WAKE_LOCK partial wake lock} when necessary. 6092687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Note that since the purpose of doze mode is to conserve power (especially when 6102687550272ba061448f5d5b914700dc335299ee7Jeff Brown * running on battery), the dream should not wake the CPU very often or keep it 6112687550272ba061448f5d5b914700dc335299ee7Jeff Brown * awake for very long. 6122687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p><p> 6132687550272ba061448f5d5b914700dc335299ee7Jeff Brown * It is a good idea to call this method some time after the dream's entry animation 6142687550272ba061448f5d5b914700dc335299ee7Jeff Brown * has completed and the dream is ready to doze. It is important to completely 6152687550272ba061448f5d5b914700dc335299ee7Jeff Brown * finish all of the work needed before dozing since the application processor may 6162687550272ba061448f5d5b914700dc335299ee7Jeff Brown * be suspended at any moment once this method is called unless other wake locks 6172687550272ba061448f5d5b914700dc335299ee7Jeff Brown * are being held. 6182687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p><p> 6192687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Call {@link #stopDozing} or {@link #finish} to stop dozing. 6202687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p> 6212687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 6222687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @see #stopDozing 623970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide For use by system UI components only. 6242687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 6252687550272ba061448f5d5b914700dc335299ee7Jeff Brown public void startDozing() { 6262687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mCanDoze && !mDozing) { 6272687550272ba061448f5d5b914700dc335299ee7Jeff Brown mDozing = true; 628970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown updateDoze(); 629970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 630970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 631970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown 632970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown private void updateDoze() { 633970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown if (mDozing) { 6342687550272ba061448f5d5b914700dc335299ee7Jeff Brown try { 635970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown mSandman.startDozing(mWindowToken, mDozeScreenState, mDozeScreenBrightness); 6362687550272ba061448f5d5b914700dc335299ee7Jeff Brown } catch (RemoteException ex) { 6372687550272ba061448f5d5b914700dc335299ee7Jeff Brown // system server died 6382687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6392687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6402687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6412687550272ba061448f5d5b914700dc335299ee7Jeff Brown 6422687550272ba061448f5d5b914700dc335299ee7Jeff Brown /** 6432687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Stops dozing, returns to active dreaming. 6442687550272ba061448f5d5b914700dc335299ee7Jeff Brown * <p> 6452687550272ba061448f5d5b914700dc335299ee7Jeff Brown * This method reverses the effect of {@link #startDozing}. From this moment onward, 6462687550272ba061448f5d5b914700dc335299ee7Jeff Brown * the application processor will be kept awake as long as the dream is running 6472687550272ba061448f5d5b914700dc335299ee7Jeff Brown * or until the dream starts dozing again. 6482687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p> 6492687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 6502687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @see #startDozing 651970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide For use by system UI components only. 6522687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 6532687550272ba061448f5d5b914700dc335299ee7Jeff Brown public void stopDozing() { 6542687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mDozing) { 6552687550272ba061448f5d5b914700dc335299ee7Jeff Brown mDozing = false; 6562687550272ba061448f5d5b914700dc335299ee7Jeff Brown try { 6572687550272ba061448f5d5b914700dc335299ee7Jeff Brown mSandman.stopDozing(mWindowToken); 6582687550272ba061448f5d5b914700dc335299ee7Jeff Brown } catch (RemoteException ex) { 6592687550272ba061448f5d5b914700dc335299ee7Jeff Brown // system server died 6602687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6612687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6622687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6632687550272ba061448f5d5b914700dc335299ee7Jeff Brown 6642687550272ba061448f5d5b914700dc335299ee7Jeff Brown /** 6652687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Returns true if the dream will allow the system to enter a low-power state while 6662687550272ba061448f5d5b914700dc335299ee7Jeff Brown * it is running without actually turning off the screen. Defaults to false, 6672687550272ba061448f5d5b914700dc335299ee7Jeff Brown * keeping the application processor awake while the dream is running. 6682687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 6692687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @return True if the dream is dozing. 6702687550272ba061448f5d5b914700dc335299ee7Jeff Brown * 6712687550272ba061448f5d5b914700dc335299ee7Jeff Brown * @see #setDozing(boolean) 672970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide For use by system UI components only. 6732687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 6742687550272ba061448f5d5b914700dc335299ee7Jeff Brown public boolean isDozing() { 6752687550272ba061448f5d5b914700dc335299ee7Jeff Brown return mDozing; 6762687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 6772687550272ba061448f5d5b914700dc335299ee7Jeff Brown 6782687550272ba061448f5d5b914700dc335299ee7Jeff Brown /** 679970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * Gets the screen state to use while dozing. 680970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * 681970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @return The screen state to use while dozing, such as {@link Display#STATE_ON}, 682970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * {@link Display#STATE_DOZE}, {@link Display#STATE_DOZE_SUSPEND}, 683970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * or {@link Display#STATE_OFF}, or {@link Display#STATE_UNKNOWN} for the default 684970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * behavior. 685970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * 686970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @see #setDozeScreenState 687970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide For use by system UI components only. 688970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown */ 689970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown public int getDozeScreenState() { 690970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown return mDozeScreenState; 691970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 692970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown 693970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown /** 694970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * Sets the screen state to use while dozing. 695970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * <p> 696970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * The value of this property determines the power state of the primary display 697970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * once {@link #startDozing} has been called. The default value is 698970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * {@link Display#STATE_UNKNOWN} which lets the system decide. 699970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * The dream may set a different state before starting to doze and may 700970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * perform transitions between states while dozing to conserve power and 701970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * achieve various effects. 702970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * </p><p> 703970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * It is recommended that the state be set to {@link Display#STATE_DOZE_SUSPEND} 704970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * once the dream has completely finished drawing and before it releases its wakelock 705970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * to allow the display hardware to be fully suspended. While suspended, the 706970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * display will preserve its on-screen contents or hand off control to dedicated 707970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * doze hardware if the devices supports it. If the doze suspend state is 708970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * used, the dream must make sure to set the mode back 709970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * to {@link Display#STATE_DOZE} or {@link Display#STATE_ON} before drawing again 710970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * since the display updates may be ignored and not seen by the user otherwise. 711970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * </p><p> 712970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * The set of available display power states and their behavior while dozing is 713970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * hardware dependent and may vary across devices. The dream may therefore 714970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * need to be modified or configured to correctly support the hardware. 715970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * </p> 716970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * 717970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @param state The screen state to use while dozing, such as {@link Display#STATE_ON}, 718970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * {@link Display#STATE_DOZE}, {@link Display#STATE_DOZE_SUSPEND}, 719970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * or {@link Display#STATE_OFF}, or {@link Display#STATE_UNKNOWN} for the default 720970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * behavior. 721970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * 722970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide For use by system UI components only. 723970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown */ 724970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown public void setDozeScreenState(int state) { 725970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown if (mDozeScreenState != state) { 726970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown mDozeScreenState = state; 727970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown updateDoze(); 728970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 729970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 730970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown 731970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown /** 732970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * Gets the screen brightness to use while dozing. 733970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * 734970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @return The screen brightness while dozing as a value between 735970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * {@link PowerManager#BRIGHTNESS_OFF} (0) and {@link PowerManager#BRIGHTNESS_ON} (255), 736970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * or {@link PowerManager#BRIGHTNESS_DEFAULT} (-1) to ask the system to apply 737970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * its default policy based on the screen state. 738970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * 739970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @see #setDozeScreenBrightness 740970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide For use by system UI components only. 741970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown */ 742970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown public int getDozeScreenBrightness() { 743970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown return mDozeScreenBrightness; 744970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 745970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown 746970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown /** 747970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * Sets the screen brightness to use while dozing. 748970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * <p> 749970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * The value of this property determines the power state of the primary display 750970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * once {@link #startDozing} has been called. The default value is 751970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * {@link PowerManager#BRIGHTNESS_DEFAULT} which lets the system decide. 752970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * The dream may set a different brightness before starting to doze and may adjust 753970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * the brightness while dozing to conserve power and achieve various effects. 754970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * </p><p> 755970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * Note that dream may specify any brightness in the full 0-255 range, including 756970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * values that are less than the minimum value for manual screen brightness 757970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * adjustments by the user. In particular, the value may be set to 0 which may 758970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * turn off the backlight entirely while still leaving the screen on although 759970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * this behavior is device dependent and not guaranteed. 760970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * </p><p> 761970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * The available range of display brightness values and their behavior while dozing is 762970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * hardware dependent and may vary across devices. The dream may therefore 763970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * need to be modified or configured to correctly support the hardware. 764970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * </p> 765970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * 766970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @param brightness The screen brightness while dozing as a value between 767970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * {@link PowerManager#BRIGHTNESS_OFF} (0) and {@link PowerManager#BRIGHTNESS_ON} (255), 768970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * or {@link PowerManager#BRIGHTNESS_DEFAULT} (-1) to ask the system to apply 769970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * its default policy based on the screen state. 770970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * 771970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown * @hide For use by system UI components only. 772970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown */ 773970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown public void setDozeScreenBrightness(int brightness) { 774970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown if (brightness != PowerManager.BRIGHTNESS_DEFAULT) { 775970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown brightness = clampAbsoluteBrightness(brightness); 776970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 777970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown if (mDozeScreenBrightness != brightness) { 778970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown mDozeScreenBrightness = brightness; 779970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown updateDoze(); 780970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 781970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 782970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown 783970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown /** 7842d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is constructed. 785be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 786be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 787be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onCreate() { 788970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown if (mDebug) Slog.v(TAG, "onCreate()"); 789be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn super.onCreate(); 790be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 791be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 792be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 7932d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the dream's window has been created and is visible and animation may now begin. 7942d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 7952d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStarted() { 7962d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStarted()"); 7972d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 7982d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7992d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 8002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 8012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is stopped, either by external request or by calling finish(), 8022d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * before the window has been removed. 803be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 8042d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStopped() { 8052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStopped()"); 806be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // hook for subclasses 807be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 808be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 809f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown /** 810f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * Called when the dream is being asked to stop itself and wake. 811f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * <p> 812f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * The default implementation simply calls {@link #finish} which ends the dream 813f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * immediately. Subclasses may override this function to perform a smooth exit 814f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * transition then call {@link #finish} afterwards. 815f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * </p><p> 816f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * Note that the dream will only be given a short period of time (currently about 817f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * five seconds) to wake up. If the dream does not finish itself in a timely manner 818f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * then the system will forcibly finish it once the time allowance is up. 819f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * </p> 820f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown */ 821f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown public void onWakeUp() { 822f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown finish(); 823f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 824f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 825be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 826be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 827be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public final IBinder onBind(Intent intent) { 8282d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onBind() intent = " + intent); 829be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return new DreamServiceWrapper(); 830be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 831be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 832be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 8332687550272ba061448f5d5b914700dc335299ee7Jeff Brown * Stops the dream and detaches from the window. 8342687550272ba061448f5d5b914700dc335299ee7Jeff Brown * <p> 8352687550272ba061448f5d5b914700dc335299ee7Jeff Brown * When the dream ends, the system will be allowed to go to sleep fully unless there 8362687550272ba061448f5d5b914700dc335299ee7Jeff Brown * is a reason for it to be awake such as recent user activity or wake locks being held. 8372687550272ba061448f5d5b914700dc335299ee7Jeff Brown * </p> 838be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 8392d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public final void finish() { 840f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "finish(): mFinished=" + mFinished); 841f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 842f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (!mFinished) { 843f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mFinished = true; 844f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 845f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mWindowToken == null) { 846f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown Slog.w(TAG, "Finish was called before the dream was attached."); 847f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } else { 848f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown try { 849f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mSandman.finishSelf(mWindowToken, true /*immediate*/); 850f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } catch (RemoteException ex) { 851f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // system server died 852f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 853f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 854f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 855f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown stopSelf(); // if launched via any other means 856f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 857f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 858f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 859f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown /** 860f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * Wakes the dream up gently. 861f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * <p> 862f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * Calls {@link #onWakeUp} to give the dream a chance to perform an exit transition. 863f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * When the transition is over, the dream should call {@link #finish}. 864f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown * </p> 865f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown */ 866f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown public final void wakeUp() { 867f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown wakeUp(false); 868f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 869f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 870f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown private void wakeUp(boolean fromSystem) { 871f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mDebug) Slog.v(TAG, "wakeUp(): fromSystem=" + fromSystem 872f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown + ", mWaking=" + mWaking + ", mFinished=" + mFinished); 873f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 874f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (!mWaking && !mFinished) { 875f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mWaking = true; 876f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 877f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // As a minor optimization, invoke the callback first in case it simply 878f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // calls finish() immediately so there wouldn't be much point in telling 879f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // the system that we are finishing the dream gently. 880f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown onWakeUp(); 881f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown 882f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // Now tell the system we are waking gently, unless we already told 883f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // it we were finishing immediately. 884f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (!fromSystem && !mFinished) { 885f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown if (mWindowToken == null) { 886f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown Slog.w(TAG, "WakeUp was called before the dream was attached."); 887f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } else { 888f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown try { 889f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mSandman.finishSelf(mWindowToken, false /*immediate*/); 890f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } catch (RemoteException ex) { 891f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown // system server died 892f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 893f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 894f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 895f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 896be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 897be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 898be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 899be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 900be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDestroy() { 9012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDestroy()"); 9022d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 903c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler 904c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // Just in case destroy came in before detach, let's take care of that now 905c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler detach(); 906c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler 907c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler super.onDestroy(); 9082d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 9092d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 9102d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // end public api 9112d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 9122d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 913c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler * Called by DreamController.stopDream() when the Dream is about to be unbound and destroyed. 9142d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 9152d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 9162d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 9172d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private final void detach() { 918344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mStarted) { 919344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mDebug) Slog.v(TAG, "detach(): Calling onDreamingStopped()"); 920344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mStarted = false; 921344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown onDreamingStopped(); 9222d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 9232d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 924344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mWindow != null) { 925344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown // force our window to be removed synchronously 926344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mDebug) Slog.v(TAG, "detach(): Removing window from window manager"); 927344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mWindow.getWindowManager().removeViewImmediate(mWindow.getDecorView()); 928344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mWindow = null; 929344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown } 930be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 931344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown if (mWindowToken != null) { 932344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown // the following will print a log message if it finds any other leaked windows 933344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown WindowManagerGlobal.getInstance().closeAll(mWindowToken, 934344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown this.getClass().getName(), "Dream"); 935344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mWindowToken = null; 936bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock mCanDoze = false; 937344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown } 938be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 939be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 9402d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 9412d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the Dream is ready to be shown. 9422d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 9432d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 9442d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 9452d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @param windowToken A window token that will allow a window to be created in the correct layer. 9469ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos * @param started A callback that will be invoked once onDreamingStarted has completed. 9472d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 9489ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos private final void attach(IBinder windowToken, boolean canDoze, IRemoteCallback started) { 9499ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos if (mWindowToken != null) { 9509ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos Slog.e(TAG, "attach() called when already attached with token=" + mWindowToken); 9519ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos return; 9529ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } 9539ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos if (mFinished || mWaking) { 9549ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos Slog.w(TAG, "attach() called after dream already finished"); 9559ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos try { 9569ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mSandman.finishSelf(windowToken, true /*immediate*/); 9579ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } catch (RemoteException ex) { 9589ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // system server died 9592687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 9609ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos return; 9619ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } 962bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 9639ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindowToken = windowToken; 9649ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mCanDoze = canDoze; 9659ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos if (mWindowless && !mCanDoze) { 9669ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos throw new IllegalStateException("Only doze dreams can be windowless"); 9679ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } 9689ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos if (!mWindowless) { 9699ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindow = new PhoneWindow(this); 9709ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindow.setCallback(this); 9719ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindow.requestFeature(Window.FEATURE_NO_TITLE); 9729ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindow.setBackgroundDrawable(new ColorDrawable(0xFF000000)); 9739ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindow.setFormat(PixelFormat.OPAQUE); 974bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 9759ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos if (mDebug) Slog.v(TAG, String.format("Attaching window token: %s to window of type %s", 9769ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos windowToken, WindowManager.LayoutParams.TYPE_DREAM)); 977bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock 9789ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos WindowManager.LayoutParams lp = mWindow.getAttributes(); 9799ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos lp.type = WindowManager.LayoutParams.TYPE_DREAM; 9809ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos lp.token = windowToken; 9819ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos lp.windowAnimations = com.android.internal.R.style.Animation_Dream; 9829ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos lp.flags |= ( WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 9839ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR 9849ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 9859ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 9869ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 9879ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos | (mFullscreen ? WindowManager.LayoutParams.FLAG_FULLSCREEN : 0) 9889ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos | (mScreenBright ? WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON : 0) 9899ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos ); 9909ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindow.setAttributes(lp); 9919ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // Workaround: Currently low-profile and in-window system bar backgrounds don't go 9929ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // along well. Dreams usually don't need such bars anyways, so disable them by default. 9939ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 9949ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindow.setWindowManager(null, windowToken, "dream", true); 9959ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos 9969ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos applySystemUiVisibilityFlags( 9979ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos (mLowProfile ? View.SYSTEM_UI_FLAG_LOW_PROFILE : 0), 9989ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos View.SYSTEM_UI_FLAG_LOW_PROFILE); 9999ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos 10009ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos try { 10019ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos getWindowManager().addView(mWindow.getDecorView(), mWindow.getAttributes()); 10029ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } catch (WindowManager.BadTokenException ex) { 10039ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // This can happen because the dream manager service will remove the token 10049ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // immediately without necessarily waiting for the dream to start. 10059ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // We should receive a finish message soon. 10069ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos Slog.i(TAG, "attach() called after window token already removed, dream will " 10079ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos + "finish soon"); 10089ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mWindow = null; 10099ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos return; 1010bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock } 10119ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } 10129ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // We need to defer calling onDreamingStarted until after onWindowAttached, 10139ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // which is posted to the handler by addView, so we post onDreamingStarted 10149ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // to the handler also. Need to watch out here in case detach occurs before 10159ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos // this callback is invoked. 10169ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos mHandler.post(new Runnable() { 10179ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos @Override 10189ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos public void run() { 1019bf370992508c55d1f2493923bdc1834a0710e4baJohn Spurlock if (mWindow != null || mWindowless) { 10209ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos if (mDebug) Slog.v(TAG, "Calling onDreamingStarted()"); 1021037c33eae74bee2774897d969d48947f9abe254fJeff Brown mStarted = true; 10229ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos try { 10239ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos onDreamingStarted(); 10249ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } finally { 10259ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos try { 10269ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos started.sendResult(null); 10279ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } catch (RemoteException e) { 10289ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos throw e.rethrowFromSystemServer(); 10299ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } 10309ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } 1031037c33eae74bee2774897d969d48947f9abe254fJeff Brown } 10329ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos } 10339ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos }); 1034be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 1035be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1036be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getWindowFlagValue(int flag, boolean defaultValue) { 1037be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow == null ? defaultValue : (mWindow.getAttributes().flags & flag) != 0; 1038be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 1039be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1040be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applyWindowFlags(int flags, int mask) { 1041be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mWindow != null) { 1042be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 1043be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.flags = applyFlags(lp.flags, flags, mask); 1044be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 1045344812d2f3a9e56cc53a86a8825fb73b16d3c0ddJeff Brown mWindow.getWindowManager().updateViewLayout(mWindow.getDecorView(), lp); 1046be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 1047be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 1048be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1049be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getSystemUiVisibilityFlagValue(int flag, boolean defaultValue) { 1050be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 1051be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return v == null ? defaultValue : (v.getSystemUiVisibility() & flag) != 0; 1052be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 1053be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1054be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applySystemUiVisibilityFlags(int flags, int mask) { 1055be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 1056be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (v != null) { 1057be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn v.setSystemUiVisibility(applyFlags(v.getSystemUiVisibility(), flags, mask)); 1058be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 1059be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 1060be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1061be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private int applyFlags(int oldFlags, int flags, int mask) { 1062be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return (oldFlags&~mask) | (flags&mask); 1063be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 1064be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 10652d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 10666612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock protected void dump(final FileDescriptor fd, PrintWriter pw, final String[] args) { 10672687550272ba061448f5d5b914700dc335299ee7Jeff Brown DumpUtils.dumpAsync(mHandler, new Dump() { 10682687550272ba061448f5d5b914700dc335299ee7Jeff Brown @Override 1069ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn public void dump(PrintWriter pw, String prefix) { 10706612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock dumpOnHandler(fd, pw, args); 10712687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 1072ae6688b09649447e57468b3e7935691bc09ec9b9Dianne Hackborn }, pw, "", 1000); 10732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 10742d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 10756612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock /** @hide */ 10766612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock protected void dumpOnHandler(FileDescriptor fd, PrintWriter pw, String[] args) { 10776612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.print(TAG + ": "); 10786612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (mWindowToken == null) { 10796612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.println("stopped"); 10806612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock } else { 10816612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.println("running (token=" + mWindowToken + ")"); 10826612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock } 10836612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.println(" window: " + mWindow); 10846612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.print(" flags:"); 10856612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isInteractive()) pw.print(" interactive"); 10866612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isLowProfile()) pw.print(" lowprofile"); 10876612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isFullscreen()) pw.print(" fullscreen"); 10886612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isScreenBright()) pw.print(" bright"); 10896612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isWindowless()) pw.print(" windowless"); 10906612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock if (isDozing()) pw.print(" dozing"); 1091970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown else if (canDoze()) pw.print(" candoze"); 10926612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock pw.println(); 1093970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown if (canDoze()) { 1094970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown pw.println(" doze screen state: " + Display.stateToString(mDozeScreenState)); 1095970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown pw.println(" doze screen brightness: " + mDozeScreenBrightness); 1096970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 1097970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown } 1098970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown 1099970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown private static int clampAbsoluteBrightness(int value) { 1100970d4132ea28e748c1010be39450a98bbf7466f3Jeff Brown return MathUtils.constrain(value, PowerManager.BRIGHTNESS_OFF, PowerManager.BRIGHTNESS_ON); 11016612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock } 11026612727c18fe6e7b6edf811f3a1a871a710c0ebeJohn Spurlock 11032687550272ba061448f5d5b914700dc335299ee7Jeff Brown private final class DreamServiceWrapper extends IDreamService.Stub { 11042687550272ba061448f5d5b914700dc335299ee7Jeff Brown @Override 11059ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos public void attach(final IBinder windowToken, final boolean canDoze, 11069ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos IRemoteCallback started) { 11072d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 11082d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 11092d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 11109ede1d260284bbf0b47ca6f0315e943058624520Adrian Roos DreamService.this.attach(windowToken, canDoze, started); 11112d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 11122d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 11132d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 11142687550272ba061448f5d5b914700dc335299ee7Jeff Brown 11152687550272ba061448f5d5b914700dc335299ee7Jeff Brown @Override 11162d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void detach() { 11172d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 11182d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 11192d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 11202d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.detach(); 11212d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 11222d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 1123be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 1124be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1125f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown @Override 1126f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown public void wakeUp() { 1127f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown mHandler.post(new Runnable() { 1128f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown @Override 1129f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown public void run() { 1130f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown DreamService.this.wakeUp(true /*fromSystem*/); 1131f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 1132f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown }); 1133f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 1134f6d466895b74d620d646abbec1c8911f3a0ce0bbJeff Brown } 1135be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn} 1136