Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a853c63f authored by Yuncheol Heo's avatar Yuncheol Heo
Browse files

Migrate DetailDialog from ActivityView to TaskView.

- Remove the task in TaskView when releasing the view.
- Known issue: b/175918200 - Padding doesn't work in TaskView.

Bug: 165794075
Test: Launch power menu control and check if long-press on the control launches an Activity.
Change-Id: I94bb85ac6752caebefce65dd781d05a57e9453ba
parent f3929238
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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.
@@ -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) {
+11 −6
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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()
                }
+36 −9
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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) {

@@ -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)

@@ -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 {
@@ -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)
@@ -126,7 +153,7 @@ class DetailDialog(
    }

    override fun show() {
        activityView.setCallback(stateCallback)
        activityView.setListener(cvh.uiExecutor, stateCallback)

        super.show()
    }
+4 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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);

+4 −0
Original line number Diff line number Diff line
@@ -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;
@@ -79,4 +80,7 @@ public interface WMComponent {

    @WMSingleton
    Optional<HideDisplayCutout> getHideDisplayCutout();

    @WMSingleton
    Optional<TaskViewFactory> getTaskViewFactory();
}
Loading