关机重启Dialog适配遥控器功能


需求

在长按Power 按键的重启、关机弹框中,能够通过遥控器控制弹框中的 重启、关机功能点。
实际问题:长按Power 按键后,遥控器无法再弹框中获取焦点,导致遥控器无法控制关机、重启功能

修改文件:及说明

\vendor\mediatek\proprietary\packages\apps\SystemUI\res\layout\global_actions_grid_lite.xml
\vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\globalactions\GlobalActionsDialogLite.java

修改说明:

1)xml 配置文件中 两处添加:android:descendantFocusability=“afterDescendants” 属性,让子布局优先父布局获取焦点
2)让Dialog和布局获取焦点一次, 见 wangfangchen 相关修改处

相关资料说明:

协助查看源码,参考此需求实现的部分相关流程
RKAndroid12 SystemUI 源码

第三方SystemUI 源码 推荐:
在线SystemUI 源码:
之前自己分析过的相关文章可以了解下,基本知识需要储备储备
长按power弹出的弹框有经济呼叫按钮去掉:
SystemUI 关机界面全屏显示:

思路分析

其实就是一个焦点问题,让开关机弹框获取焦点,让子布局获取焦点的思路来解决。

源码分析:

GlobalActionsDialogLite.java 布局加载View

这个类比较熟悉了,相关的开关机/重启 power按键长按的弹框最终在这里形成,并处理相关业务

先从布局找起来
搜索R.layout 结果如下图 ,先每个看看大概的布局关联内容

MyPowerOptionsAdapter   -> int viewLayoutResource = com.android.systemui.R.layout.global_actions_power_item
MyOverflowAdapter       -> int viewLayoutResource = com.android.systemui.R.layout.controls_more_item;
SinglePressAction    -> View create ->View v = inflater.inflate(getGridItemLayoutResource() ->com.android.systemui.R.layout.global_actions_grid_item_lite;
ToggleAction         -> View create -> View v = inflater.inflate(com.android.systemui.R.layout.global_actions_grid_item_v2
SilentModeTriStateAction -> View create -> View v = inflater.inflate(R.layout.global_actions_silent_mode
onCreate ->initializeLayout -> setContentView(getLayoutResource()); ->com.android.systemui.R.layout.global_actions_grid_lite;
showSmartLockDisabledMessage ->View message = LayoutInflater.from(mContext).inflate(com.android.systemui.R.layout.global_actions_toast, mContainer, false)

从上面捋一下 layout 相关布局关联,找到了Dialog 相关的顶层布局layout 就是global_actions_grid_lite
查看 layout/global_actions_grid_lite.xml 布局源码如下

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/global_actions_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:layout_gravity="center">
  <com.android.systemui.globalactions.GlobalActionsLayoutLite
      android:id="@id/global_actions_view"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:orientation="vertical"
      android:clipChildren="false"
      android:clipToPadding="false"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      android:layout_weight="1">
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@android:id/list"
        android:gravity="center"
        android:translationZ="@dimen/global_actions_translate"
        android:orientation="horizontal"
        android:background="@drawable/global_actions_lite_background"
        android:padding="@dimen/global_actions_lite_padding"
        android:layoutDirection="ltr">
      <androidx.constraintlayout.helper.widget.Flow
          android:id="@+id/list_flow"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintTop_toTopOf="parent"
          app:flow_wrapMode="chain"
          app:flow_maxElementsWrap="2"
          app:flow_horizontalGap="@dimen/global_actions_lite_padding"
          app:flow_verticalGap="@dimen/global_actions_lite_padding"
          app:flow_horizontalStyle="packed"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
  </com.android.systemui.globalactions.GlobalActionsLayoutLite>
</androidx.constraintlayout.widget.ConstraintLayout>


所以,与之相关联的可能性比较大的,第一处需要修改的就是给布局中GlobalActionsLayoutLite添加焦点属性,让子布局获取焦点
android:descendantFocusability=“afterDescendants”

这里有一个自定义View GlobalActionsLayoutLite,看看它做什么的,在GlobalActionsDialogLite.java 里面看,这里关注 方法initializeLayout()


 protected void initializeLayout() {
   
   
            setContentView(getLayoutResource());           //设置布局地方
            fixNavBarClipping();

            mGlobalActionsLayout = findViewById(com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值