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.xdnf.cn/news/1551918.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【数学分析笔记】第4章第1节 微分和导数(1)

4. 微分 4.1 微分和导数 考虑一个函数 y f ( x ) yf(x) yf(x)&#xff0c;当 x x x做一些微小的变动&#xff0c;函数值也会有微小的变动&#xff0c;比如&#xff1a; x → x △ x x\to x\bigtriangleup x x→x△x&#xff0c;则 f ( x ) → f ( x △ x ) f(x)\to f(x\bi…

【有啥问啥】卡尔曼滤波(Kalman Filter):从噪声中提取信号的利器

卡尔曼滤波&#xff08;Kalman Filter&#xff09;&#xff1a;从噪声中提取信号的利器 什么是卡尔曼滤波&#xff1f; 卡尔曼滤波&#xff08;Kalman Filter&#xff09;是一种高效的递归滤波器&#xff0c;专为处理包含噪声的线性动态系统而设计。它能够从一系列不完全且含…

网盘能否作为FTP替代产品?企业该如何进行FTP国产化替代?

近年来&#xff0c;信创的概念引入和高效实践落地让更多的行业企业自发性地进行国产化替代&#xff0c;目前信创国产化替代还多发生在操作系统和应用层面&#xff0c;软件工具等目前还在下一阶段规划&#xff0c;但很多企业未雨绸缪&#xff0c;已经在做调研和尝试。 FTP作为世…

大屏娱乐体验新标杆:海信发布全新一代AI电视

在金秋送爽的9月29日&#xff0c;海信以一场盛大的“BIG PLAN百吋风暴”秋季新品发布会&#xff0c;正式揭开了AI电视新时代的序幕。 作为本场发布会上最耀眼的明星&#xff0c;海信AI电视E7N系列凭借无与伦比的AI画质技术和极致性能&#xff0c;引领大屏娱乐体验迈入全新境界&…

仿真设计|基于51单片机的多模式音乐跑马灯

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 1、16个发光二极管做跑马灯&#xff0c;跑马灯有10种模式。 2、按键可以切换跑马灯模式&#xff0…

Java笔试02

在网络操作系统中&#xff0c;TCP和UDP是传输层中两个非常重要的协议。TCP提供的是面向连接的、可靠的端到端通信机制&#xff0c;因此TCP协议在注重数据安全的场景下获得了极为广泛的应用。 TCP采用了确认和重发机制来确保数据的可靠传输。 相较于UDP&#xff0c;TCP的优势在…

.NET CORE程序发布IIS后报错误 500.19

发布IIS后浏览时报错误500.19&#xff0c;同时配置文件web.config的路径中也存在问号“?”。 可能原因&#xff1a;没有安装运行时

无人机之编队控制篇

无人机编队控制是指无人机集群在执行任务过程中&#xff0c;如何形成并保持一定的几何构型&#xff0c;以适应平台性能、战场环境、战术任务等要求的控制技术。以下是对无人机编队控制的详细解析&#xff1a; 一、无人机编队控制的主要任务 无人机编队控制主要解决两个问题&a…

Linux 线程同步

前言 上一期我们介绍了线程互斥&#xff0c;并通过加锁解决了多线程并发访问下的数据不一致问题&#xff01;本期我们来介绍一下同步问题&#xff01; 目录 前言 一、线程同步 • 线程同步的引入 • 同步的概念 理解同步和饥饿问题 • 条件变量 理解条件变量 • 同步…

系列一、初始ElasticSearch

前言&#xff1a; 最近公司的业务有用到ElasticSearch&#xff0c;虽然说之前业余时间也自学过ElasticSearch技术&#xff0c;但是在公司实际的业务中开发中没有用过&#xff0c;再加上时间比较久远了&#xff0c;很多东西都忘记了&#xff0c;基于此我决定系统的重新学习一下这…

个人项目简单https服务配置

1.SSL简介 SSL证书是一种数字证书&#xff0c;由受信任的证书颁发机构&#xff08;CA&#xff09;颁发&#xff0c;用于在互联网通信中建立加密链接。SSL代表“安全套接层”&#xff0c;是用于在互联网上创建加密链接的协议。SSL证书的主要目的是确保数据传输的安全性和隐私性…

鸿蒙NEXT开发环境搭建(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

PMP--三模--解题--51-60

文章目录 14.敏捷--每日站会--内容--• 上次站会以来我都完成了什么&#xff1f;• 从现在到下一次站会&#xff0c;我计划完成什么&#xff1f;• 我的障碍&#xff08;或风险或问题&#xff09;是什么&#xff1f;--每日站会能够同步与协调相关的活动。14.敏捷--Scrum板 Scru…

【Ubuntu】VMware中虚拟网卡与服务器网卡的绑定

文章目录 服务器网卡和VMware中虚拟网卡的绑定1.在本机上查看需要的网卡名称2.服务器本机设置固定ip3.打开VMware后&#xff0c;将虚拟网卡与本机真实网卡进行绑定。4.给routeOS分配4张网卡&#xff0c;如图所示&#xff1a;5.ubuntu1和ubuntu2只需分配vmnet0和vmnet8即可&…

《More Effective C++》的学习

引用与指针 没有所谓的null reference reference一定需要代表某个对象&#xff0c;所以C要求reference必须有初值。 QString &s; 使用reference可能比使用pointer更高效。 因为reference一定是有效的&#xff0c;而指针可能为空&#xff08;需要多加一个判断&#xff0…

【PyTorch】图像目标检测

图像目标检测是什么 Object Detection 判断图像中目标的位置 目标检测两要素 分类&#xff1a;分类向量 [p0, …, pn]回归&#xff1a;回归边界框 [x1, y1, x2, y2] 模型如何完成目标检测 将3D张量映射到两个张量 分类张量&#xff1a;shape为 [N, c1]边界框张量&#xf…

索尼MDR-M1:超宽频的音频盛宴,打造沉浸式音乐体验

在音乐的世界里&#xff0c;每一次技术的突破都意味着全新的听觉体验。 索尼&#xff0c;作为音频技术的先锋&#xff0c;再次以其最新力作——MDR-M1封闭式监听耳机&#xff0c;引领了音乐界的新潮流。 这款耳机以其超宽频播放和卓越的隔音性能&#xff0c;为音乐爱好者和专…

深蕾半导体参加2024年度上海设计100+全球竞赛展览WDCC

展览介绍 WDCC2024 上海于2010年加入联合国教科文组织“创意城市网络”&#xff0c;定名为“设计之都”。“上海设计100”全球竞赛&#xff0c;遴选推广优秀设计案例&#xff0c;将“设计之都”的规划和愿景具体呈现。 ——展出时间、地点见文末—— 深蕾参展 深圳前海深蕾…

初识Linux · 进程等待

目录 前言&#xff1a; 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言&#xff1a; 通过上文的学习&#xff0c;我们了解了进程终止&#xff0c;知道终止是在干什么&#xff0c;终止的三种情况&#xff0c;以及有了退出码&#xff0c;错误码的概念&#xff…

Python | Leetcode Python题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; class Solution:def findDisappearedNumbers(self, nums: List[int]) -> List[int]:n len(nums)for num in nums:x (num - 1) % nnums[x] nret [i 1 for i, num in enumerate(nums) if num < n]return ret