1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.service.dreams; 18 19 import android.annotation.Nullable; 20 import android.app.Activity; 21 import android.os.Bundle; 22 import android.text.TextUtils; 23 24 /** 25 * The Activity used by the {@link DreamService} to draw screensaver content 26 * on the screen. This activity runs in dream application's process, but is started by a 27 * specialized method: {@link com.android.server.wm.ActivityTaskManagerService#startDreamActivity}. 28 * Hence, it does not have to be declared in the dream application's manifest. 29 * 30 * We use an activity as the dream canvas, because it interacts easier with other activities on 31 * the screen (compared to a hover window). However, the DreamService is in charge of the dream and 32 * it receives all Window.Callbacks from its main window. Since a window can have only one callback 33 * receiver, the activity will not receive any window callbacks. 34 * 35 * Prior to the DreamActivity, the DreamService used to work with a hovering window and give the 36 * screensaver application control over that window. The DreamActivity is a replacement to that 37 * hover window. Using an activity allows for better-defined interactions with the rest of the 38 * activities on screen. The switch to DreamActivity should be transparent to the screensaver 39 * application, i.e. the application will still use DreamService APIs and not notice that the 40 * system is using an activity behind the scenes. 41 * 42 * @hide 43 */ 44 public class DreamActivity extends Activity { 45 static final String EXTRA_CALLBACK = "binder"; 46 static final String EXTRA_DREAM_TITLE = "title"; 47 @Nullable 48 private DreamService.DreamActivityCallbacks mCallback; 49 DreamActivity()50 public DreamActivity() {} 51 52 @Override onCreate(@ullable Bundle bundle)53 public void onCreate(@Nullable Bundle bundle) { 54 super.onCreate(bundle); 55 56 final String title = getIntent().getStringExtra(EXTRA_DREAM_TITLE); 57 if (!TextUtils.isEmpty(title)) { 58 setTitle(title); 59 } 60 61 final Object callback = getIntent().getExtras().getBinder(EXTRA_CALLBACK); 62 if (callback instanceof DreamService.DreamActivityCallbacks) { 63 mCallback = (DreamService.DreamActivityCallbacks) callback; 64 mCallback.onActivityCreated(this); 65 } else { 66 mCallback = null; 67 finishAndRemoveTask(); 68 } 69 } 70 71 @Override onDestroy()72 public void onDestroy() { 73 if (mCallback != null) { 74 mCallback.onActivityDestroyed(); 75 } 76 77 super.onDestroy(); 78 } 79 } 80