文章目录
需求
在长按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