Android 添加禁止下拉菜单和实现控制下拉通知栏功能

overlay/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml

<string name="pull_down_switch">禁用通知下拉菜单</string>
    <string name="pull_down_switch2">打开:禁止下拉菜单 \n关闭:准许下拉菜单</string>

overlay/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml

 <add-resource type="string" name="pull_down_switch"/>
    <add-resource type="string" name="pull_down_switch2"/>

  <string name="pull_down_switch">Disable notify pull-down menu</string>
    <string name="pull_down_switch2">ON:disable pull down \nOFF:allow pull down</string>

【目前添加在显示栏中】

vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/display_settings.xml

   <!--add disable pull down menu in systemUI-->
       <Preference
            android:key="statusbar_switch"
            android:title="@string/pull_down_switch">
            <intent android:action="com.freeme.intent.action.switch"/>
       </Preference>

/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/freeme_qs_switch.xml

<?xml version="1.0" encoding="UTF-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <SwitchPreference
        android:key="switch_preference"
        android:title="@string/pull_down_switch"
        android:summary="@string/pull_down_switch2"
        android:defaultValue="true"/>
</PreferenceScreen>

 /vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/QsSwitchSetting.java

开关默认1为打开,功能实现默认为1

反之:

开关默认0为关闭 ,功能实现默认为0

<这里为默认打开菜单栏开关>

package com.android.settings;import android.content.Context;
import android.os.Bundle;
import android.provider.SearchIndexableResource;
import android.provider.Settings;
import android.preference.Preference;
import android.preference.SwitchPreference;
import android.preference.ListPreference;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.SettingsPreferenceFragment;
import android.os.SystemProperties;
import android.preference.PreferenceActivity;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;
import android.preference.Preference.OnPreferenceChangeListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
//*/
import android.os.SystemProperties;
//*/
public class QsSwitchSetting extends PreferenceActivity implementsPreference.OnPreferenceChangeListener {private static final String QS_KEY = "switch_preference";private SwitchPreference mARPreference;private Context mContext;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);addPreferencesFromResource(R.xml.freeme_qs_switch);mContext = this;initializeAllPreferences();}private void initializeAllPreferences() {mARPreference = (SwitchPreference) findPreference(QS_KEY);mARPreference.setChecked(Settings.System.getInt(getContentResolver(),"qs_switch", 1) == 1);//def 1 openmARPreference.setOnPreferenceChangeListener(this);}@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {boolean isChecked = (boolean) newValue;if (isChecked) {//SystemProperties.set("disable.qs.switch","1");//disableSettings.System.putInt(getContentResolver(), "qs_switch", 1);} else {//ystemProperties.set("disable.qs.switch","0");//ableSettings.System.putInt(getContentResolver(), "qs_switch", 0);}return true;}private void writeFile(String path, String content) {FileWriter fileWriter = null;try {fileWriter = new FileWriter(path);if (fileWriter != null) {fileWriter.write(content);}} catch (Exception e) {e.printStackTrace();} finally {if (fileWriter != null)try {fileWriter.close();} catch (IOException e) {e.printStackTrace();}}}
}

四个实现类:包括锁屏状态和未锁屏

return中断或返回值

1./vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java

/ TODO: change the method signature to use (boolean inputFocusTransferStarted)
        @Override
        public void onStatusBarMotionEvent(MotionEvent event) {
            //*/,add qs switch
            if(1 == android.provider.Settings.System.getInt(mContext.getContentResolver(), "qs_switch", 1)){//1 def open
            
            } else {

                verifyCallerAndClearCallingIdentity("onStatusBarMotionEvent", () -> {
                    // TODO move this logic to message queue
                    mCentralSurfacesOptionalLazy.get().ifPresent(centralSurfaces -> {
                        if (event.getActionMasked() == ACTION_DOWN) {
                            centralSurfaces.getPanelController().startExpandLatencyTracking();
                        }
                        mHandler.post(() -> {
                            int action = event.getActionMasked();
                            if (action == ACTION_DOWN) {
                                mInputFocusTransferStarted = true;
                                mInputFocusTransferStartY = event.getY();
                                mInputFocusTransferStartMillis = event.getEventTime();
                                centralSurfaces.onInputFocusTransfer(
                                        mInputFocusTransferStarted, false /* cancel */,
                                        0 /* velocity */);
                            }
                            if (action == ACTION_UP || action == ACTION_CANCEL) {
                                mInputFocusTransferStarted = false;
                                float velocity = (event.getY() - mInputFocusTransferStartY)
                                        / (event.getEventTime() - mInputFocusTransferStartMillis);
                                centralSurfaces.onInputFocusTransfer(mInputFocusTransferStarted,
                                        action == ACTION_CANCEL,
                                        velocity);
                            }
                            event.recycle();
                        });
                    });
                });
          }//*/
        }

