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

Commit 167a3ab6 authored by Andre Le's avatar Andre Le
Browse files

QSDetailedView: Move spinner to BaseMediaProjectionPermissionViewBinder

Move the logic of controlling the screenShareModeSpinner 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: I0f77bb420ef5acddb4ecf431a0647131deadb993
parent 724194f4
Loading
Loading
Loading
Loading
+0 −57
Original line number Diff line number Diff line
@@ -16,15 +16,10 @@
package com.android.systemui.mediaprojection.permission

import android.app.AlertDialog
import android.content.Context
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.view.accessibility.AccessibilityNodeInfo
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.Spinner
import android.widget.TextView
@@ -85,7 +80,6 @@ abstract class BaseMediaProjectionPermissionDialogDelegate<T : AlertDialog>(
            viewBinder = createViewBinder()
        }
        viewBinder.bind()
        initScreenShareSpinner()
    }

    private fun updateIcon() {
@@ -98,28 +92,6 @@ abstract class BaseMediaProjectionPermissionDialogDelegate<T : AlertDialog>(
        }
    }

    private fun initScreenShareSpinner() {
        val adapter = OptionsAdapter(dialog.context.applicationContext, screenShareOptions)
        screenShareModeSpinner = dialog.requireViewById(R.id.screen_share_mode_options)
        screenShareModeSpinner.adapter = adapter
        screenShareModeSpinner.onItemSelectedListener = viewBinder

        // disable redundant Touch & Hold accessibility action for Switch Access
        screenShareModeSpinner.accessibilityDelegate =
            object : View.AccessibilityDelegate() {
                override fun onInitializeAccessibilityNodeInfo(
                    host: View,
                    info: AccessibilityNodeInfo,
                ) {
                    info.removeAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK)
                    super.onInitializeAccessibilityNodeInfo(host, info)
                }
            }
        screenShareModeSpinner.isLongClickable = false
        val defaultModePosition = screenShareOptions.indexOfFirst { it.mode == defaultSelectedMode }
        screenShareModeSpinner.setSelection(defaultModePosition, /* animate= */ false)
    }

    fun getSelectedScreenShareOption(): ScreenShareOption {
        return viewBinder.selectedScreenShareOption
    }
@@ -138,32 +110,3 @@ abstract class BaseMediaProjectionPermissionDialogDelegate<T : AlertDialog>(
        cancelButton.setOnClickListener(listener)
    }
}

private class OptionsAdapter(context: Context, private val options: List<ScreenShareOption>) :
    ArrayAdapter<String>(
        context,
        R.layout.screen_share_dialog_spinner_text,
        options.map { context.getString(it.spinnerText, it.displayName) },
    ) {

    override fun isEnabled(position: Int): Boolean {
        return options[position].spinnerDisabledText == null
    }

    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
        val inflater = LayoutInflater.from(parent.context)
        val view = inflater.inflate(R.layout.screen_share_dialog_spinner_item_text, parent, false)
        val titleTextView = view.requireViewById<TextView>(android.R.id.text1)
        val errorTextView = view.requireViewById<TextView>(android.R.id.text2)
        titleTextView.text = getItem(position)
        errorTextView.text = options[position].spinnerDisabledText
        if (isEnabled(position)) {
            errorTextView.visibility = View.GONE
            titleTextView.isEnabled = true
        } else {
            errorTextView.visibility = View.VISIBLE
            titleTextView.isEnabled = false
        }
        return view
    }
}
+59 −0
Original line number Diff line number Diff line
@@ -17,9 +17,15 @@
package com.android.systemui.mediaprojection.permission

import android.app.AlertDialog
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewStub
import android.view.accessibility.AccessibilityNodeInfo
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Spinner
import android.widget.TextView
import androidx.annotation.LayoutRes
import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger
@@ -35,6 +41,7 @@ open class BaseMediaProjectionPermissionViewBinder(
) : AdapterView.OnItemSelectedListener {
    private lateinit var warning: TextView
    private lateinit var startButton: TextView
    private lateinit var screenShareModeSpinner: Spinner
    var selectedScreenShareOption: ScreenShareOption =
        screenShareOptions.first { it.mode == defaultSelectedMode }
    private var shouldLogCancel: Boolean = true
@@ -57,6 +64,7 @@ open class BaseMediaProjectionPermissionViewBinder(
    private fun initScreenShareOptions() {
        selectedScreenShareOption = screenShareOptions.first { it.mode == defaultSelectedMode }
        setOptionSpecificFields()
        initScreenShareSpinner()
    }

    /** Sets fields on the dialog that change based on which option is selected. */
@@ -65,6 +73,28 @@ open class BaseMediaProjectionPermissionViewBinder(
        startButton.text = startButtonText
    }

    private fun initScreenShareSpinner() {
        val adapter = OptionsAdapter(dialog.context.applicationContext, screenShareOptions)
        screenShareModeSpinner = dialog.requireViewById(R.id.screen_share_mode_options)
        screenShareModeSpinner.adapter = adapter
        screenShareModeSpinner.onItemSelectedListener = this

        // disable redundant Touch & Hold accessibility action for Switch Access
        screenShareModeSpinner.accessibilityDelegate =
            object : View.AccessibilityDelegate() {
                override fun onInitializeAccessibilityNodeInfo(
                    host: View,
                    info: AccessibilityNodeInfo,
                ) {
                    info.removeAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK)
                    super.onInitializeAccessibilityNodeInfo(host, info)
                }
            }
        screenShareModeSpinner.isLongClickable = false
        val defaultModePosition = screenShareOptions.indexOfFirst { it.mode == defaultSelectedMode }
        screenShareModeSpinner.setSelection(defaultModePosition, /* animate= */ false)
    }

    override fun onItemSelected(adapterView: AdapterView<*>?, view: View, pos: Int, id: Long) {
        selectedScreenShareOption = screenShareOptions[pos]
        setOptionSpecificFields()
@@ -96,3 +126,32 @@ open class BaseMediaProjectionPermissionViewBinder(
        stub.inflate()
    }
}

private class OptionsAdapter(context: Context, private val options: List<ScreenShareOption>) :
    ArrayAdapter<String>(
        context,
        R.layout.screen_share_dialog_spinner_text,
        options.map { context.getString(it.spinnerText, it.displayName) },
    ) {

    override fun isEnabled(position: Int): Boolean {
        return options[position].spinnerDisabledText == null
    }

    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
        val inflater = LayoutInflater.from(parent.context)
        val view = inflater.inflate(R.layout.screen_share_dialog_spinner_item_text, parent, false)
        val titleTextView = view.requireViewById<TextView>(android.R.id.text1)
        val errorTextView = view.requireViewById<TextView>(android.R.id.text2)
        titleTextView.text = getItem(position)
        errorTextView.text = options[position].spinnerDisabledText
        if (isEnabled(position)) {
            errorTextView.visibility = View.GONE
            titleTextView.isEnabled = true
        } else {
            errorTextView.visibility = View.VISIBLE
            titleTextView.isEnabled = false
        }
        return view
    }
}