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

Commit 724194f4 authored by Andre Le's avatar Andre Le
Browse files

QSDetailedView: Move listener and createOptionsView to view binder

Make the view binder class (instead of the dialog delegate) to override
OnItemSelectedListener. Also move the logic of createOptionsView() from
the dialog delegate to the view binder.

This CL follows the refactor mentioned in
go/al-screen-record-detailed-view.

Bug: b/378514312
Flag: NONE refactor
Test: ScreenRecordPermissionDialogDelegateTest,
SystemCastPermissionDialogDelegateTest,
ShareToAppPermissionDialogDelegateTest
Test: Click on screen record tile in the QS -> verify that screen
recording in single app and entire screen both works

Change-Id: I85d4517f714178a5be212a8d58136f17d42d3493
parent c9681033
Loading
Loading
Loading
Loading
+2 −23
Original line number Diff line number Diff line
@@ -22,10 +22,8 @@ import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewStub
import android.view.WindowManager
import android.view.accessibility.AccessibilityNodeInfo
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.Spinner
@@ -33,7 +31,6 @@ import android.widget.TextView
import androidx.annotation.CallSuper
import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes
import androidx.annotation.LayoutRes
import androidx.annotation.StringRes
import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger
import com.android.systemui.res.R
@@ -48,7 +45,7 @@ abstract class BaseMediaProjectionPermissionDialogDelegate<T : AlertDialog>(
    @DrawableRes private val dialogIconDrawable: Int? = null,
    @ColorRes private val dialogIconTint: Int? = null,
    @ScreenShareMode val defaultSelectedMode: Int = screenShareOptions.first().mode,
) : DialogDelegate<T>, AdapterView.OnItemSelectedListener {
) : DialogDelegate<T> {
    private lateinit var dialogTitle: TextView
    private lateinit var cancelButton: TextView
    private lateinit var screenShareModeSpinner: Spinner
@@ -84,7 +81,6 @@ abstract class BaseMediaProjectionPermissionDialogDelegate<T : AlertDialog>(
        dialogTitle = dialog.requireViewById(R.id.screen_share_dialog_title)
        cancelButton = dialog.requireViewById(android.R.id.button2)
        updateIcon()
        createOptionsView(getOptionsViewLayoutId())
        if (!::viewBinder.isInitialized) {
            viewBinder = createViewBinder()
        }
@@ -106,7 +102,7 @@ abstract class BaseMediaProjectionPermissionDialogDelegate<T : AlertDialog>(
        val adapter = OptionsAdapter(dialog.context.applicationContext, screenShareOptions)
        screenShareModeSpinner = dialog.requireViewById(R.id.screen_share_mode_options)
        screenShareModeSpinner.adapter = adapter
        screenShareModeSpinner.onItemSelectedListener = this
        screenShareModeSpinner.onItemSelectedListener = viewBinder

        // disable redundant Touch & Hold accessibility action for Switch Access
        screenShareModeSpinner.accessibilityDelegate =
@@ -124,12 +120,6 @@ abstract class BaseMediaProjectionPermissionDialogDelegate<T : AlertDialog>(
        screenShareModeSpinner.setSelection(defaultModePosition, /* animate= */ false)
    }

    override fun onItemSelected(adapterView: AdapterView<*>?, view: View, pos: Int, id: Long) {
        viewBinder.onItemSelected(pos)
    }

    override fun onNothingSelected(parent: AdapterView<*>?) {}

    fun getSelectedScreenShareOption(): ScreenShareOption {
        return viewBinder.selectedScreenShareOption
    }
@@ -147,17 +137,6 @@ abstract class BaseMediaProjectionPermissionDialogDelegate<T : AlertDialog>(
    protected fun setCancelButtonOnClickListener(listener: View.OnClickListener?) {
        cancelButton.setOnClickListener(listener)
    }

    // Create additional options that is shown under the share mode spinner
    // Eg. the audio and tap toggles in SysUI Recorder
    @LayoutRes protected open fun getOptionsViewLayoutId(): Int? = null

    private fun createOptionsView(@LayoutRes layoutId: Int?) {
        if (layoutId == null) return
        val stub = dialog.requireViewById<View>(R.id.options_stub) as ViewStub
        stub.layoutResource = layoutId
        stub.inflate()
    }
}

private class OptionsAdapter(context: Context, private val options: List<ScreenShareOption>) :
+19 −2
Original line number Diff line number Diff line
@@ -18,7 +18,10 @@ package com.android.systemui.mediaprojection.permission

import android.app.AlertDialog
import android.view.View
import android.view.ViewStub
import android.widget.AdapterView
import android.widget.TextView
import androidx.annotation.LayoutRes
import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger
import com.android.systemui.res.R

@@ -29,7 +32,7 @@ open class BaseMediaProjectionPermissionViewBinder(
    private val mediaProjectionMetricsLogger: MediaProjectionMetricsLogger,
    @ScreenShareMode val defaultSelectedMode: Int = screenShareOptions.first().mode,
    private val dialog: AlertDialog,
) {
) : AdapterView.OnItemSelectedListener {
    private lateinit var warning: TextView
    private lateinit var startButton: TextView
    var selectedScreenShareOption: ScreenShareOption =
@@ -48,6 +51,7 @@ open class BaseMediaProjectionPermissionViewBinder(
        warning = dialog.requireViewById(R.id.text_warning)
        startButton = dialog.requireViewById(android.R.id.button1)
        initScreenShareOptions()
        createOptionsView(getOptionsViewLayoutId())
    }

    private fun initScreenShareOptions() {
@@ -61,11 +65,13 @@ open class BaseMediaProjectionPermissionViewBinder(
        startButton.text = startButtonText
    }

    open fun onItemSelected(pos: Int) {
    override fun onItemSelected(adapterView: AdapterView<*>?, view: View, pos: Int, id: Long) {
        selectedScreenShareOption = screenShareOptions[pos]
        setOptionSpecificFields()
    }

    override fun onNothingSelected(parent: AdapterView<*>?) {}

    private val warningText: String
        get() = dialog.context.getString(selectedScreenShareOption.warningText, appName)

@@ -78,4 +84,15 @@ open class BaseMediaProjectionPermissionViewBinder(
            listener?.onClick(view)
        }
    }

    // Create additional options that is shown under the share mode spinner
    // Eg. the audio and tap toggles in SysUI Recorder
    @LayoutRes protected open fun getOptionsViewLayoutId(): Int? = null

    private fun createOptionsView(@LayoutRes layoutId: Int?) {
        if (layoutId == null) return
        val stub = dialog.requireViewById<View>(R.id.options_stub) as ViewStub
        stub.layoutResource = layoutId
        stub.inflate()
    }
}
+0 −3
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ import android.content.Context
import android.hardware.display.DisplayManager
import android.os.Bundle
import android.os.UserHandle
import androidx.annotation.LayoutRes
import androidx.annotation.StyleRes
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger
@@ -122,6 +121,4 @@ class ScreenRecordPermissionDialogDelegate(
        dialog.setTitle(R.string.screenrecord_title)
        setCancelButtonOnClickListener { dialog.dismiss() }
    }

    @LayoutRes override fun getOptionsViewLayoutId(): Int = R.layout.screen_record_options
}
+5 −2
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Spinner
import android.widget.Switch
import androidx.annotation.LayoutRes
import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget
import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger
import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorActivity
@@ -152,8 +153,8 @@ class ScreenRecordPermissionViewBinder(
        options.isLongClickable = false
    }

    override fun onItemSelected(pos: Int) {
        super.onItemSelected(pos)
    override fun onItemSelected(adapterView: AdapterView<*>?, view: View, pos: Int, id: Long) {
        super.onItemSelected(adapterView, view, pos, id)
        updateTapsViewVisibility()
    }

@@ -161,6 +162,8 @@ class ScreenRecordPermissionViewBinder(
        tapsView.visibility = if (selectedScreenShareOption.mode == SINGLE_APP) GONE else VISIBLE
    }

    @LayoutRes override fun getOptionsViewLayoutId(): Int = R.layout.screen_record_options

    /**
     * Starts screen capture after some countdown
     *