android 禁止状态栏下拉

认证为了防止误操作与客户霸屏应用需求产生了此需求。禁止状态栏下拉从UI的角度进行分析,即难又容易。难的是android的SystemUI设计层层嵌套,即使使用工具进行分层分析,也需要耐心;容易很好理解,只要是UI界面的代码,总是能修改的。

不同的android版本,不同的芯片厂商,对于SystemUi的改造大相径庭,从UI变化的角度切入很容易破题。

android 10修改方案

通过属性进行控制
patch:

Index: frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
===================================================================
@@ -6404,6 +6404,10 @@
         /* Only ever called as a consequence of a lockscreen expansion gesture. */
         @Override
         public boolean onDraggedDown(View startingChild, int dragLengthY) {
+        	if (mStatusBarState == StatusBarState.KEYGUARD && 
+					!getResources().getBoolean(R.bool.config_qs_expansion_enabled)) {
+				return true;
+			}
             if (mStatusBarState == StatusBarState.KEYGUARD
                     && hasActiveNotifications()) {
                 mLockscreenGestureLogger.write(
Index: frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
===================================================================
@@ -50,6 +50,7 @@
 import com.android.internal.os.SomeArgs;
 import com.android.internal.statusbar.IStatusBar;
 import com.android.internal.statusbar.StatusBarIcon;
+import com.android.systemui.R;
 import com.android.systemui.SystemUI;
 import com.android.systemui.statusbar.CommandQueue.Callbacks;
 import com.android.systemui.statusbar.policy.CallbackController;
@@ -137,6 +138,8 @@
      */
     private int mLastUpdatedImeDisplayId = INVALID_DISPLAY;
 
+	private boolean mQsExpansionEnable;
+
     /**
      * These methods are called back on the main thread.
      */
@@ -299,6 +302,8 @@
         context.getSystemService(DisplayManager.class).registerDisplayListener(this, mHandler);
         // We always have default display.
         setDisabled(DEFAULT_DISPLAY, DISABLE_NONE, DISABLE2_NONE);
+
+		mQsExpansionEnable = context.getResources().getBoolean(R.bool.config_qs_expansion_enabled);
     }
 
     @Override
@@ -325,7 +330,8 @@
         final int disabled2 = getDisabled2(DEFAULT_DISPLAY);
         return (disabled1 & StatusBarManager.DISABLE_EXPAND) == 0
                 && (disabled2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) == 0
-                && !ONLY_CORE_APPS;
+                && !ONLY_CORE_APPS
+                && mQsExpansionEnable;
     }
 
     public void addCallback(Callbacks callbacks) {
Index: frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
===================================================================
@@ -1150,7 +1150,7 @@
         if (!isFullyCollapsed()) {
             handleQsDown(event);
         }
-        if (!mQsExpandImmediate && mQsTracking) {
+        if (getResources().getBoolean(R.bool.config_qs_expansion_enabled) && !mQsExpandImmediate && mQsTracking) {
             onQsTouch(event);
             if (!mConflictingQsExpansionGesture) {
                 return true;
Index: frameworks/base/packages/SystemUI/res/values/config.xml
===================================================================
@@ -507,4 +507,7 @@
     <!-- UNISOC: Bug 1115729 message reply add max size -->
     <integer name="config_message_reply_max_size">1600</integer>
 
+    <bool name="config_qs_expansion_enabled">false</bool>

 </resources>

android 13修改方案

在上述属性控制的方案下,添加广播对外接口。

Index: vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
===================================================================
--- vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java	(版本 157)
+++ vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java	(版本 162)
@@ -67,6 +67,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.PowerManager;
+import android.os.SystemProperties;
 import android.os.Trace;
 import android.os.UserManager;
 import android.os.VibrationEffect;
@@ -2364,6 +2365,9 @@
     }
 
     void setQsExpansion(float height) {
+        if (SystemProperties.getBoolean("persist.sys.statusbar.disable", false)) {
+            return;
+        }
         height = Math.min(Math.max(height, mQsMinExpansionHeight), mQsMaxExpansionHeight);
         mQsFullyExpanded = height == mQsMaxExpansionHeight && mQsMaxExpansionHeight != 0;
         boolean qsAnimatingAway = !mQsAnimatorExpand && mAnimatingQS;
Index: vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
===================================================================
--- vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java	(版本 157)
+++ vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java	(版本 162)
@@ -52,6 +52,7 @@
 import android.os.Message;
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
+import android.os.SystemProperties;
 import android.util.Log;
 import android.util.Pair;
 import android.util.SparseArray;
@@ -511,6 +512,9 @@
 
     // TODO(b/118592525): add multi-display support if needed.
     public boolean panelsEnabled() {
+        if (SystemProperties.getBoolean("persist.sys.statusbar.disable", false)) {
+            return false;
+        }
         final int disabled1 = getDisabled1(DEFAULT_DISPLAY);
         final int disabled2 = getDisabled2(DEFAULT_DISPLAY);
         return (disabled1 & StatusBarManager.DISABLE_EXPAND) == 0
@@ -694,6 +698,10 @@
 
     public void toggleRecentApps() {
         synchronized (mLock) {
+            if (!SystemProperties.getBoolean("sys.recent_enable", true)) {
+                Log.w(TAG, "Ignore toggleRecents nav bar disable.");
+                return;
+            }
             mHandler.removeMessages(MSG_TOGGLE_RECENT_APPS);
             Message msg = mHandler.obtainMessage(MSG_TOGGLE_RECENT_APPS, 0, 0, null);
             msg.setAsynchronous(true);
Index: vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
===================================================================
--- vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt	(版本 157)
+++ vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt	(版本 162)
@@ -175,7 +175,8 @@
     /**
      * The touch helper responsible for the drag down animation.
      */
-    val touchHelper = DragDownHelper(falsingManager, falsingCollector, this, context)
+    val touchHelper = DragDownHelper(statusBarStateController, falsingManager, falsingCollector, this, context)
 
     private val splitShadeOverScroller: SplitShadeLockScreenOverScroller by lazy {
         splitShadeOverScrollerFactory.create(qS, nsslController)
@@ -720,7 +721,9 @@
  * A utility class to enable the downward swipe on the lockscreen to go to the full shade and expand
  * the notification where the drag started.
  */
 class DragDownHelper(
+    private val statusBarStateController: SysuiStatusBarStateController,
     private val falsingManager: FalsingManager,
     private val falsingCollector: FalsingCollector,
     private val dragDownCallback: LockscreenShadeTransitionController,
@@ -787,6 +790,10 @@
                 else
                     touchSlop
                 if (h > touchSlop && h > Math.abs(x - initialTouchX)) {
+                    if (statusBarStateController.state == StatusBarState.KEYGUARD &&
+                            android.os.SystemProperties.getBoolean("persist.sys.statusbar.disable", false)){
+                        return true;
+                    }
                     falsingCollector.onNotificationStartDraggingDown()
                     isDraggingDown = true
                     captureStartingChild(initialTouchX, initialTouchY)
@@ -912,4 +919,4 @@
         host.getLocationOnScreen(temp2)
         return expandCallback.getChildAtRawPosition(x + temp2[0], y + temp2[1])
     }
-}
\ No newline at end of file
+}
Index: vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/SystemUIControllerReceiver.java
===================================================================
--- vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/SystemUIControllerReceiver.java	(不存在的)
+++ vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/SystemUIControllerReceiver.java	(版本 162)
@@ -0,0 +1,55 @@
+package com.android.systemui;
+
+import android.app.StatusBarManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.SystemProperties;
+import android.util.Log;
+import android.view.KeyEvent;
+
+public class SystemUIControllerReceiver extends BroadcastReceiver {
+    private static final String TAG = "SystemUIControllerReceiver";
+
+    private static final String ACTION_SWITCH_STATUSBAR = "com.android.action.STATUSBAR_SWITCH_STATE";
+    private static final String EXTRA_ENABLE = "enable";
+	
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        String action = intent.getAction();
+        Log.d(TAG, "action==> " + action);
+        if (ACTION_SWITCH_STATUSBAR.equals(action)) {
+            boolean enable = intent.getBooleanExtra(EXTRA_ENABLE, false);
+            Log.d(TAG, "ACTION_SWITCH_STATUSBAR enable= " + enable);
+            SystemProperties.set("persist.sys.statusbar.disable", enable ? "false" : "true");
+        }
+}
Index: vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml
===================================================================
--- vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml	(版本 157)
+++ vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml	(版本 162)
@@ -952,5 +952,14 @@
             </intent-filter>
         </receiver>
 
+        <receiver android:name=".SystemUIControllerReceiver"
+                  android:exported="true">
+            <intent-filter>
+                <action android:name="com.android.action.STATUSBAR_SWITCH_STATE" />
+            </intent-filter>
+        </receiver>
+
     </application>
 </manifest>
Index: .
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值