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

news/2024/10/21 9:10:31/

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.ppmy.cn/news/1532805.html

相关文章

什么是 Apache Ingress

Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量&#xff0c;并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群&#xff0c;确保它们的高可用性和可扩展性&#xff0c;同时还提供自动化…

2024暄桐“静定的滋养”|静坐篇之林曦老师聊静坐

我们都喜爱“静”&#xff0c;它是一种因能量充足而带来的稳定放松的状态。 正在报名中的暄桐《2024书法课程 第五阶“静定的滋养” | 从书法之美到生活之美——林曦老师的线上直播书法课》&#xff0c;除了书法进阶部分的内容之外&#xff0c;读书部分正是帮助我们加强对静定的…

Python Pandas数据处理效率提升指南

大家好&#xff0c;在数据分析中Pandas是Python中最常用的库之一&#xff0c;然而当处理大规模数据集时&#xff0c;Pandas的性能可能会受到限制&#xff0c;导致数据处理变得缓慢。为了提升Pandas的处理速度&#xff0c;可以采用多种优化策略&#xff0c;如数据类型优化、向量…

生产k8s 应用容器内存溢出OOMKilled问题处理

需求&#xff1a;使用spring batch从上游edb接收数据压缩文件&#xff0c;再将文件解压后使用load将数据入库。解压后单个文件有800M左右。 问题&#xff1a;服务正常启动没有问题&#xff0c;且数据量少时也没有内存溢出问题。但是当数据量增大时存在内存溢出问题&#xff0c…

大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

用SpringBoot打造先进的学科竞赛管理系统

1绪 论 1.1研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理&#xff0c;这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制&#xff0c;不仅提高了工作效率&#xff0c;而且大大的提高了其…

Redis篇(数据类型)

目录 讲解一&#xff1a;简介 讲解二&#xff1a;常用 一、String类型 1. 简介 2. 常见命令 3. Key结构 4. 操作String 5. 实例 二、Hash类型 1. 简介 2. 常见命令 3. 3操作hash 4. 实例 三、List类型 1. 简介 2. 特征 3. 应用场景 4. 常见命令 5. 操作list …

【Spring基础3】- Spring的入门程序

目录 3-1 Spring的下载3-2 Spring的 jar 包3-3 第一个 Spring程序第一步&#xff1a;添加spring context的依赖&#xff0c;pom.xml配置如下第二步&#xff1a;添加junit依赖第三步&#xff1a;定义bean&#xff1a;User第四步&#xff1a;编写spring的配置文件&#xff1a;bea…