DreamService.java revision 6237ac19bf4eed261e8b0c69fac774581b4ea02b
1be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn/** 2be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Copyright (C) 2012 The Android Open Source Project 3be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 4be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * you may not use this file except in compliance with the License. 6be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * You may obtain a copy of the License at 7be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 8be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 10be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * See the License for the specific language governing permissions and 14be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * limitations under the License. 15be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 16be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornpackage android.service.dreams; 17be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 182d78490292090eeab84694330978c9ad7fad2d37Daniel Sandlerimport java.io.FileDescriptor; 192d78490292090eeab84694330978c9ad7fad2d37Daniel Sandlerimport java.io.PrintWriter; 202d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 21be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.annotation.SdkConstant; 22be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.annotation.SdkConstant.SdkConstantType; 23be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.app.Service; 24be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.content.Intent; 254c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackbornimport android.graphics.PixelFormat; 26be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.graphics.drawable.ColorDrawable; 27be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.Handler; 28be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.IBinder; 29be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.ServiceManager; 30be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.util.Slog; 31be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.ActionMode; 32be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.KeyEvent; 33be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.Menu; 34be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.MenuItem; 35be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.MotionEvent; 36be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.View; 37be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.ViewGroup; 38be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.Window; 39be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.WindowManager; 40c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandlerimport android.view.WindowManagerGlobal; 41be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.WindowManager.LayoutParams; 42be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.accessibility.AccessibilityEvent; 43be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 44be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport com.android.internal.policy.PolicyManager; 45be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 46be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn/** 472d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Extend this class to implement a custom Dream (displayed to the user as a "Sleep Mode"). 48be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 49be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Dreams are interactive screensavers launched when a charging device is idle, or docked in a 50be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * desk dock. Dreams provide another modality for apps to express themselves, tailored for 51be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * an exhibition/lean-back experience.</p> 52be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 532d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>The Dream lifecycle is as follows:</p> 546237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <ol> 556237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onAttachedToWindow} 566237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Use this for initial setup, such as calling {@link #setContentView setContentView()}.</li> 576237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onDreamingStarted} 586237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Your dream has started, so you should begin animations or other behaviors here.</li> 596237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onDreamingStopped} 606237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Use this to stop the things you started in {@link #onDreamingStarted}.</li> 616237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <li>{@link #onDetachedFromWindow} 626237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Use this to dismantle resources your dream set up. For example, detach from handlers 636237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * and listeners.</li> 646237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * </ol> 652d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 662d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>In addition, onCreate and onDestroy (from the Service interface) will also be called, but 672d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * initialization and teardown should be done by overriding the hooks above.</p> 682d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 692d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>To be available to the system, Dreams should be declared in the manifest as follows:</p> 70be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <pre> 713a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <service 72be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name=".MyDream" 73be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:exported="true" 74be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:icon="@drawable/my_icon" 75be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:label="@string/my_dream_label" > 76be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 773a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <intent-filter> 783a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <action android:name="android.service.dreams.DreamService" /> 793a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <category android:name="android.intent.category.DEFAULT" /> 803a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </intent-filter> 81be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 823a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <!-- Point to additional information for this dream (optional) --> 833a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <meta-data 84be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name="android.service.dream" 85be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:resource="@xml/my_dream" /> 863a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </service> 873a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </pre> 883a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * 896237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>If specified with the {@code <meta-data>} element, 906237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * additional information for the dream is defined using the 916237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link android.R.styleable#Dream <dream>} element in a separate XML file. 926237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * Currently, the only addtional 936237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * information you can provide is for a settings activity that allows the user to configure 946237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * the dream behavior. For example:</p> 956237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p class="code-caption">res/xml/my_dream.xml</p> 966237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <pre> 973a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <dream xmlns:android="http://schemas.android.com/apk/res/android" 983a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * android:settingsActivity="com.example.app/.MyDreamSettingsActivity" /> 99be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * </pre> 1006237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>This makes a Settings button available alongside your dream's listing in the 1016237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * system settings, which when pressed opens the specified activity.</p> 1026237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1036237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1046237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>To specify your dream layout, call {@link #setContentView}, typically during the 1056237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow} callback. For example:</p> 1066237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <pre> 1076237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * public class MyDream extends DreamService { 1086237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1096237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * @Override 1106237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * public void onAttachedToWindow() { 1116237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * super.onAttachedToWindow(); 1126237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1136237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Exit dream upon user touch 1146237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setInteractive(false); 1156237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Hide system UI 1166237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setFullscreen(true); 1176237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Set the dream layout 1186237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setContentView(R.layout.dream); 1196237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * } 1206237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * } 1216237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * </pre> 122be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 123be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornpublic class DreamService extends Service implements Window.Callback { 124be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final String TAG = DreamService.class.getSimpleName() + "[" + getClass().getSimpleName() + "]"; 125be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 126be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 127be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The name of the dream manager service. 128be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @hide 129be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 130be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_SERVICE = "dreams"; 131be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 132be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 133be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The {@link Intent} that must be declared as handled by the service. 134be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 135be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @SdkConstant(SdkConstantType.SERVICE_ACTION) 136be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String SERVICE_INTERFACE = 137be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn "android.service.dreams.DreamService"; 138be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 139be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 140be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Name under which a Dream publishes information about itself. 141be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * This meta-data must reference an XML resource containing 142be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * a <code><{@link android.R.styleable#Dream dream}></code> 143be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * tag. 144be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 145be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_META_DATA = "android.service.dream"; 146be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 147be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final Handler mHandler = new Handler(); 148be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IBinder mWindowToken; 149be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private Window mWindow; 150be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private WindowManager mWindowManager; 151be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IDreamManager mSandman; 152be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mInteractive = false; 153be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mLowProfile = true; 154be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFullscreen = false; 155a934fd142ec59b297b31c1f0b664e0c0d5e61ebaChris Wren private boolean mScreenBright = true; 156be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFinished; 157be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1582d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private boolean mDebug = false; 1592d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 1602d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 1612d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @hide 1622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 1632d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void setDebug(boolean dbg) { 1642d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mDebug = dbg; 1652d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 1662d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 167be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin Window.Callback methods 168be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 169be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 170be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyEvent(KeyEvent event) { 171be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // TODO: create more flexible version of mInteractive that allows use of KEYCODE_BACK 172be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 1732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on keyEvent"); 174be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 175be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 176be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 1772d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on back key"); 178be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 179be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 180be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 181be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyEvent(event); 182be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 183be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 184be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 185be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 186be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyShortcutEvent(KeyEvent event) { 1872d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 1882d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on keyShortcutEvent"); 189be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 190be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 191be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 192be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyShortcutEvent(event); 193be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 194be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 195be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 196be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 197be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTouchEvent(MotionEvent event) { 1982d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // TODO: create more flexible version of mInteractive that allows clicks 199be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // but finish()es on any other kind of activity 2002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 2012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on touchEvent"); 202be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 203be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 204be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 205be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTouchEvent(event); 206be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 207be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 208be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 209be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 210be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTrackballEvent(MotionEvent event) { 211be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 2122d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on trackballEvent"); 213be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 214be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 215be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 216be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTrackballEvent(event); 217be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 218be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 219be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 220be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 221be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchGenericMotionEvent(MotionEvent event) { 2222d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 2232d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on genericMotionEvent"); 224be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 225be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 226be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 227be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchGenericMotionEvent(event); 228be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 229be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 230be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 231be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 232be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 233be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 234be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 235be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 236be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 237be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 238be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View onCreatePanelView(int featureId) { 239be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 240be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 241be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 242be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 243be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 244be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onCreatePanelMenu(int featureId, Menu menu) { 245be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 246be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 247be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 248be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 249be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 250be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onPreparePanel(int featureId, View view, Menu menu) { 251be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 252be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 253be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 254be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 255be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 256be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuOpened(int featureId, Menu menu) { 257be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 258be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 259be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 260be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 261be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 262be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuItemSelected(int featureId, MenuItem item) { 263be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 264be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 265be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 266be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 267be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 268be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowAttributesChanged(LayoutParams attrs) { 269be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 270be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 271be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 272be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 273be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onContentChanged() { 274be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 275be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 276be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 277be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 278be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 279be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 280be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 281be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 282be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 283be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onAttachedToWindow() { 284be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 285be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 286be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 287be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 288be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDetachedFromWindow() { 289be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 290be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 291be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 292be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 293be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onPanelClosed(int featureId, Menu menu) { 294be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 295be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 296be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 297be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 298be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onSearchRequested() { 299be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 300be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 301be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 302be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 303be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 304be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback callback) { 305be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 306be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 307be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 308be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 309be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 310be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeStarted(ActionMode mode) { 311be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 312be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 313be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 314be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 315be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeFinished(ActionMode mode) { 316be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 317be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // end Window.Callback methods 318be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 319be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin public api 320be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 321be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.WindowManager} for the dream. 322be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindowManager()}. 323be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 324be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window manager, or null if the dream is not started. 325be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 326be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public WindowManager getWindowManager() { 327be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindowManager; 328be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 329be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 330be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 331be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.Window} for the dream. 332be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindow()}. 333be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 334be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window, or null if the dream is not started. 335be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 336be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public Window getWindow() { 337be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow; 338be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 339be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 340be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 341be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Inflates a layout resource and set it to be the content view for this Dream. 342be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#setContentView(int)}. 343be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 344be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 345be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 346be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param layoutResID Resource ID to be inflated. 3472d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 348be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 349be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 350be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 351be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(int layoutResID) { 352be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(layoutResID); 353be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 354be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 355be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 356be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 3576237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * Behaves similarly to {@link android.app.Activity#setContentView(android.view.View)} in an activity, 358be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * including using {@link ViewGroup.LayoutParams#MATCH_PARENT} as the layout height and width of the view. 359be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 3606237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Note: This requires a window, so you should usually call it during 3616237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow()} and never earlier (you <strong>cannot</strong> call it 3626237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * during {@link #onCreate}).</p> 363be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 364be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 365be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 366be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 367be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view) { 368be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view); 369be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 370be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 371be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 372be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 3732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Behaves similarly to 3746237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link android.app.Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)} 3756237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * in an activity. 376be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 3776237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Note: This requires a window, so you should usually call it during 3786237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow()} and never earlier (you <strong>cannot</strong> call it 3796237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * during {@link #onCreate}).</p> 380be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 381be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 382be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 383be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 384be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 385be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 386be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 387be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view, ViewGroup.LayoutParams params) { 388be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view, params); 389be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 390be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 391be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 392be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Adds a view to the Dream's window, leaving other content views in place. 393be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 394be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 395be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 396be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 397be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 398be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 399be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void addContentView(View view, ViewGroup.LayoutParams params) { 400be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().addContentView(view, params); 401be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 402be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 403be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 404be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Finds a view that was identified by the id attribute from the XML that 405be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * was processed in {@link #onCreate}. 406be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 407be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 408be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 409be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The view if found or null otherwise. 410be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 411be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View findViewById(int id) { 412be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindow().findViewById(id); 413be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 414be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 415be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 416be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as interactive to receive input events. 417be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 418be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Non-interactive dreams (default) will dismiss on the first input event.</p> 419be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 420be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Interactive dreams should call {@link #finish()} to dismiss themselves.</p> 421be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 422be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param interactive True if this dream will handle input events. 423be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 424be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setInteractive(boolean interactive) { 425be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mInteractive = interactive; 426be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 427be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 428be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 429be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is interactive. Defaults to false. 430be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 431be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setInteractive(boolean) 432be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 433be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isInteractive() { 434be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mInteractive; 435be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 436be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 437be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 438be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view. 439be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 440be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param lowProfile True to set View.SYSTEM_UI_FLAG_LOW_PROFILE 4414c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide There is no reason to have this -- dreams can set this flag 4424c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on their own content view, and from there can actually do the 4434c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * correct interactions with it (seeing when it is cleared etc). 444be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 445be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setLowProfile(boolean lowProfile) { 446be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mLowProfile = lowProfile; 447be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn int flag = View.SYSTEM_UI_FLAG_LOW_PROFILE; 448be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn applySystemUiVisibilityFlags(mLowProfile ? flag : 0, flag); 449be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 450be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 451be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 452be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in low profile mode. Defaults to true. 453be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 454be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setLowProfile(boolean) 4554c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide 456be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 457be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isLowProfile() { 458be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_LOW_PROFILE, mLowProfile); 459be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 460be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 461be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 4624c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * Controls {@link android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} 4634c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on the dream's window. 464be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 4654c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @param fullscreen If true, the fullscreen flag will be set; else it 4664c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * will be cleared. 467be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 468be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setFullscreen(boolean fullscreen) { 469be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mFullscreen = fullscreen; 4704c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN; 4714c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn applyWindowFlags(mFullscreen ? flag : 0, flag); 472be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 473be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 474be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 475be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in fullscreen mode. Defaults to false. 476be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 477be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setFullscreen(boolean) 478be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 479be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isFullscreen() { 4804c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn return mFullscreen; 481be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 482be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 483be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 484be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as keeping the screen bright while dreaming. 485be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 486be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param screenBright True to keep the screen bright while dreaming. 487be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 488be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setScreenBright(boolean screenBright) { 489be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mScreenBright = screenBright; 490be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 491be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn applyWindowFlags(mScreenBright ? flag : 0, flag); 492be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 493be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 494be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 495be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream keeps the screen bright while dreaming. Defaults to false, 496be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * allowing the screen to dim if necessary. 497be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 498be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setScreenBright(boolean) 499be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 500be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isScreenBright() { 501be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindowFlagValue(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, mScreenBright); 502be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 503be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 504be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 5052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is constructed. 506be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 507be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 508be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onCreate() { 5092d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onCreate() on thread " + Thread.currentThread().getId()); 510be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn super.onCreate(); 511be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 512be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 513be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 5142d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the dream's window has been created and is visible and animation may now begin. 5152d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 5162d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStarted() { 5172d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStarted()"); 5182d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 5192d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5202d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5212d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 5222d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is stopped, either by external request or by calling finish(), 5232d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * before the window has been removed. 524be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 5252d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStopped() { 5262d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStopped()"); 527be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // hook for subclasses 528be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 529be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 530be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 531be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 532be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public final IBinder onBind(Intent intent) { 5332d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onBind() intent = " + intent); 534be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return new DreamServiceWrapper(); 535be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 536be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 537be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 538be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Stops the dream, detaches from the window, and wakes up. 539be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 5402d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public final void finish() { 5412d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "finish()"); 542be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 543be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 544be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 545be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 546be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 547be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDestroy() { 5482d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDestroy()"); 5492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 550c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler 551c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // Just in case destroy came in before detach, let's take care of that now 552c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler detach(); 553c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler 554c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler super.onDestroy(); 5552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5572d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // end public api 5582d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5592d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private void loadSandman() { 5602d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mSandman = IDreamManager.Stub.asInterface(ServiceManager.getService(DREAM_SERVICE)); 5612d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5632d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 564c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler * Called by DreamController.stopDream() when the Dream is about to be unbound and destroyed. 5652d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 5662d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 5672d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 5682d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private final void detach() { 5692d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindow == null) { 570c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // already detached! 5712d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 5722d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5742d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 5752d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler onDreamingStopped(); 5762d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 5772d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.w(TAG, "Crashed in onDreamingStopped()", t); 5782d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // we were going to stop anyway 5792d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 580be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5812d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "detach(): Removing window from window manager"); 582be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 583c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // force our window to be removed synchronously 584c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler mWindowManager.removeViewImmediate(mWindow.getDecorView()); 585c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // the following will print a log message if it finds any other leaked windows 586c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler WindowManagerGlobal.getInstance().closeAll(mWindowToken, 587c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler this.getClass().getName(), "Dream"); 588be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 589be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed removing window view", t); 590be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 591be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5922d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mWindow = null; 5932d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mWindowToken = null; 594be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 595be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5962d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 5972d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the Dream is ready to be shown. 5982d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 5992d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 6002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 6012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @param windowToken A window token that will allow a window to be created in the correct layer. 6022d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 603be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final void attach(IBinder windowToken) { 6042d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindowToken != null) { 6052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.e(TAG, "attach() called when already attached with token=" + mWindowToken); 6062d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 6072d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 6082d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 6092d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Attached on thread " + Thread.currentThread().getId()); 610be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 611be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mSandman == null) { 612be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn loadSandman(); 613be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 614be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowToken = windowToken; 615be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow = PolicyManager.makeNewWindow(this); 616be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setCallback(this); 617be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.requestFeature(Window.FEATURE_NO_TITLE); 618be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setBackgroundDrawable(new ColorDrawable(0xFF000000)); 6194c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn mWindow.setFormat(PixelFormat.OPAQUE); 620be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6212d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, String.format("Attaching window token: %s to window of type %s", 622be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn windowToken, WindowManager.LayoutParams.TYPE_DREAM)); 623be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 624be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 625be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.type = WindowManager.LayoutParams.TYPE_DREAM; 626be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.token = windowToken; 627be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.windowAnimations = com.android.internal.R.style.Animation_Dream; 6284c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn lp.flags |= ( WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 6294c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR 6304c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 631be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 632be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 6334c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn | (mFullscreen ? WindowManager.LayoutParams.FLAG_FULLSCREEN : 0) 634be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | (mScreenBright ? WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON : 0) 635be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn ); 636be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 637be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6382d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Created and attached window: " + mWindow); 639be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 640be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setWindowManager(null, windowToken, "dream", true); 641be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager = mWindow.getWindowManager(); 642be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6432d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Window added on thread " + Thread.currentThread().getId()); 6442d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 6452d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler applySystemUiVisibilityFlags( 6464c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn (mLowProfile ? View.SYSTEM_UI_FLAG_LOW_PROFILE : 0), 6474c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn View.SYSTEM_UI_FLAG_LOW_PROFILE); 6482d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler getWindowManager().addView(mWindow.getDecorView(), mWindow.getAttributes()); 6492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 650f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren Slog.w(TAG, "Crashed adding window view", t); 6512d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler safelyFinish(); 6522d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 6532d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 654be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // start it up 656f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren mHandler.post(new Runnable() { 657f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren @Override 658f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren public void run() { 659f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren try { 660f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren onDreamingStarted(); 661f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren } catch (Throwable t) { 662f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren Slog.w(TAG, "Crashed in onDreamingStarted()", t); 663f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren safelyFinish(); 664f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren } 665f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren } 666f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren }); 667be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 668be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 669be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void safelyFinish() { 6702d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "safelyFinish()"); 671be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 672be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finish(); 673be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 674be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed in safelyFinish()", t); 675be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 676be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return; 677be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 678be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 679be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mFinished) { 680be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Bad dream, did not call super.finish()"); 681be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 682be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 683be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 684be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 685be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void finishInternal() { 6862d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "finishInternal() mFinished = " + mFinished); 687be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mFinished) return; 688be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 689be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mFinished = true; 690be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 691be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mSandman != null) { 692be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mSandman.finishSelf(mWindowToken); 693be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else { 694be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "No dream manager found"); 695be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 696be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn stopSelf(); // if launched via any other means 697be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 698be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 699be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed in finishInternal()", t); 700be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 701be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 702be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 703be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getWindowFlagValue(int flag, boolean defaultValue) { 704be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow == null ? defaultValue : (mWindow.getAttributes().flags & flag) != 0; 705be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 706be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 707be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applyWindowFlags(int flags, int mask) { 708be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mWindow != null) { 709be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 710be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.flags = applyFlags(lp.flags, flags, mask); 711be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 712be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager.updateViewLayout(mWindow.getDecorView(), lp); 713be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 714be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 715be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 716be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getSystemUiVisibilityFlagValue(int flag, boolean defaultValue) { 717be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 718be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return v == null ? defaultValue : (v.getSystemUiVisibility() & flag) != 0; 719be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 720be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 721be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applySystemUiVisibilityFlags(int flags, int mask) { 722be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 723be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (v != null) { 724be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn v.setSystemUiVisibility(applyFlags(v.getSystemUiVisibility(), flags, mask)); 725be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 726be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 727be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 728be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private int applyFlags(int oldFlags, int flags, int mask) { 729be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return (oldFlags&~mask) | (flags&mask); 730be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 731be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 7322d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 7332d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 7342d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler super.dump(fd, pw, args); 7352d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 7362d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.print(TAG + ": "); 7372d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindowToken == null) { 7382d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println("stopped"); 7392d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } else { 7402d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println("running (token=" + mWindowToken + ")"); 7412d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7422d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println(" window: " + mWindow); 7432d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.print(" flags:"); 7442d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isInteractive()) pw.print(" interactive"); 7452d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isLowProfile()) pw.print(" lowprofile"); 7462d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isFullscreen()) pw.print(" fullscreen"); 7472d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isScreenBright()) pw.print(" bright"); 7482d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println(); 7492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7502d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 751be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private class DreamServiceWrapper extends IDreamService.Stub { 7522d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void attach(final IBinder windowToken) { 7532d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 7542d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 7552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 7562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.attach(windowToken); 7572d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7582d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 7592d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7602d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void detach() { 7612d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 7622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 7632d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 7642d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.detach(); 7652d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7662d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 767be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 768be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 769be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 770be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn} 771