2.

 /vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java

 //*/add
    private Context mContext;
    //*/

 public CommandQueue(Context context, ProtoTracer protoTracer, CommandRegistry registry) {
        mProtoTracer = protoTracer;
        mRegistry = registry;
        //*/add
       mContext = context;
        //*/

        context.getSystemService(DisplayManager.class).registerDisplayListener(this, mHandler);
        // We always have default display.
        setDisabled(DEFAULT_DISPLAY, DISABLE_NONE, DISABLE2_NONE);
    }

    // TODO(b/118592525): add multi-display support if needed.
    public boolean panelsEnabled() {
        //*/add qs_switch
        if(1 == android.provider.Settings.System.getInt(mContext.getContentResolver(), "qs_switch", 1)){//def open
           return  false;
        } else {

         
        final int disabled1 = getDisabled1(DEFAULT_DISPLAY);
        final int disabled2 = getDisabled2(DEFAULT_DISPLAY);
        return (disabled1 & StatusBarManager.DISABLE_EXPAND) == 0
                && (disabled2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) == 0
                && !ONLY_CORE_APPS;
        }
        //*/

    }

 

3. /vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt

class DragDownHelper(
    private val falsingManager: FalsingManager,
    private val falsingCollector: FalsingCollector,
    private val dragDownCallback: LockscreenShadeTransitionController,
    context: Context
) : Gefingerpoken {

    private var dragDownAmountOnStart = 0.0f
    lateinit var expandCallback: ExpandHelper.Callback
    lateinit var host: View

    private var minDragDistance = 0
    private var initialTouchX = 0f
    private var initialTouchY = 0f
    private var touchSlop = 0f
    private var slopMultiplier = 0f
    private val temp2 = IntArray(2)
    private var draggedFarEnough = false
    private var startingChild: ExpandableView? = null
    private var lastHeight = 0f
    var isDraggingDown = false
        private set
     //add mContext
     var mContext = context

    private val isFalseTouch: Boolean
        get() {
            return if (!dragDownCallback.isFalsingCheckNeeded) {
                false
            } else {
                falsingManager.isFalseTouch(Classifier.NOTIFICATION_DRAG_DOWN) || !draggedFarEnough
            }
        }

override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        val x = event.x
        val y = event.y
        when (event.actionMasked) {
            MotionEvent.ACTION_DOWN -> {
                draggedFarEnough = false
                isDraggingDown = false
                startingChild = null
                initialTouchY = y
                initialTouchX = x
            }
            MotionEvent.ACTION_MOVE -> {
                val h = y - initialTouchY
                // Adjust the touch slop if another gesture may be being performed.
                val touchSlop = if (event.classification
                        == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE)
                    touchSlop * slopMultiplier
                else
                    touchSlop
                if (h > touchSlop && h > Math.abs(x - initialTouchX)) {
                   //*/add if else qs_switch
                     if(1 == android.provider.Settings.System.getInt(mContext.getContentResolver(), "qs_switch", 1)){
                        return true
                     } else {

                            falsingCollector.onNotificationStartDraggingDown()
                            isDraggingDown = true
                            captureStartingChild(initialTouchX, initialTouchY)
                            initialTouchY = y
                            initialTouchX = x
                            dragDownCallback.onDragDownStarted(startingChild)
                            dragDownAmountOnStart = dragDownCallback.dragDownAmount
                            return startingChild != null || dragDownCallback.isDragDownAnywhereEnabled
                     }
                    //*/

                }
            }
        }

4./vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java

  void setQsExpansion(float height) {
         //*/add if else qs_switch
         if(1 == android.provider.Settings.System.getInt(mView.getContext().getContentResolver(), "qs_switch", 1)){
            return;
         } else {

            height = Math.min(Math.max(height, mQsMinExpansionHeight), mQsMaxExpansionHeight);
            mQsFullyExpanded = height == mQsMaxExpansionHeight && mQsMaxExpansionHeight != 0;
            boolean qsAnimatingAway = !mQsAnimatorExpand && mAnimatingQS;
            if (height > mQsMinExpansionHeight && !mQsExpanded && !mStackScrollerOverscrolling
                    && !mDozing && !qsAnimatingAway) {
                setQsExpanded(true);
            } else if (height <= mQsMinExpansionHeight && mQsExpanded) {
                setQsExpanded(false);
            }
            mQsExpansionHeight = height;
            updateQsExpansion();
            requestScrollerTopPaddingUpdate(false /* animate */);
            mKeyguardStatusBarViewController.updateViewState();
            if (mBarState == StatusBarState.SHADE_LOCKED || mBarState == KEYGUARD) {
                updateKeyguardBottomAreaAlpha();
                positionClockAndNotifications();
            }

            if (mAccessibilityManager.isEnabled()) {
                mView.setAccessibilityPaneTitle(determineAccessibilityPaneTitle());
            }

            if (!mFalsingManager.isUnlockingDisabled() && mQsFullyExpanded
                    && mFalsingCollector.shouldEnforceBouncer()) {
                mCentralSurfaces.executeRunnableDismissingKeyguard(null, null /* cancelAction */,
                        false /* dismissShade */, true /* afterKeyguardGone */, false /* deferred */);
            }
            if (DEBUG_DRAWABLE) {
                mView.invalidate();
            }
         }//*/
         
    }

如果是仅实现屏蔽下拉栏【完全不用下拉栏】,就可不用增加菜单开关,这样直接实现return这几个类也可!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的催眠电路控制系统

** 文章目录 前言一 概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主…

【2024工业3D异常检测文献】CMDIAD: 基于跨模态蒸馏驱动的多模态工业异常检测

Incomplete Multimodal Industrial Anomaly Detection via Cross-Modal Distillation 1、Background 近年来&#xff0c;基于3D点云和RGB图像的多模态工业异常检测(IAD)研究强调了利用模态间的冗余性和互补性对于精确分类和分割的重要性。 在项目中&#xff0c;提出了CMDIAD方…

如何在算家云搭建MVSEP-MDX23(音频分离)

一、MVSEP-MDX23简介 模型GitHub网址&#xff1a;MVSEP-MDX23-music-separation-model/README.md 在 main ZFTurbo/MVSEP-MDX23-音乐分离模型 GitHub 上 在音视频领域&#xff0c;把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有…

js列表数据时间排序和取唯一值

1.取唯一值[...new Set(array)] const array [1, 2, 3, 2, 4, 5, 3, 5]; // 使用Set去除重复元素 const uniarray [...new Set(array)]; console.log(uniarray); // 输出: [1, 2, 3, 4, 5] 2.排序 var u [1,3,2,5,4]; var uu u.sort(); console.log(uu); var u [1,3…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第四篇-着色器投影-接收阴影部分】

上一章中实现了体积渲染的光照与自阴影&#xff0c;那我们这篇来实现投影 回顾 勘误 在开始本篇内容之前&#xff0c;我已经对上一章中的内容的错误进行了修改。为了确保不会错过这些更正&#xff0c;同时也避免大家重新阅读一遍&#xff0c;我将在这里为大家演示一下修改的…

如何培养稀缺的创新能力

在早几年的业务红海阶段&#xff0c;自己就意识到了创新能力对于业务的重要性。原本在前段时间就想分享给大家&#xff0c;但自己也有一些顾虑。 一方面是个人私心&#xff0c;自己多年实操总结的经验&#xff0c;不想这么轻易的就发布到社交网站上&#xff1b;其次是此类的知…

算法分析——《二分查找》

&#x1f6e9;《二分查找》 &#x1f3a8;题目描述&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 …

matlab入门学习(四)多项式、符号函数、数据统计

一、多项式 %多项式&#xff08;polynomial&#xff09;%创建 p[1,2,3,4] %系数向量&#xff0c;按x降幂排列&#xff0c;最右边是常数&#xff08;x的0次幂&#xff09; f1poly2str(p,x) %系数向量->好看的字符串 f x^3 2 x^2 3 x 4&#xff08;不能运算的式子&#xf…

BI 和 AI 有什么区别?

BI 和 AI 中都有个 I&#xff0c;对应的英文单词都是 Intelligence&#xff0c;看起来是同一个意思。 其实不然&#xff0c;即使我们只限定商业决策领域中讨论问题&#xff0c;BI 和 AI 中的 I 也有很大的不同。 广义地来看&#xff0c;根据数据来辅助商业决策的事务都可以叫 B…

Nginx部署前端Vue项目的深度解析

目录 一、准备工作 1.1 开发环境 1.2 服务器环境 1.3 Nginx安装 二、构建Vue项目 三、上传静态文件到服务器 四、配置Nginx 五、测试并重新加载Nginx 六、访问Vue应用 七、高级配置 7.1 启用HTTPS 7.2 启用Gzip压缩 7.3 缓存控制 八、常见问题与解决方案 8.1 40…

Java基础(Arrays工具类)(asList()方法)(详细)

目录 一、Arrays工具类 &#xff08;1&#xff09;引言 &#xff08;2&#xff09;基本介绍 &#xff08;3&#xff09;主要功能&#xff08;提供的方法&#xff09; &#xff08;I&#xff09;排序&#xff08;Arrays.sort()&#xff09; &#xff08;II&#xff09;搜索(查找…

怎么给视频加片头片尾和字幕

在这个视觉内容爆炸的时代&#xff0c;一段精心制作的视频不仅能吸引眼球&#xff0c;更能传达深刻的情感与信息。而一个引人入胜的片头、一个温馨感人的片尾&#xff0c;以及恰到好处的字幕&#xff0c;无疑是提升视频质感的关键。那么新人要怎么给视频加片头片尾和字幕效果呢…

Springboot项目-实战2-实现

文章目录 接口接收数据并进行数据清洗mysql读取到redis接口返回参数对象java函数使用备注返回参数分析stream操作Thread线程队列集合存储统计加密日志以及aspect对接口的时间影响&#xff1f;war包和jar包的区别&#xff1f;filter、interceptor、aspect区别&#xff1f;探针Gs…

如何在 Kubernetes 上部署和配置开源数据集成平台 Airbyte?

在 Kubernetes 上部署和配置 Airbyte 是一个复杂但非常有价值的过程&#xff0c;特别是对于需要强大数据集成和数据处理能力的企业或团队。Airbyte 是一个开源的数据集成平台&#xff0c;允许用户从各种来源提取数据并加载到目标存储中。其强大的插件系统支持多种数据源与目标&…

C语言 | Leetcode C语言题解之第440题字典序的第K小数字

题目&#xff1a; 题解&#xff1a; #define MIN(x, y) ((x) < (y) ? (x) : (y))int getSteps(int curr, long n) {int steps 0;long first curr;long last curr;while (first < n) {steps MIN(last, n) - first 1;first first * 10;last last * 10 9;}return …

前端——测试与打包时静态资源引用路径

1.测试与打包构建目录说明 &#xff08;1&#xff09;说明&#xff1a; public路径&#xff1a;/xx 绝对路径&#xff1a;/public/xx 相对路径&#xff1a;./xx public路径与绝对路径说明&#xff0c;原理&#xff1a; 在Vite中&#xff0c; / 开头的绝对路径默…

QT使用qss控制样式实现动态换肤

文章目录 设计QSS样式表动态加载QSS文件主函数调用QT提供了一种非常灵活的方式来使用QSS(Qt Style Sheet,类似于 CSS 的样式表),实现界面的动态换肤功能。QSS可以改变Qt应用程序中几乎所有可视组件的外观,包括颜色、字体、边框等。下面介绍一下如何通过QSS实现动态换肤。 设…

诗画紫砂壶

大家详细解答一首网络上流传的顺口溜&#xff0c;其中包含了很多的紫砂壶型。 // 紫砂壶型 // 秦权汉瓦唐羽仙&#xff0c;西施文旦美人肩。 逸公德钟对却月&#xff0c;仿鼓虚扁望方山。东坡提梁卧井栏&#xff0c;供春提璧看柿圆。荷花海棠吹松段。掇只君乐奏合欢&#xff…

vue3中< keep-alive >页面实现缓存及遇到的问题

vue3中< keep-alive >页面实现缓存及遇到的问题 实现原理&#xff1a;keep-alive 是 Vue 的内置组件&#xff0c;当它包裹动态组件时&#xff0c;会缓存不活动的组件实例&#xff0c;而不是销毁它们。实现不同路由是否缓存只需要设置对应路由参数keepAlive为true&#xf…

Spring Boot 实现动态配置导出,同时支持公式和动态下拉框渲染和性能优化案例示范

在业务系统中&#xff0c;数据导出是一个非常常见且重要的功能&#xff0c;本文将详细介绍如何在 Spring Boot 中实现这一功能&#xff0c;并结合 MySQL 数据库、MyBatis 作为数据访问层&#xff0c;EasyExcel 作为导出工具&#xff0c;展示如何在电商交易系统中搭建灵活、可扩…