Merge "Controls UI - Detail panel" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
87cf6848bd
@@ -50,41 +50,15 @@
|
||||
android:padding="12dp" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
<FrameLayout
|
||||
android:id="@+id/controls_activity_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:paddingTop="@dimen/controls_activity_view_top_padding"
|
||||
android:paddingLeft="@dimen/controls_activity_view_side_padding"
|
||||
android:paddingRight="@dimen/controls_activity_view_side_padding"
|
||||
android:background="@drawable/rounded_bg_top"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/TextAppearance.ControlDialog"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end" />
|
||||
<TextView
|
||||
android:id="@+id/subtitle"
|
||||
android:layout_marginTop="6dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/TextAppearance.ControlDialog"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end" />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/controls_activity_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
</LinearLayout>
|
||||
android:orientation="vertical" />
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
@@ -1260,7 +1260,7 @@
|
||||
<!-- Home Controls activity view detail panel-->
|
||||
<dimen name="controls_activity_view_top_padding">25dp</dimen>
|
||||
<dimen name="controls_activity_view_side_padding">12dp</dimen>
|
||||
<dimen name="controls_activity_view_top_offset">200dp</dimen>
|
||||
<dimen name="controls_activity_view_top_offset">100dp</dimen>
|
||||
<dimen name="controls_activity_view_text_size">17sp</dimen>
|
||||
|
||||
<!-- Home Controls management screens -->
|
||||
|
||||
@@ -731,11 +731,6 @@
|
||||
<item name="android:textSize">@dimen/control_text_size</item>
|
||||
<item name="android:textColor">@color/control_secondary_text</item>
|
||||
</style>
|
||||
<style name="TextAppearance.ControlDialog">
|
||||
<item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
|
||||
<item name="android:textSize">@dimen/controls_activity_view_text_size</item>
|
||||
<item name="android:textColor">@color/control_primary_text</item>
|
||||
</style>
|
||||
<style name="Control.ListPopupWindow" parent="@*android:style/Widget.DeviceDefault.ListPopupWindow">
|
||||
<item name="android:overlapAnchor">true</item>
|
||||
|
||||
|
||||
@@ -17,14 +17,11 @@
|
||||
package com.android.systemui.controls.ui
|
||||
|
||||
import android.app.Dialog
|
||||
import android.app.PendingIntent
|
||||
import android.content.Intent
|
||||
import android.service.controls.Control
|
||||
import android.service.controls.actions.BooleanAction
|
||||
import android.service.controls.actions.CommandAction
|
||||
import android.util.Log
|
||||
import android.view.HapticFeedbackConstants
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.controls.controller.ControlsController
|
||||
|
||||
object ControlActionCoordinator {
|
||||
@@ -51,23 +48,14 @@ object ControlActionCoordinator {
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow apps to specify whether they would like to appear in a detail panel or within
|
||||
* the full activity by setting the {@link Control#EXTRA_USE_PANEL} flag. In order for
|
||||
* activities to determine how they are being launched, they should inspect the
|
||||
* {@link Control#EXTRA_USE_PANEL} flag for a value of true.
|
||||
* All long presses will be shown in a 3/4 height bottomsheet panel, in order for the user to
|
||||
* retain context with their favorited controls in the power menu.
|
||||
*/
|
||||
fun longPress(cvh: ControlViewHolder) {
|
||||
// Long press snould only be called when there is valid control state, otherwise ignore
|
||||
cvh.cws.control?.let {
|
||||
try {
|
||||
it.getAppIntent().send()
|
||||
cvh.layout.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
|
||||
cvh.context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
|
||||
} catch (e: PendingIntent.CanceledException) {
|
||||
Log.e(ControlsUiController.TAG, "Error sending pending intent", e)
|
||||
cvh.setTransientStatus(
|
||||
cvh.context.resources.getString(R.string.controls_error_failed))
|
||||
}
|
||||
cvh.layout.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
|
||||
showDialog(cvh, it.getAppIntent().getIntent())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -52,8 +52,7 @@ class ControlViewHolder(
|
||||
val layout: ViewGroup,
|
||||
val controlsController: ControlsController,
|
||||
val uiExecutor: DelayableExecutor,
|
||||
val bgExecutor: DelayableExecutor,
|
||||
val usePanels: Boolean
|
||||
val bgExecutor: DelayableExecutor
|
||||
) {
|
||||
|
||||
companion object {
|
||||
@@ -159,8 +158,7 @@ class ControlViewHolder(
|
||||
controlsController.action(cws.componentName, cws.ci, action)
|
||||
}
|
||||
|
||||
fun usePanel(): Boolean =
|
||||
usePanels && deviceType in ControlViewHolder.FORCE_PANEL_DEVICES
|
||||
fun usePanel(): Boolean = deviceType in ControlViewHolder.FORCE_PANEL_DEVICES
|
||||
|
||||
private fun findBehavior(
|
||||
status: Int,
|
||||
|
||||
@@ -30,7 +30,6 @@ import android.content.res.Configuration
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.graphics.drawable.LayerDrawable
|
||||
import android.os.Process
|
||||
import android.provider.Settings
|
||||
import android.service.controls.Control
|
||||
import android.service.controls.actions.ControlAction
|
||||
import android.util.Log
|
||||
@@ -84,7 +83,6 @@ class ControlsUiControllerImpl @Inject constructor (
|
||||
private const val PREF_COMPONENT = "controls_component"
|
||||
private const val PREF_STRUCTURE = "controls_structure"
|
||||
|
||||
private const val USE_PANELS = "systemui.controls_use_panel"
|
||||
private const val FADE_IN_MILLIS = 200L
|
||||
|
||||
private val EMPTY_COMPONENT = ComponentName("", "")
|
||||
@@ -441,9 +439,6 @@ class ControlsUiControllerImpl @Inject constructor (
|
||||
|
||||
val maxColumns = findMaxColumns()
|
||||
|
||||
// use flag only temporarily for testing
|
||||
val usePanels = Settings.Secure.getInt(context.contentResolver, USE_PANELS, 0) == 1
|
||||
|
||||
val listView = parent.requireViewById(R.id.global_actions_controls_list) as ViewGroup
|
||||
var lastRow: ViewGroup = createRow(inflater, listView)
|
||||
selectedStructure.controls.forEach {
|
||||
@@ -457,8 +452,7 @@ class ControlsUiControllerImpl @Inject constructor (
|
||||
baseLayout,
|
||||
controlsController.get(),
|
||||
uiExecutor,
|
||||
bgExecutor,
|
||||
usePanels
|
||||
bgExecutor
|
||||
)
|
||||
val key = ControlKey(selectedStructure.componentName, it.controlId)
|
||||
cvh.bindData(controlsById.getValue(key))
|
||||
|
||||
@@ -24,9 +24,9 @@ import android.provider.Settings
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowInsets
|
||||
import android.view.WindowInsets.Type
|
||||
import android.view.WindowManager
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
|
||||
import com.android.systemui.R
|
||||
|
||||
@@ -45,7 +45,7 @@ class DetailDialog(
|
||||
private const val PANEL_TOP_OFFSET = "systemui.controls_panel_top_offset"
|
||||
}
|
||||
|
||||
lateinit var activityView: ActivityView
|
||||
var activityView = ActivityView(context, null, 0, false)
|
||||
|
||||
val stateCallback: ActivityView.StateCallback = object : ActivityView.StateCallback() {
|
||||
override fun onActivityViewReady(view: ActivityView) {
|
||||
@@ -67,10 +67,8 @@ class DetailDialog(
|
||||
|
||||
init {
|
||||
window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY)
|
||||
|
||||
setContentView(R.layout.controls_detail_dialog)
|
||||
|
||||
activityView = ActivityView(context, null, 0, false)
|
||||
requireViewById<ViewGroup>(R.id.controls_activity_view).apply {
|
||||
addView(activityView)
|
||||
}
|
||||
@@ -79,14 +77,6 @@ class DetailDialog(
|
||||
setOnClickListener { _: View -> dismiss() }
|
||||
}
|
||||
|
||||
requireViewById<TextView>(R.id.title).apply {
|
||||
setText(cvh.title.text)
|
||||
}
|
||||
|
||||
requireViewById<TextView>(R.id.subtitle).apply {
|
||||
setText(cvh.subtitle.text)
|
||||
}
|
||||
|
||||
requireViewById<ImageView>(R.id.control_detail_open_in_app).apply {
|
||||
setOnClickListener { v: View ->
|
||||
dismiss()
|
||||
@@ -97,15 +87,15 @@ class DetailDialog(
|
||||
|
||||
// consume all insets to achieve slide under effect
|
||||
window.getDecorView().setOnApplyWindowInsetsListener {
|
||||
v: View, insets: WindowInsets ->
|
||||
_: View, insets: WindowInsets ->
|
||||
activityView.apply {
|
||||
val l = getPaddingLeft()
|
||||
val t = getPaddingTop()
|
||||
val r = getPaddingRight()
|
||||
setPadding(l, t, r, insets.getSystemWindowInsets().bottom)
|
||||
setPadding(l, t, r, insets.getInsets(Type.systemBars()).bottom)
|
||||
}
|
||||
|
||||
insets.consumeSystemWindowInsets()
|
||||
WindowInsets.CONSUMED
|
||||
}
|
||||
|
||||
requireViewById<ViewGroup>(R.id.control_detail_root).apply {
|
||||
@@ -118,6 +108,9 @@ class DetailDialog(
|
||||
val lp = getLayoutParams() as ViewGroup.MarginLayoutParams
|
||||
lp.topMargin = offsetInPx
|
||||
setLayoutParams(lp)
|
||||
|
||||
setOnClickListener { dismiss() }
|
||||
(getParent() as View).setOnClickListener { dismiss() }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user