认证为了防止误操作与客户霸屏应用需求产生了此需求。禁止状态栏下拉从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: .