MTK Android12 最近历史任务 最左侧的清除历史任务改到页面底部

Android最近历史任务页面 -清除所有- 功能按钮放到底部


需求

最近历史任务重,全部清除按钮迁移到页面底部,常显。

需求原因

  • 其实很多客户都有反馈过,或者我们自己在使用自己手机时候,最近历史任务界面比较多的时候,右滑到最左边才会出现全部清除按钮,使用不方便,
    需要放到下边常显。

如下界面所示,修改之前:

在这里插入图片描述

修改的核心文件

\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\src\com\android\quickstep\TaskOverlayFactory.java
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\src\com\android\quickstep\views\OverviewActionsView.java
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\src\com\android\quickstep\views\RecentsView.java
\vendor\mediatek\proprietary\packages\apps\Launcher3\quickstep\res\layout\overview_actions_container.xml

#参考资料

  • 网上很多参考资料参考,思路永远一致,但是不同芯片平台,相同平台不同安卓版本 还是有一些区别的,根据自己实际环境,调试。

比如:在Android11之前最近历史任务在SystemUI中,在Android11 版本及之后,最近历史任务已经转移到了Launcher 里面了。

  • 这里只是给一个思路,我自己在RKAndroid11 和 Rk Android12 上面都实践过,思路一致,修改点少许改动,即可实现。

SystemUI 调整Recents中全部清除按钮位置

Android 11.0 最近任务的全部清除由左边移到下边显示

Android 13.0 Launcher3定制化之最近任务的全部清除由左边移到下边显示

实现方案

最近历史任务基本UI结构了解

源文件说明
TaskOverlayFactoryFactory class to create and add an overlays on the TaskView 创建和添加UI 覆盖在TaskView
OverviewActionsViewView for showing action buttons in Overview 在UI上展示覆盖的按钮
RecentsViewA list of recent tasks. 最近历史任务列表
overview_actions_containerOverviewActionsView 的布局

下面以RK 产品最近历史任务作为基本说明,上面的机器显示的最近历史任务界面中 下方的OverView 层 实际开发需求影藏起来了,不利于说明UI结构。
在这里插入图片描述

代码实现

思路

  • 上面的UI结构图和列举的UI关联类说明,这里给一下 实现思路
  • 将最近历史任务列表里面的清除所有按钮 永久影藏
  • 在TaskOverlayFactory 和 OverviewActionsView 中添加UI和功能实现
  • 在布局overview_actions_container 中 添加删除功能按钮

实现方案

RecentsView
  1. 一直影藏 全部清除按钮
    在RecentsView 构造方法中,设置清除所有按钮mClearAllButton INVISIBLE
	mClearAllButton.setVisibility(View.INVISIBLE);   //隐藏左侧的“全部清除”按钮
 public RecentsView(Context context, AttributeSet attrs, int defStyleAttr,
            BaseActivityInterface sizeStrategy) {
        super(context, attrs, defStyleAttr);
    。。。。。。。。。。。。。。。
        mClearAllButton.setOnClickListener(this::dismissAllTasks);
		mClearAllButton.setVisibility(View.INVISIBLE);   //隐藏左侧的“全部清除”按钮
    。。。。。。。。。。
    }
  1. isClearAllHidden 是否隐藏的判断,直接设置为true
  /**
     * Whether the Clear All button is hidden or fully visible. Used to determine if center
     * displayed page is a task or the Clear All button.
     *
     * @return True = Clear All button not fully visible, center page is a task. False = Clear All
     * button fully visible, center page is Clear All button.
     */
    public boolean isClearAllHidden() {
        //return mClearAllButton.getAlpha() != 1f;
		Log.d(TAG, " isClearAllHidden.. return true");

		return true;
    }
TaskOverlayFactory

1) OverlayUICallbacks 内部接口中添加清除所有的接口方法 clearAllRecentTask()

这里本身定义的有 分享onShare 、 截屏 onScreenshot 的功能按钮

 /**
     * Callbacks the Ui can generate. This is the only way for a Ui to call methods on the
     * controller.
     */
    public interface OverlayUICallbacks {
        /** User has indicated they want to share the current task. */
        void onShare();

        /** User has indicated they want to screenshot the current task. */
        void onScreenshot();
		void clearAllRecentTask();
    }

2) OverlayUICallbacksImpl 实现上述接口OverlayUICallbacks中的clearAllRecentTask 方法 clearAllRecentTask,定义清除所有的功能

protected class OverlayUICallbacksImpl implements OverlayUICallbacks {
            protected final boolean mIsAllowedByPolicy;
            protected final Task mTask;

            public OverlayUICallbacksImpl(boolean isAllowedByPolicy, Task task) {
                mIsAllowedByPolicy = isAllowedByPolicy;
                mTask = task;
            }

            public void onShare() {
                if (mIsAllowedByPolicy) {
                    endLiveTileMode(() -> mImageApi.startShareActivity(null));
                } else {
                    showBlockedByPolicyMessage();
                }
            }

