DreamService.java revision a934fd142ec59b297b31c1f0b664e0c0d5e61eba
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; 40be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.WindowManager.LayoutParams; 41be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.accessibility.AccessibilityEvent; 42be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 43be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport com.android.internal.policy.PolicyManager; 44be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 45be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn/** 462d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Extend this class to implement a custom Dream (displayed to the user as a "Sleep Mode"). 47be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 48be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Dreams are interactive screensavers launched when a charging device is idle, or docked in a 49be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * desk dock. Dreams provide another modality for apps to express themselves, tailored for 50be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * an exhibition/lean-back experience.</p> 51be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 522d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>The Dream lifecycle is as follows:</p> 532d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <ul> 542d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <li>onAttachedToWindow</li> 552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <li>onDreamingStarted</li> 562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <li>onDreamingStopped</li> 572d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <li>onDetachedFromWindow</li> 582d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * </ul> 592d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 602d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>In addition, onCreate and onDestroy (from the Service interface) will also be called, but 612d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * initialization and teardown should be done by overriding the hooks above.</p> 622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 632d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>To be available to the system, Dreams should be declared in the manifest as follows:</p> 64be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <pre> 653a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <service 66be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name=".MyDream" 67be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:exported="true" 68be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:icon="@drawable/my_icon" 69be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:label="@string/my_dream_label" > 70be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 713a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <intent-filter> 723a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <action android:name="android.service.dreams.DreamService" /> 733a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <category android:name="android.intent.category.DEFAULT" /> 743a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </intent-filter> 75be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 763a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <!-- Point to additional information for this dream (optional) --> 773a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <meta-data 78be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name="android.service.dream" 79be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:resource="@xml/my_dream" /> 803a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </service> 813a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </pre> 823a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <p>If specified, additional information for the dream is defined using the 833a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <code><{@link android.R.styleable#Dream dream}></code> element. For example:</p> 843a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <pre> 853a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * (in res/xml/my_dream.xml) 863a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * 873a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <dream xmlns:android="http://schemas.android.com/apk/res/android" 883a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * android:settingsActivity="com.example.app/.MyDreamSettingsActivity" /> 89be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * </pre> 90be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 91be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornpublic class DreamService extends Service implements Window.Callback { 92be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final String TAG = DreamService.class.getSimpleName() + "[" + getClass().getSimpleName() + "]"; 93be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 94be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 95be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The name of the dream manager service. 96be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @hide 97be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 98be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_SERVICE = "dreams"; 99be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 100be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 101be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The {@link Intent} that must be declared as handled by the service. 102be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 103be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @SdkConstant(SdkConstantType.SERVICE_ACTION) 104be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String SERVICE_INTERFACE = 105be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn "android.service.dreams.DreamService"; 106be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 107be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 108be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Name under which a Dream publishes information about itself. 109be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * This meta-data must reference an XML resource containing 110be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * a <code><{@link android.R.styleable#Dream dream}></code> 111be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * tag. 112be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 113be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_META_DATA = "android.service.dream"; 114be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 115be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final Handler mHandler = new Handler(); 116be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IBinder mWindowToken; 117be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private Window mWindow; 118be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private WindowManager mWindowManager; 119be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IDreamManager mSandman; 120be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mInteractive = false; 121be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mLowProfile = true; 122be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFullscreen = false; 123a934fd142ec59b297b31c1f0b664e0c0d5e61ebaChris Wren private boolean mScreenBright = true; 124be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFinished; 125be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1262d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private boolean mDebug = false; 1272d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 1282d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 1292d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @hide 1302d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 1312d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void setDebug(boolean dbg) { 1322d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mDebug = dbg; 1332d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 1342d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 135be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin Window.Callback methods 136be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 137be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 138be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyEvent(KeyEvent event) { 139be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // TODO: create more flexible version of mInteractive that allows use of KEYCODE_BACK 140be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 1412d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on keyEvent"); 142be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 143be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 144be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 1452d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on back key"); 146be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 147be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 148be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 149be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyEvent(event); 150be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 151be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 152be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 153be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 154be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyShortcutEvent(KeyEvent event) { 1552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 1562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on keyShortcutEvent"); 157be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 158be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 159be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 160be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyShortcutEvent(event); 161be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 162be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 163be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 164be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 165be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTouchEvent(MotionEvent event) { 1662d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // TODO: create more flexible version of mInteractive that allows clicks 167be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // but finish()es on any other kind of activity 1682d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 1692d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on touchEvent"); 170be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 171be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 172be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 173be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTouchEvent(event); 174be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 175be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 176be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 177be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 178be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTrackballEvent(MotionEvent event) { 179be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 1802d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on trackballEvent"); 181be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 182be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 183be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 184be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTrackballEvent(event); 185be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 186be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 187be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 188be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 189be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchGenericMotionEvent(MotionEvent event) { 1902d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 1912d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on genericMotionEvent"); 192be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 193be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 194be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 195be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchGenericMotionEvent(event); 196be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 197be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 198be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 199be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 200be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 201be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 202be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 203be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 204be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 205be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 206be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View onCreatePanelView(int featureId) { 207be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 208be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 209be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 210be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 211be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 212be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onCreatePanelMenu(int featureId, Menu menu) { 213be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 214be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 215be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 216be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 217be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 218be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onPreparePanel(int featureId, View view, Menu menu) { 219be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 220be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 221be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 222be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 223be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 224be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuOpened(int featureId, Menu menu) { 225be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 226be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 227be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 228be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 229be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 230be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuItemSelected(int featureId, MenuItem item) { 231be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 232be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 233be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 234be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 235be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 236be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowAttributesChanged(LayoutParams attrs) { 237be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 238be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 239be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 240be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 241be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onContentChanged() { 242be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 243be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 244be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 245be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 246be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 247be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 248be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 249be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 250be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 251be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onAttachedToWindow() { 252be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 253be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 254be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 255be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 256be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDetachedFromWindow() { 257be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 258be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 259be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 260be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 261be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onPanelClosed(int featureId, Menu menu) { 262be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 263be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 264be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 265be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 266be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onSearchRequested() { 267be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 268be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 269be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 270be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 271be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 272be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback callback) { 273be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 274be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 275be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 276be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 277be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 278be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeStarted(ActionMode mode) { 279be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 280be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 281be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 282be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 283be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeFinished(ActionMode mode) { 284be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 285be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // end Window.Callback methods 286be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 287be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin public api 288be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 289be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.WindowManager} for the dream. 290be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindowManager()}. 291be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 292be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window manager, or null if the dream is not started. 293be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 294be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public WindowManager getWindowManager() { 295be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindowManager; 296be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 297be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 298be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 299be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.Window} for the dream. 300be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindow()}. 301be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 302be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window, or null if the dream is not started. 303be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 304be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public Window getWindow() { 305be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow; 306be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 307be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 308be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 309be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Inflates a layout resource and set it to be the content view for this Dream. 310be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#setContentView(int)}. 311be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 312be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 313be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 314be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param layoutResID Resource ID to be inflated. 3152d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 316be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 317be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 318be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 319be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(int layoutResID) { 320be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(layoutResID); 321be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 322be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 323be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 324be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 325be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#setContentView(android.view.View)}, 326be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * including using {@link ViewGroup.LayoutParams#MATCH_PARENT} as the layout height and width of the view. 327be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 328be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 329be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 330be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 331be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 332be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 333be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 334be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view) { 335be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view); 336be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 337be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 338be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 339be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 3402d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Behaves similarly to 341be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * {@link android.app.Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}. 342be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 343be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 344be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 345be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 346be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 347be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 348be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 349be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 350be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 351be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view, ViewGroup.LayoutParams params) { 352be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view, params); 353be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 354be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 355be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 356be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Adds a view to the Dream's window, leaving other content views in place. 357be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 358be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 359be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 360be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 361be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 362be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 363be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void addContentView(View view, ViewGroup.LayoutParams params) { 364be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().addContentView(view, params); 365be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 366be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 367be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 368be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Finds a view that was identified by the id attribute from the XML that 369be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * was processed in {@link #onCreate}. 370be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 371be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 372be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 373be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The view if found or null otherwise. 374be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 375be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View findViewById(int id) { 376be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindow().findViewById(id); 377be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 378be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 379be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 380be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as interactive to receive input events. 381be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 382be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Non-interactive dreams (default) will dismiss on the first input event.</p> 383be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 384be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Interactive dreams should call {@link #finish()} to dismiss themselves.</p> 385be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 386be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param interactive True if this dream will handle input events. 387be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 388be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setInteractive(boolean interactive) { 389be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mInteractive = interactive; 390be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 391be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 392be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 393be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is interactive. Defaults to false. 394be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 395be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setInteractive(boolean) 396be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 397be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isInteractive() { 398be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mInteractive; 399be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 400be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 401be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 402be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view. 403be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 404be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param lowProfile True to set View.SYSTEM_UI_FLAG_LOW_PROFILE 4054c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide There is no reason to have this -- dreams can set this flag 4064c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on their own content view, and from there can actually do the 4074c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * correct interactions with it (seeing when it is cleared etc). 408be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 409be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setLowProfile(boolean lowProfile) { 410be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mLowProfile = lowProfile; 411be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn int flag = View.SYSTEM_UI_FLAG_LOW_PROFILE; 412be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn applySystemUiVisibilityFlags(mLowProfile ? flag : 0, flag); 413be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 414be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 415be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 416be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in low profile mode. Defaults to true. 417be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 418be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setLowProfile(boolean) 4194c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @hide 420be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 421be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isLowProfile() { 422be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_LOW_PROFILE, mLowProfile); 423be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 424be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 425be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 4264c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * Controls {@link android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} 4274c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * on the dream's window. 428be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 4294c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * @param fullscreen If true, the fullscreen flag will be set; else it 4304c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn * will be cleared. 431be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 432be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setFullscreen(boolean fullscreen) { 433be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mFullscreen = fullscreen; 4344c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN; 4354c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn applyWindowFlags(mFullscreen ? flag : 0, flag); 436be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 437be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 438be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 439be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in fullscreen mode. Defaults to false. 440be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 441be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setFullscreen(boolean) 442be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 443be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isFullscreen() { 4444c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn return mFullscreen; 445be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 446be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 447be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 448be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as keeping the screen bright while dreaming. 449be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 450be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param screenBright True to keep the screen bright while dreaming. 451be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 452be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setScreenBright(boolean screenBright) { 453be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mScreenBright = screenBright; 454be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 455be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn applyWindowFlags(mScreenBright ? flag : 0, flag); 456be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 457be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 458be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 459be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream keeps the screen bright while dreaming. Defaults to false, 460be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * allowing the screen to dim if necessary. 461be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 462be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setScreenBright(boolean) 463be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 464be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isScreenBright() { 465be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindowFlagValue(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, mScreenBright); 466be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 467be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 468be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 4692d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is constructed. 470be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 471be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 472be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onCreate() { 4732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onCreate() on thread " + Thread.currentThread().getId()); 474be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn super.onCreate(); 475be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 476be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 477be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 4782d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the dream's window has been created and is visible and animation may now begin. 4792d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 4802d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStarted() { 4812d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStarted()"); 4822d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 4832d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 4842d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 4852d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 4862d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is stopped, either by external request or by calling finish(), 4872d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * before the window has been removed. 488be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 4892d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStopped() { 4902d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStopped()"); 491be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // hook for subclasses 492be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 493be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 494be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 495be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 496be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public final IBinder onBind(Intent intent) { 4972d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onBind() intent = " + intent); 498be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return new DreamServiceWrapper(); 499be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 500be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 501be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 502be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Stops the dream, detaches from the window, and wakes up. 503be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 5042d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public final void finish() { 5052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "finish()"); 506be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 507be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 508be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 509be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 510be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 511be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDestroy() { 5122d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDestroy()"); 513be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn super.onDestroy(); 5142d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 5152d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5162d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5172d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // end public api 5182d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5192d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private void loadSandman() { 5202d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mSandman = IDreamManager.Stub.asInterface(ServiceManager.getService(DREAM_SERVICE)); 5212d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5222d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5232d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 5242d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the Dream is about to be unbound and destroyed. 5252d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 5262d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 5272d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 5282d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private final void detach() { 5292d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindow == null) { 5302d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.e(TAG, "detach() called when not attached"); 5312d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 5322d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5332d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5342d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 5352d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler onDreamingStopped(); 5362d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 5372d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.w(TAG, "Crashed in onDreamingStopped()", t); 5382d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // we were going to stop anyway 5392d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 540be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5412d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "detach(): Removing window from window manager"); 542be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 543be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager.removeView(mWindow.getDecorView()); 544be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 545be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed removing window view", t); 546be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 547be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5482d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mWindow = null; 5492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mWindowToken = null; 550be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 551be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5522d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 5532d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the Dream is ready to be shown. 5542d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 5552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 5562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 5572d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @param windowToken A window token that will allow a window to be created in the correct layer. 5582d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 559be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final void attach(IBinder windowToken) { 5602d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindowToken != null) { 5612d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.e(TAG, "attach() called when already attached with token=" + mWindowToken); 5622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 5632d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5642d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5652d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Attached on thread " + Thread.currentThread().getId()); 566be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 567be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mSandman == null) { 568be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn loadSandman(); 569be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 570be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowToken = windowToken; 571be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow = PolicyManager.makeNewWindow(this); 572be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setCallback(this); 573be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.requestFeature(Window.FEATURE_NO_TITLE); 574be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setBackgroundDrawable(new ColorDrawable(0xFF000000)); 5754c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn mWindow.setFormat(PixelFormat.OPAQUE); 576be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5772d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, String.format("Attaching window token: %s to window of type %s", 578be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn windowToken, WindowManager.LayoutParams.TYPE_DREAM)); 579be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 580be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 581be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.type = WindowManager.LayoutParams.TYPE_DREAM; 582be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.token = windowToken; 583be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.windowAnimations = com.android.internal.R.style.Animation_Dream; 5844c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn lp.flags |= ( WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 5854c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR 5864c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 587be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 588be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 5894c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn | (mFullscreen ? WindowManager.LayoutParams.FLAG_FULLSCREEN : 0) 590be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | (mScreenBright ? WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON : 0) 591be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn ); 592be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 593be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5942d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Created and attached window: " + mWindow); 595be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 596be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setWindowManager(null, windowToken, "dream", true); 597be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager = mWindow.getWindowManager(); 598be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5992d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Window added on thread " + Thread.currentThread().getId()); 6002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 6012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler applySystemUiVisibilityFlags( 6024c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn (mLowProfile ? View.SYSTEM_UI_FLAG_LOW_PROFILE : 0), 6034c1e3183baf39ab69c0289c1511877a8bb0b0f75Dianne Hackborn View.SYSTEM_UI_FLAG_LOW_PROFILE); 6042d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler getWindowManager().addView(mWindow.getDecorView(), mWindow.getAttributes()); 6052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 6062d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.w("Crashed adding window view", t); 6072d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler safelyFinish(); 6082d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 6092d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 610be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6112d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // start it up 6122d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 6132d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler onDreamingStarted(); 6142d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 6152d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.w("Crashed in onDreamingStarted()", t); 6162d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler safelyFinish(); 6172d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 618be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 619be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 620be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void safelyFinish() { 6212d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "safelyFinish()"); 622be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 623be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finish(); 624be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 625be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed in safelyFinish()", t); 626be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 627be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return; 628be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 629be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 630be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mFinished) { 631be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Bad dream, did not call super.finish()"); 632be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 633be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 634be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 635be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 636be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void finishInternal() { 6372d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "finishInternal() mFinished = " + mFinished); 638be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mFinished) return; 639be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 640be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mFinished = true; 641be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 642be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mSandman != null) { 643be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mSandman.finishSelf(mWindowToken); 644be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else { 645be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "No dream manager found"); 646be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 647be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn stopSelf(); // if launched via any other means 648be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 649be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 650be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed in finishInternal()", t); 651be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 652be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 653be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 654be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getWindowFlagValue(int flag, boolean defaultValue) { 655be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow == null ? defaultValue : (mWindow.getAttributes().flags & flag) != 0; 656be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 657be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 658be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applyWindowFlags(int flags, int mask) { 659be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mWindow != null) { 660be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 661be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.flags = applyFlags(lp.flags, flags, mask); 662be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 663be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager.updateViewLayout(mWindow.getDecorView(), lp); 664be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 665be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 666be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 667be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getSystemUiVisibilityFlagValue(int flag, boolean defaultValue) { 668be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 669be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return v == null ? defaultValue : (v.getSystemUiVisibility() & flag) != 0; 670be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 671be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 672be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applySystemUiVisibilityFlags(int flags, int mask) { 673be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 674be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (v != null) { 675be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn v.setSystemUiVisibility(applyFlags(v.getSystemUiVisibility(), flags, mask)); 676be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 677be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 678be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 679be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private int applyFlags(int oldFlags, int flags, int mask) { 680be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return (oldFlags&~mask) | (flags&mask); 681be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 682be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6832d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 6842d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 6852d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler super.dump(fd, pw, args); 6862d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 6872d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.print(TAG + ": "); 6882d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindowToken == null) { 6892d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println("stopped"); 6902d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } else { 6912d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println("running (token=" + mWindowToken + ")"); 6922d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 6932d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println(" window: " + mWindow); 6942d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.print(" flags:"); 6952d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isInteractive()) pw.print(" interactive"); 6962d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isLowProfile()) pw.print(" lowprofile"); 6972d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isFullscreen()) pw.print(" fullscreen"); 6982d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isScreenBright()) pw.print(" bright"); 6992d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println(); 7002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 702be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private class DreamServiceWrapper extends IDreamService.Stub { 7032d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void attach(final IBinder windowToken) { 7042d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 7052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 7062d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 7072d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.attach(windowToken); 7082d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7092d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 7102d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7112d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void detach() { 7122d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 7132d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 7142d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 7152d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.detach(); 7162d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7172d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 718be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 719be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 720be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 721be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn} 722