DreamService.java revision 2d78490292090eeab84694330978c9ad7fad2d37
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; 25be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.graphics.drawable.ColorDrawable; 26be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.Handler; 27be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.IBinder; 28be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.os.ServiceManager; 29be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.util.Slog; 30be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.ActionMode; 31be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.KeyEvent; 32be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.Menu; 33be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.MenuItem; 34be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.MotionEvent; 35be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.View; 36be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.ViewGroup; 37be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.Window; 38be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.WindowManager; 39be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.WindowManager.LayoutParams; 40be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport android.view.accessibility.AccessibilityEvent; 41be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 42be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornimport com.android.internal.policy.PolicyManager; 43be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 44be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn/** 452d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Extend this class to implement a custom Dream (displayed to the user as a "Sleep Mode"). 46be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 47be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Dreams are interactive screensavers launched when a charging device is idle, or docked in a 48be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * desk dock. Dreams provide another modality for apps to express themselves, tailored for 49be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * an exhibition/lean-back experience.</p> 50be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 512d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>The Dream lifecycle is as follows:</p> 522d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <ul> 532d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <li>onAttachedToWindow</li> 542d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <li>onDreamingStarted</li> 552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <li>onDreamingStopped</li> 562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <li>onDetachedFromWindow</li> 572d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * </ul> 582d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 592d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>In addition, onCreate and onDestroy (from the Service interface) will also be called, but 602d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * initialization and teardown should be done by overriding the hooks above.</p> 612d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * <p>To be available to the system, Dreams should be declared in the manifest as follows:</p> 63be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <pre> 643a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <service 65be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name=".MyDream" 66be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:exported="true" 67be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:icon="@drawable/my_icon" 68be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:label="@string/my_dream_label" > 69be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 703a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <intent-filter> 713a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <action android:name="android.service.dreams.DreamService" /> 723a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <category android:name="android.intent.category.DEFAULT" /> 733a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </intent-filter> 74be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 753a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <!-- Point to additional information for this dream (optional) --> 763a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <meta-data 77be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:name="android.service.dream" 78be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * android:resource="@xml/my_dream" /> 793a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </service> 803a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * </pre> 813a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <p>If specified, additional information for the dream is defined using the 823a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <code><{@link android.R.styleable#Dream dream}></code> element. For example:</p> 833a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <pre> 843a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * (in res/xml/my_dream.xml) 853a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * 863a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * <dream xmlns:android="http://schemas.android.com/apk/res/android" 873a4d41a654bf00972da9013854ba0e15b2c01fe9John Spurlock * android:settingsActivity="com.example.app/.MyDreamSettingsActivity" /> 88be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * </pre> 89be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 90be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackbornpublic class DreamService extends Service implements Window.Callback { 91be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final String TAG = DreamService.class.getSimpleName() + "[" + getClass().getSimpleName() + "]"; 92be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 93be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 94be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The name of the dream manager service. 95be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @hide 96be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 97be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_SERVICE = "dreams"; 98be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 99be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 100be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * The {@link Intent} that must be declared as handled by the service. 101be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 102be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @SdkConstant(SdkConstantType.SERVICE_ACTION) 103be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String SERVICE_INTERFACE = 104be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn "android.service.dreams.DreamService"; 105be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 106be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 107be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Name under which a Dream publishes information about itself. 108be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * This meta-data must reference an XML resource containing 109be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * a <code><{@link android.R.styleable#Dream dream}></code> 110be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * tag. 111be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 112be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public static final String DREAM_META_DATA = "android.service.dream"; 113be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 114be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final Handler mHandler = new Handler(); 115be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IBinder mWindowToken; 116be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private Window mWindow; 117be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private WindowManager mWindowManager; 118be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private IDreamManager mSandman; 119be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mInteractive = false; 120be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mLowProfile = true; 121be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFullscreen = false; 122be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mScreenBright = false; 123be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean mFinished; 124be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 1252d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private boolean mDebug = false; 1262d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 1272d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 1282d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @hide 1292d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 1302d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void setDebug(boolean dbg) { 1312d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mDebug = dbg; 1322d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 1332d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 134be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin Window.Callback methods 135be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 136be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 137be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyEvent(KeyEvent event) { 138be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // TODO: create more flexible version of mInteractive that allows use of KEYCODE_BACK 139be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 1402d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on keyEvent"); 141be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 142be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 143be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 1442d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on back key"); 145be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 146be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 147be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 148be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyEvent(event); 149be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 150be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 151be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 152be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 153be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchKeyShortcutEvent(KeyEvent event) { 1542d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 1552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on keyShortcutEvent"); 156be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 157be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 158be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 159be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchKeyShortcutEvent(event); 160be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 161be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 162be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 163be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 164be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTouchEvent(MotionEvent event) { 1652d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // TODO: create more flexible version of mInteractive that allows clicks 166be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // but finish()es on any other kind of activity 1672d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 1682d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on touchEvent"); 169be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 170be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 171be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 172be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTouchEvent(event); 173be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 174be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 175be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 176be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 177be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchTrackballEvent(MotionEvent event) { 178be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mInteractive) { 1792d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on trackballEvent"); 180be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 181be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 182be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 183be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchTrackballEvent(event); 184be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 185be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 186be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 187be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 188be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchGenericMotionEvent(MotionEvent event) { 1892d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (!mInteractive) { 1902d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Finishing on genericMotionEvent"); 191be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn safelyFinish(); 192be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return true; 193be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 194be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow.superDispatchGenericMotionEvent(event); 195be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 196be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 197be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 198be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 199be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 200be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 201be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 202be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 203be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 204be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 205be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View onCreatePanelView(int featureId) { 206be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 207be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 208be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 209be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 210be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 211be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onCreatePanelMenu(int featureId, Menu menu) { 212be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 213be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 214be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 215be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 216be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 217be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onPreparePanel(int featureId, View view, Menu menu) { 218be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 219be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 220be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 221be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 222be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 223be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuOpened(int featureId, Menu menu) { 224be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 225be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 226be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 227be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 228be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 229be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onMenuItemSelected(int featureId, MenuItem item) { 230be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 231be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 232be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 233be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 234be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 235be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowAttributesChanged(LayoutParams attrs) { 236be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 237be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 238be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 239be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 240be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onContentChanged() { 241be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 242be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 243be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 244be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 245be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 246be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 247be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 248be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 249be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 250be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onAttachedToWindow() { 251be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 252be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 253be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 254be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 255be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDetachedFromWindow() { 256be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 257be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 258be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 259be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 260be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onPanelClosed(int featureId, Menu menu) { 261be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 262be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 263be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 264be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 265be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean onSearchRequested() { 266be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return false; 267be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 268be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 269be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 270be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 271be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback callback) { 272be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return null; 273be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 274be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 275be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 276be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 277be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeStarted(ActionMode mode) { 278be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 279be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 280be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 281be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 282be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onActionModeFinished(ActionMode mode) { 283be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 284be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // end Window.Callback methods 285be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 286be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // begin public api 287be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 288be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.WindowManager} for the dream. 289be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindowManager()}. 290be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 291be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window manager, or null if the dream is not started. 292be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 293be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public WindowManager getWindowManager() { 294be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindowManager; 295be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 296be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 297be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 298be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Retrieves the current {@link android.view.Window} for the dream. 299be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#getWindow()}. 300be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 301be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The current window, or null if the dream is not started. 302be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 303be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public Window getWindow() { 304be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow; 305be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 306be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 307be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 308be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Inflates a layout resource and set it to be the content view for this Dream. 309be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#setContentView(int)}. 310be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 311be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 312be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 313be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param layoutResID Resource ID to be inflated. 3142d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 315be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 316be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 317be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 318be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(int layoutResID) { 319be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(layoutResID); 320be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 321be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 322be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 323be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 324be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Behaves similarly to {@link android.app.Activity#setContentView(android.view.View)}, 325be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * including using {@link ViewGroup.LayoutParams#MATCH_PARENT} as the layout height and width of the view. 326be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 327be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 328be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 329be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 330be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 331be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 332be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 333be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view) { 334be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view); 335be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 336be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 337be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 338be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets a view to be the content view for this Dream. 3392d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Behaves similarly to 340be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * {@link android.app.Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}. 341be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 342be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 343be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 344be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 345be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 346be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 347be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(android.view.View) 348be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setContentView(int) 349be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 350be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setContentView(View view, ViewGroup.LayoutParams params) { 351be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().setContentView(view, params); 352be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 353be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 354be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 355be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Adds a view to the Dream's window, leaving other content views in place. 356be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 357be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 358be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 359be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param view The desired content to display. 360be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param params Layout parameters for the view. 361be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 362be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void addContentView(View view, ViewGroup.LayoutParams params) { 363be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn getWindow().addContentView(view, params); 364be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 365be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 366be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 367be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Finds a view that was identified by the id attribute from the XML that 368be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * was processed in {@link #onCreate}. 369be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 370be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p> 371be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 372be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @return The view if found or null otherwise. 373be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 374be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public View findViewById(int id) { 375be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindow().findViewById(id); 376be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 377be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 378be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 379be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as interactive to receive input events. 380be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 381be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Non-interactive dreams (default) will dismiss on the first input event.</p> 382be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 383be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * <p>Interactive dreams should call {@link #finish()} to dismiss themselves.</p> 384be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 385be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param interactive True if this dream will handle input events. 386be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 387be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setInteractive(boolean interactive) { 388be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mInteractive = interactive; 389be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 390be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 391be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 392be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is interactive. Defaults to false. 393be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 394be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setInteractive(boolean) 395be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 396be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isInteractive() { 397be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mInteractive; 398be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 399be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 400be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 401be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view. 402be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 403be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param lowProfile True to set View.SYSTEM_UI_FLAG_LOW_PROFILE 404be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 405be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setLowProfile(boolean lowProfile) { 406be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mLowProfile = lowProfile; 407be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn int flag = View.SYSTEM_UI_FLAG_LOW_PROFILE; 408be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn applySystemUiVisibilityFlags(mLowProfile ? flag : 0, flag); 409be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 410be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 411be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 412be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in low profile mode. Defaults to true. 413be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 414be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setLowProfile(boolean) 415be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 416be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isLowProfile() { 417be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_LOW_PROFILE, mLowProfile); 418be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 419be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 420be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 421be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Sets View.SYSTEM_UI_FLAG_FULLSCREEN on the content view. 422be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 423be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param fullscreen True to set View.SYSTEM_UI_FLAG_FULLSCREEN 424be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 425be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setFullscreen(boolean fullscreen) { 426be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mFullscreen = fullscreen; 427be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn int flag = View.SYSTEM_UI_FLAG_FULLSCREEN; 428be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn applySystemUiVisibilityFlags(mFullscreen ? flag : 0, flag); 429be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 430be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 431be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 432be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream is in fullscreen mode. Defaults to false. 433be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 434be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setFullscreen(boolean) 435be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 436be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isFullscreen() { 437be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_FULLSCREEN, mFullscreen); 438be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 439be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 440be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 441be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Marks this dream as keeping the screen bright while dreaming. 442be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 443be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @param screenBright True to keep the screen bright while dreaming. 444be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 445be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void setScreenBright(boolean screenBright) { 446be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mScreenBright = screenBright; 447be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 448be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn applyWindowFlags(mScreenBright ? flag : 0, flag); 449be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 450be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 451be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 452be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Returns whether or not this dream keeps the screen bright while dreaming. Defaults to false, 453be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * allowing the screen to dim if necessary. 454be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * 455be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * @see #setScreenBright(boolean) 456be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 457be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public boolean isScreenBright() { 458be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return getWindowFlagValue(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, mScreenBright); 459be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 460be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 461be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 4622d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is constructed. 463be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 464be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 465be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onCreate() { 4662d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onCreate() on thread " + Thread.currentThread().getId()); 467be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn super.onCreate(); 468be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 469be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 470be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 4712d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the dream's window has been created and is visible and animation may now begin. 4722d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 4732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStarted() { 4742d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStarted()"); 4752d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 4762d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 4772d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 4782d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 4792d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when this Dream is stopped, either by external request or by calling finish(), 4802d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * before the window has been removed. 481be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 4822d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void onDreamingStopped() { 4832d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDreamingStopped()"); 484be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn // hook for subclasses 485be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 486be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 487be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 488be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 489be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public final IBinder onBind(Intent intent) { 4902d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onBind() intent = " + intent); 491be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return new DreamServiceWrapper(); 492be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 493be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 494be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** 495be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn * Stops the dream, detaches from the window, and wakes up. 496be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn */ 4972d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public final void finish() { 4982d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "finish()"); 499be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 500be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 501be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 502be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn /** {@inheritDoc} */ 503be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn @Override 504be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn public void onDestroy() { 5052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "onDestroy()"); 506be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn super.onDestroy(); 5072d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // hook for subclasses 5082d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5092d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5102d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // end public api 5112d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5122d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private void loadSandman() { 5132d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mSandman = IDreamManager.Stub.asInterface(ServiceManager.getService(DREAM_SERVICE)); 5142d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5152d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5162d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 5172d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the Dream is about to be unbound and destroyed. 5182d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 5192d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 5202d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 5212d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler private final void detach() { 5222d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindow == null) { 5232d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.e(TAG, "detach() called when not attached"); 5242d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 5252d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5262d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5272d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 5282d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler onDreamingStopped(); 5292d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 5302d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.w(TAG, "Crashed in onDreamingStopped()", t); 5312d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // we were going to stop anyway 5322d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 533be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5342d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "detach(): Removing window from window manager"); 535be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 536be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager.removeView(mWindow.getDecorView()); 537be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 538be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed removing window view", t); 539be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 540be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5412d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mWindow = null; 5422d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mWindowToken = null; 543be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 544be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5452d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler /** 5462d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Called when the Dream is ready to be shown. 5472d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 5482d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * Must run on mHandler. 5492d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * 5502d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler * @param windowToken A window token that will allow a window to be created in the correct layer. 5512d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler */ 552be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private final void attach(IBinder windowToken) { 5532d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindowToken != null) { 5542d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.e(TAG, "attach() called when already attached with token=" + mWindowToken); 5552d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 5562d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 5572d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 5582d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Attached on thread " + Thread.currentThread().getId()); 559be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 560be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mSandman == null) { 561be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn loadSandman(); 562be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 563be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowToken = windowToken; 564be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow = PolicyManager.makeNewWindow(this); 565be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setCallback(this); 566be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.requestFeature(Window.FEATURE_NO_TITLE); 567be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setBackgroundDrawable(new ColorDrawable(0xFF000000)); 568be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5692d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, String.format("Attaching window token: %s to window of type %s", 570be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn windowToken, WindowManager.LayoutParams.TYPE_DREAM)); 571be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 572be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 573be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.type = WindowManager.LayoutParams.TYPE_DREAM; 574be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.token = windowToken; 575be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.windowAnimations = com.android.internal.R.style.Animation_Dream; 576be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.flags |= ( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 577be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 578be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 579be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn | (mScreenBright ? WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON : 0) 580be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn ); 581be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 582be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5832d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Created and attached window: " + mWindow); 584be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 585be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setWindowManager(null, windowToken, "dream", true); 586be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager = mWindow.getWindowManager(); 587be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 5882d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "Window added on thread " + Thread.currentThread().getId()); 5892d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 5902d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler applySystemUiVisibilityFlags( 5912d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler (mLowProfile ? View.SYSTEM_UI_FLAG_LOW_PROFILE : 0) 5922d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler | (mFullscreen ? View.SYSTEM_UI_FLAG_FULLSCREEN : 0), 5932d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN); 5942d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler getWindowManager().addView(mWindow.getDecorView(), mWindow.getAttributes()); 5952d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 5962d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.w("Crashed adding window view", t); 5972d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler safelyFinish(); 5982d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler return; 5992d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 600be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler // start it up 6022d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler try { 6032d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler onDreamingStarted(); 6042d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } catch (Throwable t) { 6052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler Slog.w("Crashed in onDreamingStarted()", t); 6062d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler safelyFinish(); 6072d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 608be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 609be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 610be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void safelyFinish() { 6112d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "safelyFinish()"); 612be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 613be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finish(); 614be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 615be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed in safelyFinish()", t); 616be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 617be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return; 618be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 619be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 620be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (!mFinished) { 621be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Bad dream, did not call super.finish()"); 622be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn finishInternal(); 623be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 624be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 625be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 626be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void finishInternal() { 6272d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mDebug) Slog.v(TAG, "finishInternal() mFinished = " + mFinished); 628be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mFinished) return; 629be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn try { 630be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mFinished = true; 631be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 632be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mSandman != null) { 633be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mSandman.finishSelf(mWindowToken); 634be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } else { 635be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "No dream manager found"); 636be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 637be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn stopSelf(); // if launched via any other means 638be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 639be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } catch (Throwable t) { 640be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn Slog.w(TAG, "Crashed in finishInternal()", t); 641be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 642be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 643be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 644be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getWindowFlagValue(int flag, boolean defaultValue) { 645be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return mWindow == null ? defaultValue : (mWindow.getAttributes().flags & flag) != 0; 646be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 647be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 648be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applyWindowFlags(int flags, int mask) { 649be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (mWindow != null) { 650be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn WindowManager.LayoutParams lp = mWindow.getAttributes(); 651be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn lp.flags = applyFlags(lp.flags, flags, mask); 652be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindow.setAttributes(lp); 653be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn mWindowManager.updateViewLayout(mWindow.getDecorView(), lp); 654be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 655be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 656be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 657be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private boolean getSystemUiVisibilityFlagValue(int flag, boolean defaultValue) { 658be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 659be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return v == null ? defaultValue : (v.getSystemUiVisibility() & flag) != 0; 660be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 661be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 662be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private void applySystemUiVisibilityFlags(int flags, int mask) { 663be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn View v = mWindow == null ? null : mWindow.getDecorView(); 664be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn if (v != null) { 665be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn v.setSystemUiVisibility(applyFlags(v.getSystemUiVisibility(), flags, mask)); 666be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 667be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 668be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 669be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private int applyFlags(int oldFlags, int flags, int mask) { 670be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn return (oldFlags&~mask) | (flags&mask); 671be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 672be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 6732d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 6742d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 6752d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler super.dump(fd, pw, args); 6762d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 6772d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.print(TAG + ": "); 6782d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (mWindowToken == null) { 6792d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println("stopped"); 6802d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } else { 6812d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println("running (token=" + mWindowToken + ")"); 6822d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 6832d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println(" window: " + mWindow); 6842d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.print(" flags:"); 6852d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isInteractive()) pw.print(" interactive"); 6862d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isLowProfile()) pw.print(" lowprofile"); 6872d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isFullscreen()) pw.print(" fullscreen"); 6882d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler if (isScreenBright()) pw.print(" bright"); 6892d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler pw.println(); 6902d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 6912d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler 692be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn private class DreamServiceWrapper extends IDreamService.Stub { 6932d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void attach(final IBinder windowToken) { 6942d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 6952d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 6962d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 6972d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.attach(windowToken); 6982d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 6992d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 7002d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7012d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void detach() { 7022d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler mHandler.post(new Runnable() { 7032d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler @Override 7042d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler public void run() { 7052d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler DreamService.this.detach(); 7062d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler } 7072d78490292090eeab84694330978c9ad7fad2d37Daniel Sandler }); 708be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 709be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn } 710be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn 711be87e2f5885b28145a788fd31d1fb5ae88a71100Dianne Hackborn} 712