            @SuppressLint("NewApi")
            public void onScreenshot() {
                endLiveTileMode(() -> saveScreenshot(mTask));
            }
			 @Override
             public void clearAllRecentTask() {
			   Log.d(TAG, " clearAllRecentTask...");
               mThumbnailView.getTaskView().getRecentsView().dismissAllTasks(mThumbnailView.getTaskView().getRecentsView());
            }
        }
在overview_actions_container

布局文件中添加 UI布局 的UI按钮

        <Button
            android:id="@+id/recents_clear_all_btn"
            style="@style/OverviewActionButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawableStart="@drawable/ic_screenshot"
            android:text="@string/recents_clear_all"
            android:theme="@style/ThemeControlHighlightWorkspaceColor"
            />

OverviewActionsView

加载布局,给布局设置接口回调和点击功能
1) onFinishInflate 方法周公加载 布局文件的UI按钮 并设置监按钮点击监听事件

findViewById(R.id.recents_clear_all_btn).setOnClickListener(this);
 @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        View share = findViewById(R.id.action_share);
        share.setOnClickListener(this);
        findViewById(R.id.action_screenshot).setOnClickListener(this);
		findViewById(R.id.recents_clear_all_btn).setOnClickListener(this);
         if (ENABLE_OVERVIEW_SHARE.get()) {
            share.setVisibility(VISIBLE);
            findViewById(R.id.oav_three_button_space).setVisibility(VISIBLE);
        }
    }

2) onClick 中回调 view 点击事件,然后回调接口事件 mCallbacks.clearAllRecentTask();


    @Override
    public void onClick(View view) {
        if (mCallbacks == null) {
			Log.d(TAG, " mCallbacks == null...");
            return;
        }
        int id = view.getId();
        if (id == R.id.action_share) {
            mCallbacks.onShare();
        } else if (id == R.id.action_screenshot) {
            mCallbacks.onScreenshot();
        } else if (id == R.id.recents_clear_all_btn) {
			  Log.d(TAG, "onClick recents_clear_all_btn...");
              mCallbacks.clearAllRecentTask();
        }
    }

3) updateDisabledFlags 更新,永为true

LayoutUtils.setViewEnabled(this, true);
  /**
     * Updates the proper disabled flag to indicate whether OverviewActionsView should be enabled.
     * Ignores DISABLED_ROTATED flag for determining enabled. Flag is used to enable/disable
     * buttons individually, currently done for select button in subclass.
     *
     * @param disabledFlags The flag to update.
     * @param enable        Whether to enable the disable flag: True will cause view to be disabled.
     */
    public void updateDisabledFlags(@ActionsDisabledFlags int disabledFlags, boolean enable) {
        if (enable) {
            mDisabledFlags |= disabledFlags;
        } else {
            mDisabledFlags &= ~disabledFlags;
        }
        //
        boolean isEnabled = (mDisabledFlags & ~DISABLED_ROTATED) == 0;
        //LayoutUtils.setViewEnabled(this, isEnabled);
		Log.d(TAG, " updateDisabledFlags...");
		LayoutUtils.setViewEnabled(this, true);
    }

实际效果

在这里插入图片描述

总结

  • 简单实现了全部清除功能 放到页面下方
  • 熟悉最近历史任务的基本功能,基本结构,基本框架
  • 其它最近历史任务功能 待 研究
根据引用、[2]和的内容,"Artifact spring_mvc_helloworld:war exploded: Error during artifact deployment. See server log for details."是在启动Tomcat之后出现的错误。"war exploded"表示部署的是一个war包,"Error during artifact deployment"表示在部署该war包时发生了错误。具体的错误信息可以在服务器日志中查看。 解决这个问题的方法有以下几步: 1. 首先,打开服务器日志,查看具体的错误信息。根据引用中的描述,服务器日志中应该有关于错误的详细信息。 2. 根据错误信息,定位问题所在。可能的原因包括:缺少依赖、配置错误、冲突的版本或其他部署相关的问题。 3. 检查项目的配置文件,确保相关的依赖项正确配置,并且没有冲突的版本。 4. 确保部署环境的配置正确,并且与项目的配置相匹配。 5. 如果找不到具体的错误信息,可以尝试重新构建和部署项目,以确保项目的正确性。 6. 如果问题仍然存在,可以尝试在相关的开发社区或论坛上寻求帮助,向其他开发者咨询他们是否遇到过类似的问题,并获取他们的解决方案。 总结:"Artifact spring_mvc_helloworld:war exploded: Error during artifact deployment. See server log for details."是在部署war包时出现的错误,具体的解决方法包括查看服务器日志、定位问题、检查项目和环境的配置、重新构建和部署项目,并寻求帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Artifact 项目:war exploded: Error during artifact deployment. See server log for details.解决办法...](https://blog.csdn.net/AbbyZzzzz/article/details/127274092)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [InteliJ IDEA artifact的作用Artifact -war exploded- Error during artifact deployment_artifact吧](https://download.csdn.net/download/lj_70596/14044317)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野火少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值