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/** 476c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * Extend this class to implement a custom dream (available to the user as a "Daydream"). 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 * 536c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * <p>The {@code DreamService} 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} 626c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * <p>Use this to dismantle resources (for example, detach from handlers 636c9a1a1004f224e771139aec6fd2058aa6bdccbdScott 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 * 696c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * <p>To be available to the system, your {@code DreamService} should be declared in the 706c9a1a1004f224e771139aec6fd2058aa6bdccbdScott Main * manifest as follows:</p> 71be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <pre> 723a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <service 73be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name=".MyDream" 74be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:exported="true" 75be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:icon="@drawable/my_icon" 76be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:label="@string/my_dream_label" > 77be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 783a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <intent-filter> 793a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <action android:name="android.service.dreams.DreamService" /> 803a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <category android:name="android.intent.category.DEFAULT" /> 813a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </intent-filter> 82be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 833a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <!-- Point to additional information for this dream (optional) --> 843a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <meta-data 85be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name="android.service.dream" 86be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:resource="@xml/my_dream" /> 873a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </service> 883a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </pre> 893a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * 906237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>If specified with the {@code <meta-data>} element, 916237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * additional information for the dream is defined using the 926237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link android.R.styleable#Dream <dream>} element in a separate XML file. 936237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * Currently, the only addtional 946237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * information you can provide is for a settings activity that allows the user to configure 956237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * the dream behavior. For example:</p> 966237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p class="code-caption">res/xml/my_dream.xml</p> 976237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <pre> 983a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <dream xmlns:android="http://schemas.android.com/apk/res/android" 993a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * android:settingsActivity="com.example.app/.MyDreamSettingsActivity" /> 100be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * </pre> 1016237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>This makes a Settings button available alongside your dream's listing in the 1026237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * system settings, which when pressed opens the specified activity.</p> 1036237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1046237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1056237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>To specify your dream layout, call {@link #setContentView}, typically during the 1066237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow} callback. For example:</p> 1076237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <pre> 1086237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * public class MyDream extends DreamService { 1096237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1106237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * @Override 1116237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * public void onAttachedToWindow() { 1126237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * super.onAttachedToWindow(); 1136237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * 1146237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Exit dream upon user touch 1156237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setInteractive(false); 1166237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Hide system UI 1176237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setFullscreen(true); 1186237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * // Set the dream layout 1196237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * setContentView(R.layout.dream); 1206237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * } 1216237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * } 1226237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * </pre> 123be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 124be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornpublic class DreamService extends Service implements Window.Callback { 125be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final String TAG = DreamService.class.getSimpleName() + "[" + getClass().getSimpleName() + "]"; 126be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 127be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 128be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The name of the dream manager service. 129be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @hide 130be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 131be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_SERVICE = "dreams"; 132be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 133be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 134be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The {@link Intent} that must be declared as handled by the service. 135be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 136be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @SdkConstant(SdkConstantType.SERVICE_ACTION) 137be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String SERVICE_INTERFACE = 138be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn "android.service.dreams.DreamService"; 139be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 140be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 141be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Name under which a Dream publishes information about itself. 142be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * This meta-data must reference an XML resource containing 143be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * a <code><{@link android.R.styleable#Dream dream}></code> 144be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * tag. 145be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 146be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_META_DATA = "android.service.dream"; 147be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 148be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final Handler mHandler = new Handler(); 149be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IBinder mWindowToken; 150be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private Window mWindow; 151be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private WindowManager mWindowManager; 152be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IDreamManager mSandman; 153be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mInteractive = false; 154be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mLowProfile = true; 155be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFullscreen = false; 156a934fd142ec59b297b31c1f0b664e0c0d5e61ebaChris Wren private boolean mScreenBright = true; 157be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFinished; 158be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1592d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private boolean mDebug = false; 1602d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 1612d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 1622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @hide 1632d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 1642d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void setDebug(boolean dbg) { 1652d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mDebug = dbg; 1662d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 1672d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 168be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin Window.Callback methods 169be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 170be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 171be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyEvent(KeyEvent event) { 172be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // TODO: create more flexible version of mInteractive that allows use of KEYCODE_BACK 173be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 1742d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on keyEvent"); 175be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 176be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 177be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 1782d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on back key"); 179be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 180be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 181be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 182be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyEvent(event); 183be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 184be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 185be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 186be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 187be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyShortcutEvent(KeyEvent event) { 1882d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 1892d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on keyShortcutEvent"); 190be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 191be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 192be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 193be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyShortcutEvent(event); 194be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 195be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 196be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 197be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 198be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTouchEvent(MotionEvent event) { 1992d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // TODO: create more flexible version of mInteractive that allows clicks 200be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // but finish()es on any other kind of activity 2012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 2022d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on touchEvent"); 203be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 204be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 205be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 206be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTouchEvent(event); 207be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 208be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 209be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 210be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 211be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTrackballEvent(MotionEvent event) { 212be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 2132d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on trackballEvent"); 214be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 215be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 216be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 217be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTrackballEvent(event); 218be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 219be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 220be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 221be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 222be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchGenericMotionEvent(MotionEvent event) { 2232d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 2242d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on genericMotionEvent"); 225be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 226be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 227be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 228be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchGenericMotionEvent(event); 229be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 230be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 231be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 232be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 233be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 234be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 235be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 236be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 237be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 238be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 239be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View onCreatePanelView(int featureId) { 240be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 241be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 242be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 243be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 244be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 245be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onCreatePanelMenu(int featureId, Menu menu) { 246be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 247be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 248be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 249be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 250be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 251be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onPreparePanel(int featureId, View view, Menu menu) { 252be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 253be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 254be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 255be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 256be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 257be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuOpened(int featureId, Menu menu) { 258be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 259be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 260be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 261be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 262be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 263be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuItemSelected(int featureId, MenuItem item) { 264be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 265be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 266be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 267be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 268be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 269be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowAttributesChanged(LayoutParams attrs) { 270be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 271be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 272be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 273be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 274be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onContentChanged() { 275be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 276be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 277be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 278be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 279be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 280be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 281be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 282be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 283be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 284be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onAttachedToWindow() { 285be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 286be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 287be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 288be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 289be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDetachedFromWindow() { 290be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 291be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 292be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 293be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 294be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onPanelClosed(int featureId, Menu menu) { 295be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 296be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 297be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 298be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 299be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onSearchRequested() { 300be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 301be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 302be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 303be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 304be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 305be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback callback) { 306be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 307be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 308be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 309be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 310be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 311be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeStarted(ActionMode mode) { 312be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 313be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 314be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 315be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 316be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeFinished(ActionMode mode) { 317be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 318be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // end Window.Callback methods 319be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 320be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin public api 321be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 322be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.WindowManager} for the dream. 323be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindowManager()}. 324be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 325be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window manager, or null if the dream is not started. 326be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 327be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public WindowManager getWindowManager() { 328be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindowManager; 329be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 330be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 331be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 332be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.Window} for the dream. 333be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindow()}. 334be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 335be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window, or null if the dream is not started. 336be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 337be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public Window getWindow() { 338be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow; 339be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 340be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 341be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 342be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Inflates a layout resource and set it to be the content view for this Dream. 343be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#setContentView(int)}. 344be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 345be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 346be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 347be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param layoutResID Resource ID to be inflated. 3482d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 349be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 350be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 351be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 352be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(int layoutResID) { 353be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(layoutResID); 354be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 355be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 356be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 357be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 3586237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * Behaves similarly to {@link android.app.Activity#setContentView(android.view.View)} in an activity, 359be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * including using {@link ViewGroup.LayoutParams#MATCH_PARENT} as the layout height and width of the view. 360be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 3616237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Note: This requires a window, so you should usually call it during 3626237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow()} and never earlier (you <strong>cannot</strong> call it 3636237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * during {@link #onCreate}).</p> 364be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 365be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 366be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 367be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 368be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view) { 369be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view); 370be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 371be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 372be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 373be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 3742d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Behaves similarly to 3756237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link android.app.Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)} 3766237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * in an activity. 377be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 3786237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * <p>Note: This requires a window, so you should usually call it during 3796237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * {@link #onAttachedToWindow()} and never earlier (you <strong>cannot</strong> call it 3806237ac19bf4eed261e8b0c69fac774581b4ea02bScott Main * during {@link #onCreate}).</p> 381be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 382be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 383be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 384be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 385be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 386be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 387be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 388be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view, ViewGroup.LayoutParams params) { 389be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view, params); 390be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 391be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 392be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 393be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Adds a view to the Dream's window, leaving other content views in place. 394be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 395be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 396be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 397be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 398be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 399be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 400be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void addContentView(View view, ViewGroup.LayoutParams params) { 401be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().addContentView(view, params); 402be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 403be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 404be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 405be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Finds a view that was identified by the id attribute from the XML that 406be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * was processed in {@link #onCreate}. 407be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 408be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 409be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 410be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The view if found or null otherwise. 411be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 412be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View findViewById(int id) { 413be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindow().findViewById(id); 414be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 415be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 416be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 417be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as interactive to receive input events. 418be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 419be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Non-interactive dreams (default) will dismiss on the first input event.</p> 420be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 421be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Interactive dreams should call {@link #finish()} to dismiss themselves.</p> 422be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 423be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param interactive True if this dream will handle input events. 424be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 425be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setInteractive(boolean interactive) { 426be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mInteractive = interactive; 427be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 428be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 429be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 430be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is interactive. Defaults to false. 431be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 432be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setInteractive(boolean) 433be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 434be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isInteractive() { 435be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mInteractive; 436be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 437be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 438be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 439be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view. 440be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 441be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param lowProfile True to set View.SYSTEM_UI_FLAG_LOW_PROFILE 4424c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide There is no reason to have this -- dreams can set this flag 4434c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on their own content view, and from there can actually do the 4444c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * correct interactions with it (seeing when it is cleared etc). 445be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 446be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setLowProfile(boolean lowProfile) { 447be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mLowProfile = lowProfile; 448be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn int flag = View.SYSTEM_UI_FLAG_LOW_PROFILE; 449be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn applySystemUiVisibilityFlags(mLowProfile ? flag : 0, flag); 450be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 451be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 452be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 453be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in low profile mode. Defaults to true. 454be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 455be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setLowProfile(boolean) 4564c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide 457be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 458be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isLowProfile() { 459be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_LOW_PROFILE, mLowProfile); 460be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 461be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 462be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 4634c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * Controls {@link android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} 4644c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on the dream's window. 465be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 4664c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @param fullscreen If true, the fullscreen flag will be set; else it 4674c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * will be cleared. 468be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 469be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setFullscreen(boolean fullscreen) { 470be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mFullscreen = fullscreen; 4714c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN; 4724c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn applyWindowFlags(mFullscreen ? flag : 0, flag); 473be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 474be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 475be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 476be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in fullscreen mode. Defaults to false. 477be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 478be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setFullscreen(boolean) 479be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 480be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isFullscreen() { 4814c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn return mFullscreen; 482be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 483be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 484be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 485be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as keeping the screen bright while dreaming. 486be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 487be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param screenBright True to keep the screen bright while dreaming. 488be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 489be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setScreenBright(boolean screenBright) { 490be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mScreenBright = screenBright; 491be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 492be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn applyWindowFlags(mScreenBright ? flag : 0, flag); 493be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 494be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 495be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 496be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream keeps the screen bright while dreaming. Defaults to false, 497be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * allowing the screen to dim if necessary. 498be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 499be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setScreenBright(boolean) 500be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 501be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isScreenBright() { 502be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindowFlagValue(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, mScreenBright); 503be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 504be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 505be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 5062d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is constructed. 507be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 508be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 509be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onCreate() { 5102d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onCreate() on thread " + Thread.currentThread().getId()); 511be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn super.onCreate(); 512be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 513be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 514be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 5152d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the dream's window has been created and is visible and animation may now begin. 5162d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 5172d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStarted() { 5182d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStarted()"); 5192d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 5202d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5212d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5222d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 5232d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is stopped, either by external request or by calling finish(), 5242d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * before the window has been removed. 525be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 5262d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStopped() { 5272d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStopped()"); 528be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // hook for subclasses 529be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 530be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 531be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 532be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 533be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public final IBinder onBind(Intent intent) { 5342d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onBind() intent = " + intent); 535be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return new DreamServiceWrapper(); 536be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 537be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 538be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 539be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Stops the dream, detaches from the window, and wakes up. 540be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 5412d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public final void finish() { 5422d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "finish()"); 543be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 544be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 545be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 546be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 547be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 548be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDestroy() { 5492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDestroy()"); 5502d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 551c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler 552c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // Just in case destroy came in before detach, let's take care of that now 553c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler detach(); 554c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler 555c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler super.onDestroy(); 5562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5572d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5582d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // end public api 5592d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5602d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private void loadSandman() { 5612d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mSandman = IDreamManager.Stub.asInterface(ServiceManager.getService(DREAM_SERVICE)); 5622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5632d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5642d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 565c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler * Called by DreamController.stopDream() when the Dream is about to be unbound and destroyed. 5662d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 5672d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 5682d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 5692d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private final void detach() { 5702d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindow == null) { 571c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // already detached! 5722d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 5732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5742d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5752d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 5762d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler onDreamingStopped(); 5772d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 5782d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.w(TAG, "Crashed in onDreamingStopped()", t); 5792d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // we were going to stop anyway 5802d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 581be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5822d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "detach(): Removing window from window manager"); 583be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 584c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // force our window to be removed synchronously 585c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler mWindowManager.removeViewImmediate(mWindow.getDecorView()); 586c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler // the following will print a log message if it finds any other leaked windows 587c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler WindowManagerGlobal.getInstance().closeAll(mWindowToken, 588c13107046acfcda7e3402a56a617818b7e77e1b8Daniel Sandler this.getClass().getName(), "Dream"); 589be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 590be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed removing window view", t); 591be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 592be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5932d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mWindow = null; 5942d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mWindowToken = null; 595be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 596be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5972d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 5982d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the Dream is ready to be shown. 5992d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 6002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 6012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 6022d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @param windowToken A window token that will allow a window to be created in the correct layer. 6032d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 604be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final void attach(IBinder windowToken) { 6052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindowToken != null) { 6062d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.e(TAG, "attach() called when already attached with token=" + mWindowToken); 6072d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 6082d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 6092d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 6102d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Attached on thread " + Thread.currentThread().getId()); 611be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 612be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mSandman == null) { 613be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn loadSandman(); 614be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 615be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowToken = windowToken; 616be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow = PolicyManager.makeNewWindow(this); 617be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setCallback(this); 618be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.requestFeature(Window.FEATURE_NO_TITLE); 619be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setBackgroundDrawable(new ColorDrawable(0xFF000000)); 6204c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn mWindow.setFormat(PixelFormat.OPAQUE); 621be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6222d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, String.format("Attaching window token: %s to window of type %s", 623be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn windowToken, WindowManager.LayoutParams.TYPE_DREAM)); 624be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 625be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 626be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.type = WindowManager.LayoutParams.TYPE_DREAM; 627be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.token = windowToken; 628be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.windowAnimations = com.android.internal.R.style.Animation_Dream; 6294c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn lp.flags |= ( WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 6304c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR 6314c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 632be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 633be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 6344c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn | (mFullscreen ? WindowManager.LayoutParams.FLAG_FULLSCREEN : 0) 635be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | (mScreenBright ? WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON : 0) 636be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn ); 637be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 638be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6392d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Created and attached window: " + mWindow); 640be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 641be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setWindowManager(null, windowToken, "dream", true); 642be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager = mWindow.getWindowManager(); 643be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6442d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Window added on thread " + Thread.currentThread().getId()); 6452d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 6462d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler applySystemUiVisibilityFlags( 6474c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn (mLowProfile ? View.SYSTEM_UI_FLAG_LOW_PROFILE : 0), 6484c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn View.SYSTEM_UI_FLAG_LOW_PROFILE); 6492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler getWindowManager().addView(mWindow.getDecorView(), mWindow.getAttributes()); 6502d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 651f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren Slog.w(TAG, "Crashed adding window view", t); 6522d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler safelyFinish(); 6532d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 6542d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 655be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // start it up 657f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren mHandler.post(new Runnable() { 658f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren @Override 659f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren public void run() { 660f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren try { 661f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren onDreamingStarted(); 662f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren } catch (Throwable t) { 663f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren Slog.w(TAG, "Crashed in onDreamingStarted()", t); 664f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren safelyFinish(); 665f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren } 666f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren } 667f434d23a16b34e7815049db29bbcd0cd8a4e4862Chris Wren }); 668be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 669be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 670be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void safelyFinish() { 6712d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "safelyFinish()"); 672be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 673be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finish(); 674be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 675be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed in safelyFinish()", t); 676be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 677be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return; 678be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 679be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 680be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mFinished) { 681be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Bad dream, did not call super.finish()"); 682be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 683be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 684be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 685be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 686be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void finishInternal() { 6872d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "finishInternal() mFinished = " + mFinished); 688be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mFinished) return; 689be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 690be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mFinished = true; 691be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 692be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mSandman != null) { 693be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mSandman.finishSelf(mWindowToken); 694be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else { 695be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "No dream manager found"); 696be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 697be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn stopSelf(); // if launched via any other means 698be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 699be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 700be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed in finishInternal()", t); 701be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 702be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 703be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 704be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getWindowFlagValue(int flag, boolean defaultValue) { 705be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow == null ? defaultValue : (mWindow.getAttributes().flags & flag) != 0; 706be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 707be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 708be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applyWindowFlags(int flags, int mask) { 709be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mWindow != null) { 710be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 711be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.flags = applyFlags(lp.flags, flags, mask); 712be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 713be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager.updateViewLayout(mWindow.getDecorView(), lp); 714be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 715be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 716be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 717be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getSystemUiVisibilityFlagValue(int flag, boolean defaultValue) { 718be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 719be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return v == null ? defaultValue : (v.getSystemUiVisibility() & flag) != 0; 720be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 721be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 722be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applySystemUiVisibilityFlags(int flags, int mask) { 723be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 724be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (v != null) { 725be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn v.setSystemUiVisibility(applyFlags(v.getSystemUiVisibility(), flags, mask)); 726be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 727be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 728be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 729be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private int applyFlags(int oldFlags, int flags, int mask) { 730be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return (oldFlags&~mask) | (flags&mask); 731be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 732be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 7332d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 7342d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 7352d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler super.dump(fd, pw, args); 7362d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 7372d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.print(TAG + ": "); 7382d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindowToken == null) { 7392d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println("stopped"); 7402d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } else { 7412d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println("running (token=" + mWindowToken + ")"); 7422d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7432d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println(" window: " + mWindow); 7442d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.print(" flags:"); 7452d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isInteractive()) pw.print(" interactive"); 7462d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isLowProfile()) pw.print(" lowprofile"); 7472d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isFullscreen()) pw.print(" fullscreen"); 7482d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isScreenBright()) pw.print(" bright"); 7492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println(); 7502d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7512d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 752be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private class DreamServiceWrapper extends IDreamService.Stub { 7532d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void attach(final IBinder windowToken) { 7542d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 7552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 7562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 7572d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.attach(windowToken); 7582d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7592d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 7602d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7612d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void detach() { 7622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 7632d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 7642d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 7652d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.detach(); 7662d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7672d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 768be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 769be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 770be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 771be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn} 772