summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/res/anim/bottomsheet_in.xml26
-rw-r--r--packages/SystemUI/res/anim/bottomsheet_out.xml25
-rw-r--r--packages/SystemUI/res/drawable/rounded_bg_top.xml22
-rw-r--r--packages/SystemUI/res/layout/controls_detail_dialog.xml73
-rw-r--r--packages/SystemUI/res/values/dimens.xml6
-rw-r--r--packages/SystemUI/res/values/styles.xml18
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt50
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt40
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt104
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/TemperatureControlBehavior.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/ui/TouchBehavior.kt8
12 files changed, 312 insertions, 73 deletions
diff --git a/packages/SystemUI/res/anim/bottomsheet_in.xml b/packages/SystemUI/res/anim/bottomsheet_in.xml
new file mode 100644
index 000000000000..0d5efeb2be1e
--- /dev/null
+++ b/packages/SystemUI/res/anim/bottomsheet_in.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@*android:anim/accelerate_decelerate_interpolator"
+ android:zAdjustment="top">
+
+ <translate android:fromYDelta="100%"
+ android:toYDelta="0"
+ android:startOffset="@android:integer/config_shortAnimTime"
+ android:duration="@*android:integer/config_mediumAnimTime"/>
+</set>
diff --git a/packages/SystemUI/res/anim/bottomsheet_out.xml b/packages/SystemUI/res/anim/bottomsheet_out.xml
new file mode 100644
index 000000000000..01f8d2d6b2a3
--- /dev/null
+++ b/packages/SystemUI/res/anim/bottomsheet_out.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@*android:anim/accelerate_interpolator"
+ android:zAdjustment="top">
+
+ <translate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:fromYDelta="0"
+ android:toYDelta="100%"
+ android:duration="@*android:integer/config_shortAnimTime" />
+</set>
diff --git a/packages/SystemUI/res/drawable/rounded_bg_top.xml b/packages/SystemUI/res/drawable/rounded_bg_top.xml
new file mode 100644
index 000000000000..988ab5874b07
--- /dev/null
+++ b/packages/SystemUI/res/drawable/rounded_bg_top.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="?android:attr/colorPrimaryDark" />
+ <corners
+ android:topLeftRadius="?android:attr/dialogCornerRadius"
+ android:topRightRadius="?android:attr/dialogCornerRadius" />
+</shape>
diff --git a/packages/SystemUI/res/layout/controls_detail_dialog.xml b/packages/SystemUI/res/layout/controls_detail_dialog.xml
index f2de45a57ff6..34b603f4bc3d 100644
--- a/packages/SystemUI/res/layout/controls_detail_dialog.xml
+++ b/packages/SystemUI/res/layout/controls_detail_dialog.xml
@@ -15,9 +15,76 @@
limitations under the License.
-->
-<FrameLayout
+<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/controls_activity_view"
+ android:id="@+id/control_detail_root"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:layout_marginTop="@dimen/controls_activity_view_top_offset"
+ android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_marginBottom="10dp">
+ <ImageView
+ android:id="@+id/control_detail_close"
+ android:contentDescription="@string/accessibility_desc_close"
+ android:src="@drawable/ic_close"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+ android:tint="@color/control_primary_text"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:padding="12dp" />
+ <Space
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="1dp" />
+ <ImageView
+ android:id="@+id/control_detail_open_in_app"
+ android:src="@drawable/ic_open_in_new"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+ android:tint="@color/control_primary_text"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:padding="12dp" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ 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>
+</LinearLayout>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 6a8a4b9ac2fd..2a4d5ef921f7 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -1250,6 +1250,12 @@
<dimen name="control_base_item_margin">2dp</dimen>
<dimen name="control_status_padding">3dp</dimen>
+ <!-- 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_text_size">17sp</dimen>
+
<!-- Home Controls management screens -->
<dimen name="controls_management_top_padding">48dp</dimen>
<dimen name="controls_management_side_padding">8dp</dimen>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 3e02b30c376b..118aa5b3f96a 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -671,6 +671,19 @@
<item name="android:fontFamily">@*android:string/config_bodyFontFamily</item>
</style>
+ <style name="Theme.SystemUI.Dialog.Control.DetailPanel" parent="@android:style/Theme.DeviceDefault.Dialog.NoActionBar">
+ <item name="android:windowAnimationStyle">@style/Animation.Bottomsheet</item>
+ <item name="android:windowFullscreen">true</item>
+ <item name="android:windowIsFloating">false</item>
+ <item name="android:windowBackground">@null</item>
+ <item name="android:backgroundDimEnabled">true</item>
+ </style>
+
+ <style name="Animation.Bottomsheet">
+ <item name="android:windowEnterAnimation">@anim/bottomsheet_in</item>
+ <item name="android:windowExitAnimation">@anim/bottomsheet_out</item>
+ </style>
+
<style name="Control" />
<style name="Control.MenuItem">
@@ -713,6 +726,11 @@
<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>
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt
index 680d0066fc56..ad86eeb089c8 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt
@@ -16,19 +16,27 @@
package com.android.systemui.controls.ui
+import android.app.Dialog
import android.app.PendingIntent
import android.content.Intent
-import android.provider.Settings
+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
+
object ControlActionCoordinator {
public const val MIN_LEVEL = 0
public const val MAX_LEVEL = 10000
- private var useDetailDialog: Boolean? = null
+ private var dialog: Dialog? = null
+
+ fun closeDialog() {
+ dialog?.dismiss()
+ dialog = null
+ }
fun toggle(cvh: ControlViewHolder, templateId: String, isChecked: Boolean) {
cvh.action(BooleanAction(templateId, !isChecked))
@@ -37,31 +45,39 @@ object ControlActionCoordinator {
cvh.clipLayer.setLevel(nextLevel)
}
- fun touch(cvh: ControlViewHolder, templateId: String) {
- cvh.action(CommandAction(templateId))
+ fun touch(cvh: ControlViewHolder, templateId: String, control: Control) {
+ if (cvh.usePanel()) {
+ showDialog(cvh, control.getAppIntent().getIntent())
+ } else {
+ cvh.action(CommandAction(templateId))
+ }
}
+ /**
+ * 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.
+ */
fun longPress(cvh: ControlViewHolder) {
// Long press snould only be called when there is valid control state, otherwise ignore
cvh.cws.control?.let {
- if (useDetailDialog == null) {
- useDetailDialog = Settings.Secure.getInt(cvh.context.getContentResolver(),
- "systemui.controls_use_detail_panel", 0) != 0
- }
-
try {
+ it.getAppIntent().send()
cvh.layout.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
- if (useDetailDialog!!) {
- DetailDialog(cvh.context, it.getAppIntent()).show()
- } else {
- it.getAppIntent().send()
- val closeDialog = Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
- cvh.context.sendBroadcast(closeDialog)
- }
+ cvh.context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
} catch (e: PendingIntent.CanceledException) {
Log.e(ControlsUiController.TAG, "Error sending pending intent", e)
- cvh.setTransientStatus("Error opening application")
+ cvh.setTransientStatus(
+ cvh.context.resources.getString(R.string.controls_error_failed))
}
}
}
+
+ private fun showDialog(cvh: ControlViewHolder, intent: Intent) {
+ dialog = DetailDialog(cvh, intent).also {
+ it.setOnDismissListener { _ -> dialog = null }
+ it.show()
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
index b1cb04e10eef..0eb6cb100933 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt
@@ -39,16 +39,29 @@ import com.android.systemui.R
import kotlin.reflect.KClass
-private const val UPDATE_DELAY_IN_MILLIS = 3000L
-private const val ALPHA_ENABLED = (255.0 * 0.2).toInt()
-private const val ALPHA_DISABLED = 255
-
+/**
+ * Wraps the widgets that make up the UI representation of a {@link Control}. Updates to the view
+ * are signaled via calls to {@link #bindData}. Similar to the ViewHolder concept used in
+ * RecyclerViews.
+ */
class ControlViewHolder(
val layout: ViewGroup,
val controlsController: ControlsController,
val uiExecutor: DelayableExecutor,
- val bgExecutor: DelayableExecutor
+ val bgExecutor: DelayableExecutor,
+ val usePanels: Boolean
) {
+
+ companion object {
+ private const val UPDATE_DELAY_IN_MILLIS = 3000L
+ private const val ALPHA_ENABLED = (255.0 * 0.2).toInt()
+ private const val ALPHA_DISABLED = 255
+ private val FORCE_PANEL_DEVICES = setOf(
+ DeviceTypes.TYPE_THERMOSTAT,
+ DeviceTypes.TYPE_CAMERA
+ )
+ }
+
val icon: ImageView = layout.requireViewById(R.id.icon)
val status: TextView = layout.requireViewById(R.id.status)
val title: TextView = layout.requireViewById(R.id.title)
@@ -59,6 +72,8 @@ class ControlViewHolder(
var cancelUpdate: Runnable? = null
var behavior: Behavior? = null
var lastAction: ControlAction? = null
+ val deviceType: Int
+ get() = cws.control?.let { it.getDeviceType() } ?: cws.ci.deviceType
init {
val ld = layout.getBackground() as LayerDrawable
@@ -76,7 +91,7 @@ class ControlViewHolder(
val (controlStatus, template) = cws.control?.let {
title.setText(it.getTitle())
subtitle.setText(it.getSubtitle())
- Pair(it.getStatus(), it.getControlTemplate())
+ Pair(it.status, it.controlTemplate)
} ?: run {
title.setText(cws.ci.controlTitle)
subtitle.setText(cws.ci.controlSubtitle)
@@ -91,7 +106,7 @@ class ControlViewHolder(
})
}
- val clazz = findBehavior(controlStatus, template)
+ val clazz = findBehavior(controlStatus, template, deviceType)
if (behavior == null || behavior!!::class != clazz) {
// Behavior changes can signal a change in template from the app or
// first time setup
@@ -126,9 +141,17 @@ class ControlViewHolder(
controlsController.action(cws.componentName, cws.ci, action)
}
- private fun findBehavior(status: Int, template: ControlTemplate): KClass<out Behavior> {
+ fun usePanel(): Boolean =
+ usePanels && deviceType in ControlViewHolder.FORCE_PANEL_DEVICES
+
+ private fun findBehavior(
+ status: Int,
+ template: ControlTemplate,
+ deviceType: Int
+ ): KClass<out Behavior> {
return when {
status == Control.STATUS_UNKNOWN -> UnknownBehavior::class
+ deviceType == DeviceTypes.TYPE_CAMERA -> TouchBehavior::class
template is ToggleTemplate -> ToggleBehavior::class
template is StatelessTemplate -> TouchBehavior::class
template is ToggleRangeTemplate -> ToggleRangeBehavior::class
@@ -140,7 +163,6 @@ class ControlViewHolder(
internal fun applyRenderInfo(enabled: Boolean, offset: Int = 0) {
setEnabled(enabled)
- val deviceType = cws.control?.let { it.getDeviceType() } ?: cws.ci.deviceType
val ri = RenderInfo.lookup(context, cws.componentName, deviceType, enabled, offset)
val fg = context.getResources().getColorStateList(ri.foreground, context.getTheme())
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
index 7da3d70271c1..39fbdcf7625f 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt
@@ -30,6 +30,7 @@ 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.TypedValue
@@ -85,6 +86,7 @@ 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 = 225L
private val EMPTY_COMPONENT = ComponentName("", "")
@@ -407,6 +409,9 @@ 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 {
@@ -420,7 +425,8 @@ class ControlsUiControllerImpl @Inject constructor (
baseLayout,
controlsController.get(),
uiExecutor,
- bgExecutor
+ bgExecutor,
+ usePanels
)
val key = ControlKey(selectedStructure.componentName, it.controlId)
cvh.bindData(controlsById.getValue(key))
@@ -500,6 +506,7 @@ class ControlsUiControllerImpl @Inject constructor (
hidden = true
popup?.dismiss()
activeDialog?.dismiss()
+ ControlActionCoordinator.closeDialog()
controlsController.get().unsubscribe()
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt
index d3d4287b8707..15c41a2005a6 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt
@@ -17,18 +17,16 @@
package com.android.systemui.controls.ui
import android.app.ActivityView
-import android.app.ActivityOptions
import android.app.Dialog
-import android.app.PendingIntent
import android.content.ComponentName
-import android.content.Context
import android.content.Intent
+import android.provider.Settings
import android.view.View
import android.view.ViewGroup
-import android.view.ViewGroup.LayoutParams.MATCH_PARENT
-import android.view.Window
+import android.view.WindowInsets
import android.view.WindowManager
-import android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+import android.widget.ImageView
+import android.widget.TextView
import com.android.systemui.R
@@ -38,20 +36,26 @@ import com.android.systemui.R
* The activity being launched is specified by {@link android.service.controls.Control#getAppIntent}.
*/
class DetailDialog(
- val parentContext: Context,
- val intent: PendingIntent
-) : Dialog(parentContext) {
+ val cvh: ControlViewHolder,
+ val intent: Intent
+) : Dialog(cvh.context, R.style.Theme_SystemUI_Dialog_Control_DetailPanel) {
- var activityView: ActivityView
+ companion object {
+ private const val ALPHA = (0.8f * 255).toInt()
+ private const val PANEL_TOP_OFFSET = "systemui.controls_panel_top_offset"
+ }
+
+ lateinit var activityView: ActivityView
val stateCallback: ActivityView.StateCallback = object : ActivityView.StateCallback() {
override fun onActivityViewReady(view: ActivityView) {
- val fillInIntent = Intent()
+ val launchIntent = Intent(intent)
// Apply flags to make behaviour match documentLaunchMode=always.
- fillInIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- fillInIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
- view.startActivity(intent, fillInIntent, ActivityOptions.makeBasic())
+ launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ launchIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
+
+ view.startActivity(launchIntent)
}
override fun onActivityViewDestroyed(view: ActivityView) {}
@@ -61,28 +65,8 @@ class DetailDialog(
override fun onTaskRemovalStarted(taskId: Int) {}
}
- @Suppress("DEPRECATION")
- private fun Window.setWindowParams() {
- requestFeature(Window.FEATURE_NO_TITLE)
-
- // Inflate the decor view, so the attributes below are not overwritten by the theme.
- decorView
- attributes.systemUiVisibility =
- (attributes.systemUiVisibility
- or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
-
- setLayout(MATCH_PARENT, MATCH_PARENT)
- clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
- addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
- or WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
- or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)
- setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY)
- getAttributes().setFitInsetsTypes(0 /* types */)
- }
-
init {
- getWindow()?.setWindowParams()
+ window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY)
setContentView(R.layout.controls_detail_dialog)
@@ -90,19 +74,61 @@ class DetailDialog(
requireViewById<ViewGroup>(R.id.controls_activity_view).apply {
addView(activityView)
}
+
+ requireViewById<ImageView>(R.id.control_detail_close).apply {
+ 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()
+ context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
+ v.context.startActivity(intent)
+ }
+ }
+
+ // consume all insets to achieve slide under effect
+ window.getDecorView().setOnApplyWindowInsetsListener {
+ v: View, insets: WindowInsets ->
+ activityView.apply {
+ val l = getPaddingLeft()
+ val t = getPaddingTop()
+ val r = getPaddingRight()
+ setPadding(l, t, r, insets.getSystemWindowInsets().bottom)
+ }
+
+ insets.consumeSystemWindowInsets()
+ }
+
+ requireViewById<ViewGroup>(R.id.control_detail_root).apply {
+ // use flag only temporarily for testing
+ val resolver = cvh.context.contentResolver
+ val defaultOffsetInPx = cvh.context.resources
+ .getDimensionPixelSize(R.dimen.controls_activity_view_top_offset)
+ val offsetInPx = Settings.Secure.getInt(resolver, PANEL_TOP_OFFSET, defaultOffsetInPx)
+
+ val lp = getLayoutParams() as ViewGroup.MarginLayoutParams
+ lp.topMargin = offsetInPx
+ setLayoutParams(lp)
+ }
}
override fun show() {
- val attrs = getWindow()?.attributes
- attrs?.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
- getWindow()?.attributes = attrs
-
activityView.setCallback(stateCallback)
super.show()
}
override fun dismiss() {
+ if (!isShowing()) return
activityView.release()
super.dismiss()
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/TemperatureControlBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/TemperatureControlBehavior.kt
index 15c1dabf71bd..6340db1d756d 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/TemperatureControlBehavior.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/TemperatureControlBehavior.kt
@@ -33,6 +33,10 @@ class TemperatureControlBehavior : Behavior {
override fun initialize(cvh: ControlViewHolder) {
this.cvh = cvh
+
+ cvh.layout.setOnClickListener { _ ->
+ ControlActionCoordinator.touch(cvh, template.getTemplateId(), control)
+ }
}
override fun bind(cws: ControlWithState) {
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/TouchBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/TouchBehavior.kt
index d64a5f060487..b02c9c8972fc 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/TouchBehavior.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/TouchBehavior.kt
@@ -20,7 +20,7 @@ import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable
import android.view.View
import android.service.controls.Control
-import android.service.controls.templates.StatelessTemplate
+import android.service.controls.templates.ControlTemplate
import com.android.systemui.R
import com.android.systemui.controls.ui.ControlActionCoordinator.MIN_LEVEL
@@ -31,7 +31,7 @@ import com.android.systemui.controls.ui.ControlActionCoordinator.MIN_LEVEL
*/
class TouchBehavior : Behavior {
lateinit var clipLayer: Drawable
- lateinit var template: StatelessTemplate
+ lateinit var template: ControlTemplate
lateinit var control: Control
lateinit var cvh: ControlViewHolder
@@ -40,14 +40,14 @@ class TouchBehavior : Behavior {
cvh.applyRenderInfo(false)
cvh.layout.setOnClickListener(View.OnClickListener() {
- ControlActionCoordinator.touch(cvh, template.getTemplateId())
+ ControlActionCoordinator.touch(cvh, template.getTemplateId(), control)
})
}
override fun bind(cws: ControlWithState) {
this.control = cws.control!!
cvh.status.setText(control.getStatusText())
- template = control.getControlTemplate() as StatelessTemplate
+ template = control.getControlTemplate()
val ld = cvh.layout.getBackground() as LayerDrawable
clipLayer = ld.findDrawableByLayerId(R.id.clip_layer)