Loading packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +4 −2 Original line number Diff line number Diff line Loading @@ -111,7 +111,8 @@ public class SystemUIFactory { .setBubbles(mWMComponent.getBubbles()) .setHideDisplayCutout(mWMComponent.getHideDisplayCutout()) .setShellCommandHandler(mWMComponent.getShellCommandHandler()) .setAppPairs(mWMComponent.getAppPairs()); .setAppPairs(mWMComponent.getAppPairs()) .setTaskViewFactory(mWMComponent.getTaskViewFactory()); } else { // TODO: Call on prepareSysUIComponentBuilder but not with real components. Other option // is separating this logic into newly creating SystemUITestsFactory. Loading @@ -122,7 +123,8 @@ public class SystemUIFactory { .setBubbles(Optional.ofNullable(null)) .setHideDisplayCutout(Optional.ofNullable(null)) .setShellCommandHandler(Optional.ofNullable(null)) .setAppPairs(Optional.ofNullable(null)); .setAppPairs(Optional.ofNullable(null)) .setTaskViewFactory(Optional.ofNullable(null)); } mSysUIComponent = builder.build(); if (initializeComponents) { Loading packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt +11 −6 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ import com.android.systemui.globalactions.GlobalActionsComponent import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.DelayableExecutor import com.android.wm.shell.TaskViewFactory import java.util.Optional import javax.inject.Inject @SysUISingleton Loading @@ -45,7 +47,8 @@ class ControlActionCoordinatorImpl @Inject constructor( @Main private val uiExecutor: DelayableExecutor, private val activityStarter: ActivityStarter, private val keyguardStateController: KeyguardStateController, private val globalActionsComponent: GlobalActionsComponent private val globalActionsComponent: GlobalActionsComponent, private val taskViewFactory: Optional<TaskViewFactory> ) : ControlActionCoordinator { private var dialog: Dialog? = null private val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator Loading Loading @@ -163,11 +166,13 @@ class ControlActionCoordinatorImpl @Inject constructor( uiExecutor.execute { // make sure the intent is valid before attempting to open the dialog if (activities.isNotEmpty()) { dialog = DetailDialog(cvh, intent).also { if (activities.isNotEmpty() && taskViewFactory.isPresent) { taskViewFactory.get().create(cvh.context, uiExecutor, { dialog = DetailDialog(cvh, it, intent).also { it.setOnDismissListener { _ -> dialog = null } it.show() } }) } else { cvh.setErrorStatus() } Loading packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt +36 −9 Original line number Diff line number Diff line Loading @@ -16,8 +16,12 @@ package com.android.systemui.controls.ui import android.app.ActivityView import android.app.ActivityOptions import android.app.ActivityTaskManager import android.app.ActivityTaskManager.INVALID_TASK_ID import android.app.Dialog import android.app.PendingIntent import android.content.ComponentName import android.content.Intent import android.provider.Settings import android.view.View Loading @@ -26,9 +30,9 @@ import android.view.WindowInsets import android.view.WindowInsets.Type import android.view.WindowManager import android.widget.ImageView import com.android.internal.policy.ScreenDecorationsUtils import com.android.systemui.R import com.android.wm.shell.TaskView /** * A dialog that provides an {@link ActivityView}, allowing the application to provide Loading @@ -37,6 +41,7 @@ import com.android.systemui.R */ class DetailDialog( val cvh: ControlViewHolder, val activityView: TaskView, val intent: Intent ) : Dialog(cvh.context, R.style.Theme_SystemUI_Dialog_Control_DetailPanel) { Loading @@ -49,10 +54,16 @@ class DetailDialog( private const val EXTRA_USE_PANEL = "controls.DISPLAY_IN_PANEL" } var activityView = ActivityView(context) var detailTaskId = INVALID_TASK_ID fun removeDetailTask() { if (detailTaskId == INVALID_TASK_ID) return ActivityTaskManager.getInstance().removeTask(detailTaskId) detailTaskId = INVALID_TASK_ID } val stateCallback: ActivityView.StateCallback = object : ActivityView.StateCallback() { override fun onActivityViewReady(view: ActivityView) { val stateCallback = object : TaskView.Listener { override fun onInitialized() { val launchIntent = Intent(intent) launchIntent.putExtra(EXTRA_USE_PANEL, true) Loading @@ -60,18 +71,31 @@ class DetailDialog( launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT) launchIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK) view.startActivity(launchIntent) activityView.startActivity( PendingIntent.getActivity(context, 0, launchIntent, PendingIntent.FLAG_UPDATE_CURRENT), null, ActivityOptions.makeBasic()) } override fun onActivityViewDestroyed(view: ActivityView) {} override fun onTaskRemovalStarted(taskId: Int) { detailTaskId = INVALID_TASK_ID dismiss() } override fun onTaskCreated(taskId: Int, name: ComponentName?) { detailTaskId = taskId } override fun onReleased() { removeDetailTask() } } init { window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY) // To pass touches to the task inside TaskView. window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL) window.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY) setContentView(R.layout.controls_detail_dialog) requireViewById<ViewGroup>(R.id.controls_activity_view).apply { Loading @@ -84,6 +108,9 @@ class DetailDialog( requireViewById<ImageView>(R.id.control_detail_open_in_app).apply { setOnClickListener { v: View -> // Remove the task explicitly, since onRelease() callback will be executed after // startActivity() below is called. removeDetailTask() dismiss() context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) v.context.startActivity(intent) Loading Loading @@ -126,7 +153,7 @@ class DetailDialog( } override fun show() { activityView.setCallback(stateCallback) activityView.setListener(cvh.uiExecutor, stateCallback) super.show() } Loading packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java +4 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import com.android.systemui.keyguard.KeyguardSliceProvider; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.InjectionInflationController; import com.android.wm.shell.ShellCommandHandler; import com.android.wm.shell.TaskViewFactory; import com.android.wm.shell.apppairs.AppPairs; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout; Loading Loading @@ -70,6 +71,9 @@ public interface SysUIComponent { @BindsInstance Builder setBubbles(Optional<Bubbles> b); @BindsInstance Builder setTaskViewFactory(Optional<TaskViewFactory> t); @BindsInstance Builder setHideDisplayCutout(Optional<HideDisplayCutout> h); Loading packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java +4 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.dagger; import com.android.systemui.wmshell.WMShellModule; import com.android.wm.shell.ShellCommandHandler; import com.android.wm.shell.ShellInit; import com.android.wm.shell.TaskViewFactory; import com.android.wm.shell.apppairs.AppPairs; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout; Loading Loading @@ -79,4 +80,7 @@ public interface WMComponent { @WMSingleton Optional<HideDisplayCutout> getHideDisplayCutout(); @WMSingleton Optional<TaskViewFactory> getTaskViewFactory(); } Loading
packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +4 −2 Original line number Diff line number Diff line Loading @@ -111,7 +111,8 @@ public class SystemUIFactory { .setBubbles(mWMComponent.getBubbles()) .setHideDisplayCutout(mWMComponent.getHideDisplayCutout()) .setShellCommandHandler(mWMComponent.getShellCommandHandler()) .setAppPairs(mWMComponent.getAppPairs()); .setAppPairs(mWMComponent.getAppPairs()) .setTaskViewFactory(mWMComponent.getTaskViewFactory()); } else { // TODO: Call on prepareSysUIComponentBuilder but not with real components. Other option // is separating this logic into newly creating SystemUITestsFactory. Loading @@ -122,7 +123,8 @@ public class SystemUIFactory { .setBubbles(Optional.ofNullable(null)) .setHideDisplayCutout(Optional.ofNullable(null)) .setShellCommandHandler(Optional.ofNullable(null)) .setAppPairs(Optional.ofNullable(null)); .setAppPairs(Optional.ofNullable(null)) .setTaskViewFactory(Optional.ofNullable(null)); } mSysUIComponent = builder.build(); if (initializeComponents) { Loading
packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt +11 −6 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ import com.android.systemui.globalactions.GlobalActionsComponent import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.DelayableExecutor import com.android.wm.shell.TaskViewFactory import java.util.Optional import javax.inject.Inject @SysUISingleton Loading @@ -45,7 +47,8 @@ class ControlActionCoordinatorImpl @Inject constructor( @Main private val uiExecutor: DelayableExecutor, private val activityStarter: ActivityStarter, private val keyguardStateController: KeyguardStateController, private val globalActionsComponent: GlobalActionsComponent private val globalActionsComponent: GlobalActionsComponent, private val taskViewFactory: Optional<TaskViewFactory> ) : ControlActionCoordinator { private var dialog: Dialog? = null private val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator Loading Loading @@ -163,11 +166,13 @@ class ControlActionCoordinatorImpl @Inject constructor( uiExecutor.execute { // make sure the intent is valid before attempting to open the dialog if (activities.isNotEmpty()) { dialog = DetailDialog(cvh, intent).also { if (activities.isNotEmpty() && taskViewFactory.isPresent) { taskViewFactory.get().create(cvh.context, uiExecutor, { dialog = DetailDialog(cvh, it, intent).also { it.setOnDismissListener { _ -> dialog = null } it.show() } }) } else { cvh.setErrorStatus() } Loading
packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt +36 −9 Original line number Diff line number Diff line Loading @@ -16,8 +16,12 @@ package com.android.systemui.controls.ui import android.app.ActivityView import android.app.ActivityOptions import android.app.ActivityTaskManager import android.app.ActivityTaskManager.INVALID_TASK_ID import android.app.Dialog import android.app.PendingIntent import android.content.ComponentName import android.content.Intent import android.provider.Settings import android.view.View Loading @@ -26,9 +30,9 @@ import android.view.WindowInsets import android.view.WindowInsets.Type import android.view.WindowManager import android.widget.ImageView import com.android.internal.policy.ScreenDecorationsUtils import com.android.systemui.R import com.android.wm.shell.TaskView /** * A dialog that provides an {@link ActivityView}, allowing the application to provide Loading @@ -37,6 +41,7 @@ import com.android.systemui.R */ class DetailDialog( val cvh: ControlViewHolder, val activityView: TaskView, val intent: Intent ) : Dialog(cvh.context, R.style.Theme_SystemUI_Dialog_Control_DetailPanel) { Loading @@ -49,10 +54,16 @@ class DetailDialog( private const val EXTRA_USE_PANEL = "controls.DISPLAY_IN_PANEL" } var activityView = ActivityView(context) var detailTaskId = INVALID_TASK_ID fun removeDetailTask() { if (detailTaskId == INVALID_TASK_ID) return ActivityTaskManager.getInstance().removeTask(detailTaskId) detailTaskId = INVALID_TASK_ID } val stateCallback: ActivityView.StateCallback = object : ActivityView.StateCallback() { override fun onActivityViewReady(view: ActivityView) { val stateCallback = object : TaskView.Listener { override fun onInitialized() { val launchIntent = Intent(intent) launchIntent.putExtra(EXTRA_USE_PANEL, true) Loading @@ -60,18 +71,31 @@ class DetailDialog( launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT) launchIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK) view.startActivity(launchIntent) activityView.startActivity( PendingIntent.getActivity(context, 0, launchIntent, PendingIntent.FLAG_UPDATE_CURRENT), null, ActivityOptions.makeBasic()) } override fun onActivityViewDestroyed(view: ActivityView) {} override fun onTaskRemovalStarted(taskId: Int) { detailTaskId = INVALID_TASK_ID dismiss() } override fun onTaskCreated(taskId: Int, name: ComponentName?) { detailTaskId = taskId } override fun onReleased() { removeDetailTask() } } init { window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY) // To pass touches to the task inside TaskView. window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL) window.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY) setContentView(R.layout.controls_detail_dialog) requireViewById<ViewGroup>(R.id.controls_activity_view).apply { Loading @@ -84,6 +108,9 @@ class DetailDialog( requireViewById<ImageView>(R.id.control_detail_open_in_app).apply { setOnClickListener { v: View -> // Remove the task explicitly, since onRelease() callback will be executed after // startActivity() below is called. removeDetailTask() dismiss() context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) v.context.startActivity(intent) Loading Loading @@ -126,7 +153,7 @@ class DetailDialog( } override fun show() { activityView.setCallback(stateCallback) activityView.setListener(cvh.uiExecutor, stateCallback) super.show() } Loading
packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java +4 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import com.android.systemui.keyguard.KeyguardSliceProvider; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.InjectionInflationController; import com.android.wm.shell.ShellCommandHandler; import com.android.wm.shell.TaskViewFactory; import com.android.wm.shell.apppairs.AppPairs; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout; Loading Loading @@ -70,6 +71,9 @@ public interface SysUIComponent { @BindsInstance Builder setBubbles(Optional<Bubbles> b); @BindsInstance Builder setTaskViewFactory(Optional<TaskViewFactory> t); @BindsInstance Builder setHideDisplayCutout(Optional<HideDisplayCutout> h); Loading
packages/SystemUI/src/com/android/systemui/dagger/WMComponent.java +4 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.dagger; import com.android.systemui.wmshell.WMShellModule; import com.android.wm.shell.ShellCommandHandler; import com.android.wm.shell.ShellInit; import com.android.wm.shell.TaskViewFactory; import com.android.wm.shell.apppairs.AppPairs; import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.hidedisplaycutout.HideDisplayCutout; Loading Loading @@ -79,4 +80,7 @@ public interface WMComponent { @WMSingleton Optional<HideDisplayCutout> getHideDisplayCutout(); @WMSingleton Optional<TaskViewFactory> getTaskViewFactory(); }