diff options
8 files changed, 225 insertions, 57 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 19a03a0d528d..29fcdaf64843 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11320,6 +11320,14 @@ public final class Settings { public static final String EMERGENCY_AFFORDANCE_NEEDED = "emergency_affordance_needed"; /** + * Enable faster emergency phone call feature. + * The value is a boolean (1 or 0). + * @hide + */ + public static final String FASTER_EMERGENCY_PHONE_CALL_ENABLED = + "faster_emergency_phone_call_enabled"; + + /** * See RIL_PreferredNetworkType in ril.h * @hide */ diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 778e4c4e3797..182df496156a 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2602,6 +2602,7 @@ "silent" = silent mode "users" = list of users "restart" = restart device + "emergency" = Launch emergency dialer "lockdown" = Lock down device until the user authenticates "logout" = Logout the current user --> @@ -2612,6 +2613,7 @@ <item>logout</item> <item>bugreport</item> <item>screenshot</item> + <item>emergency</item> </string-array> <!-- Number of milliseconds to hold a wake lock to ensure that drawing is fully diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index e50efa970f3b..77733f3e1c60 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -238,6 +238,7 @@ public class SettingsBackupTest { Settings.Global.EUICC_SUPPORTED_COUNTRIES, Settings.Global.EUICC_FACTORY_RESET_TIMEOUT_MILLIS, Settings.Global.FANCY_IME_ANIMATIONS, + Settings.Global.FASTER_EMERGENCY_PHONE_CALL_ENABLED, Settings.Global.FORCE_ALLOW_ON_EXTERNAL, Settings.Global.FORCED_APP_STANDBY_ENABLED, Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED, diff --git a/packages/SystemUI/res/drawable/faster_emergency_icon.xml b/packages/SystemUI/res/drawable/faster_emergency_icon.xml new file mode 100644 index 000000000000..208ff41eaba4 --- /dev/null +++ b/packages/SystemUI/res/drawable/faster_emergency_icon.xml @@ -0,0 +1,30 @@ +<!-- +Copyright (C) 2018 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- TODO: For demo only, will change content after UI team provide new faster emergency icon. --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24.0dp" + android:height="24.0dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0" + android:tint="?attr/colorControlNormal"> + <path + android:fillColor="#D93025" + android:pathData="M0,0h24v24H0z" /> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19,3H5c-1.1,0-1.99,0.9,-1.99,2L3,19c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V5c0-1.1-0.9-2-2-2zm-1,11h-4v4h-4v-4H6v-4h4V6h4v4h4v4z" /> + +</vector> diff --git a/packages/SystemUI/res/layout/global_actions_wrapped.xml b/packages/SystemUI/res/layout/global_actions_wrapped.xml index b715def73294..7f4e0d21078f 100644 --- a/packages/SystemUI/res/layout/global_actions_wrapped.xml +++ b/packages/SystemUI/res/layout/global_actions_wrapped.xml @@ -3,7 +3,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" + android:layout_gravity="top|right" android:layout_marginBottom="0dp" + android:orientation="vertical" android:paddingTop="@dimen/global_actions_top_padding" android:clipToPadding="false" android:theme="@style/qs_theme" @@ -17,7 +19,19 @@ android:layout_gravity="top|right" android:gravity="center" android:orientation="vertical" - android:padding="12dp" - android:translationZ="9dp" /> + android:padding="@dimen/global_actions_padding" + android:translationZ="@dimen/global_actions_translate" /> + + <!-- For separated button--> + <FrameLayout + android:id="@+id/separated_button" + android:layout_width="@dimen/global_actions_panel_width" + android:layout_height="wrap_content" + android:layout_gravity="top|right" + android:layout_marginTop="6dp" + android:gravity="center" + android:orientation="vertical" + android:padding="@dimen/global_actions_padding" + android:translationZ="@dimen/global_actions_translate" /> </com.android.systemui.HardwareUiLayout> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 3c84e5a91026..be80d52f2a57 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -922,6 +922,10 @@ <dimen name="global_actions_top_padding">120dp</dimen> + <dimen name="global_actions_padding">12dp</dimen> + + <dimen name="global_actions_translate">9dp</dimen> + <!-- The maximum offset in either direction that elements are moved horizontally to prevent burn-in on AOD. --> <dimen name="burn_in_prevention_offset_x">8dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java index 98dc3219acc6..198a4e6cedb8 100644 --- a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java +++ b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java @@ -27,32 +27,33 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.view.ViewTreeObserver; -import android.widget.FrameLayout; import android.widget.LinearLayout; + import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; import com.android.systemui.util.leak.RotationUtils; -import java.util.ArrayList; - import static com.android.systemui.util.leak.RotationUtils.ROTATION_LANDSCAPE; import static com.android.systemui.util.leak.RotationUtils.ROTATION_NONE; import static com.android.systemui.util.leak.RotationUtils.ROTATION_SEASCAPE; -public class HardwareUiLayout extends FrameLayout implements Tunable { +public class HardwareUiLayout extends LinearLayout implements Tunable { private static final String EDGE_BLEED = "sysui_hwui_edge_bleed"; private static final String ROUNDED_DIVIDER = "sysui_hwui_rounded_divider"; private final int[] mTmp2 = new int[2]; - private View mChild; + private View mList; + private View mSeparatedView; private int mOldHeight; private boolean mAnimating; private AnimatorSet mAnimation; private View mDivision; private boolean mHasOutsideTouch; - private HardwareBgDrawable mBackground; + private HardwareBgDrawable mListBackground; + private HardwareBgDrawable mSeparatedViewBackground; private Animator mAnimator; private boolean mCollapse; + private boolean mHasSeparatedButton; private int mEndPoint; private boolean mEdgeBleed; private boolean mRoundedDivider; @@ -91,16 +92,19 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { mRoundedDivider = Settings.Secure.getInt(getContext().getContentResolver(), ROUNDED_DIVIDER, 0) != 0; updateEdgeMargin(mEdgeBleed ? 0 : getEdgePadding()); - mBackground = new HardwareBgDrawable(mRoundedDivider, !mEdgeBleed, getContext()); - if (mChild != null) { - mChild.setBackground(mBackground); + mListBackground = new HardwareBgDrawable(mRoundedDivider, !mEdgeBleed, getContext()); + mSeparatedViewBackground = new HardwareBgDrawable(mRoundedDivider, !mEdgeBleed, + getContext()); + if (mList != null) { + mList.setBackground(mListBackground); + mSeparatedView.setBackground(mSeparatedViewBackground); requestLayout(); } } private void updateEdgeMargin(int edge) { - if (mChild != null) { - MarginLayoutParams params = (MarginLayoutParams) mChild.getLayoutParams(); + if (mList != null) { + MarginLayoutParams params = (MarginLayoutParams) mList.getLayoutParams(); if (mRotation == ROTATION_LANDSCAPE) { params.topMargin = edge; } else if (mRotation == ROTATION_SEASCAPE) { @@ -108,7 +112,19 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { } else { params.rightMargin = edge; } - mChild.setLayoutParams(params); + mList.setLayoutParams(params); + } + + if (mSeparatedView != null) { + MarginLayoutParams params = (MarginLayoutParams) mSeparatedView.getLayoutParams(); + if (mRotation == ROTATION_LANDSCAPE) { + params.topMargin = edge; + } else if (mRotation == ROTATION_SEASCAPE) { + params.bottomMargin = edge; + } else { + params.rightMargin = edge; + } + mSeparatedView.setLayoutParams(params); } } @@ -119,13 +135,15 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (mChild == null) { + if (mList == null) { if (getChildCount() != 0) { - mChild = getChildAt(0); - mChild.setBackground(mBackground); + mList = getChildAt(0); + mList.setBackground(mListBackground); + mSeparatedView = getChildAt(1); + mSeparatedView.setBackground(mSeparatedViewBackground); updateEdgeMargin(mEdgeBleed ? 0 : getEdgePadding()); - mOldHeight = mChild.getMeasuredHeight(); - mChild.addOnLayoutChangeListener( + mOldHeight = mList.getMeasuredHeight(); + mList.addOnLayoutChangeListener( (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> updatePosition()); updateRotation(); @@ -133,7 +151,7 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { return; } } - int newHeight = mChild.getMeasuredHeight(); + int newHeight = mList.getMeasuredHeight(); if (newHeight != mOldHeight) { animateChild(mOldHeight, newHeight); } @@ -170,37 +188,60 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { } else { rotateLeft(); } + if (mHasSeparatedButton) { + if (from == ROTATION_SEASCAPE || to == ROTATION_SEASCAPE) { + // Separated view has top margin, so seascape separated view need special rotation, + // not a full left or right rotation. + swapLeftAndTop(mSeparatedView); + } else if (from == ROTATION_LANDSCAPE) { + rotateRight(mSeparatedView); + } else { + rotateLeft(mSeparatedView); + } + } if (to != ROTATION_NONE) { - if (mChild instanceof LinearLayout) { + if (mList instanceof LinearLayout) { mRotatedBackground = true; - mBackground.setRotatedBackground(true); - LinearLayout linearLayout = (LinearLayout) mChild; + mListBackground.setRotatedBackground(true); + mSeparatedViewBackground.setRotatedBackground(true); + LinearLayout linearLayout = (LinearLayout) mList; if (mSwapOrientation) { linearLayout.setOrientation(LinearLayout.HORIZONTAL); + setOrientation(LinearLayout.HORIZONTAL); } - swapDimens(this.mChild); + swapDimens(mList); + swapDimens(mSeparatedView); } } else { - if (mChild instanceof LinearLayout) { + if (mList instanceof LinearLayout) { mRotatedBackground = false; - mBackground.setRotatedBackground(false); - LinearLayout linearLayout = (LinearLayout) mChild; + mListBackground.setRotatedBackground(false); + mSeparatedViewBackground.setRotatedBackground(false); + LinearLayout linearLayout = (LinearLayout) mList; if (mSwapOrientation) { linearLayout.setOrientation(LinearLayout.VERTICAL); + setOrientation(LinearLayout.VERTICAL); } - swapDimens(mChild); + swapDimens(mList); + swapDimens(mSeparatedView); } } } private void rotateRight() { rotateRight(this); - rotateRight(mChild); + rotateRight(mList); swapDimens(this); - LayoutParams p = (LayoutParams) mChild.getLayoutParams(); + LayoutParams p = (LayoutParams) mList.getLayoutParams(); p.gravity = rotateGravityRight(p.gravity); - mChild.setLayoutParams(p); + mList.setLayoutParams(p); + + LayoutParams separatedViewLayoutParams = (LayoutParams) mSeparatedView.getLayoutParams(); + separatedViewLayoutParams.gravity = rotateGravityRight(separatedViewLayoutParams.gravity); + mSeparatedView.setLayoutParams(separatedViewLayoutParams); + + setGravity(p.gravity); } private void swapDimens(View v) { @@ -247,12 +288,18 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { private void rotateLeft() { rotateLeft(this); - rotateLeft(mChild); + rotateLeft(mList); swapDimens(this); - LayoutParams p = (LayoutParams) mChild.getLayoutParams(); + LayoutParams p = (LayoutParams) mList.getLayoutParams(); p.gravity = rotateGravityLeft(p.gravity); - mChild.setLayoutParams(p); + mList.setLayoutParams(p); + + LayoutParams separatedViewLayoutParams = (LayoutParams) mSeparatedView.getLayoutParams(); + separatedViewLayoutParams.gravity = rotateGravityLeft(separatedViewLayoutParams.gravity); + mSeparatedView.setLayoutParams(separatedViewLayoutParams); + + setGravity(p.gravity); } private int rotateGravityLeft(int gravity) { @@ -310,6 +357,15 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { v.setLayoutParams(params); } + private void swapLeftAndTop(View v) { + v.setPadding(v.getPaddingTop(), v.getPaddingLeft(), v.getPaddingBottom(), + v.getPaddingRight()); + MarginLayoutParams params = (MarginLayoutParams) v.getLayoutParams(); + params.setMargins(params.topMargin, params.leftMargin, params.bottomMargin, + params.rightMargin); + v.setLayoutParams(params); + } + @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); @@ -329,14 +385,14 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { mAnimating = false; } }); - int fromTop = mChild.getTop(); - int fromBottom = mChild.getBottom(); + int fromTop = mList.getTop(); + int fromBottom = mList.getBottom(); int toTop = fromTop - ((newHeight - oldHeight) / 2); int toBottom = fromBottom + ((newHeight - oldHeight) / 2); - ObjectAnimator top = ObjectAnimator.ofInt(mChild, "top", fromTop, toTop); - top.addUpdateListener(animation -> mBackground.invalidateSelf()); + ObjectAnimator top = ObjectAnimator.ofInt(mList, "top", fromTop, toTop); + top.addUpdateListener(animation -> mListBackground.invalidateSelf()); mAnimation.playTogether(top, - ObjectAnimator.ofInt(mChild, "bottom", fromBottom, toBottom)); + ObjectAnimator.ofInt(mList, "bottom", fromBottom, toBottom)); } public void setDivisionView(View v) { @@ -350,26 +406,30 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { } private void updatePosition() { - if (mChild == null) return; + if (mList == null) return; + // If got separated button, setRotatedBackground to false, + // all items won't get white background. + mListBackground.setRotatedBackground(mHasSeparatedButton); + mSeparatedViewBackground.setRotatedBackground(mHasSeparatedButton); if (mDivision != null && mDivision.getVisibility() == VISIBLE) { int index = mRotatedBackground ? 0 : 1; mDivision.getLocationOnScreen(mTmp2); float trans = mRotatedBackground ? mDivision.getTranslationX() : mDivision.getTranslationY(); int viewTop = (int) (mTmp2[index] + trans); - mChild.getLocationOnScreen(mTmp2); + mList.getLocationOnScreen(mTmp2); viewTop -= mTmp2[index]; setCutPoint(viewTop); } else { - setCutPoint(mChild.getMeasuredHeight()); + setCutPoint(mList.getMeasuredHeight()); } } private void setCutPoint(int point) { - int curPoint = mBackground.getCutPoint(); + int curPoint = mListBackground.getCutPoint(); if (curPoint == point) return; if (getAlpha() == 0 || curPoint == 0) { - mBackground.setCutPoint(point); + mListBackground.setCutPoint(point); return; } if (mAnimator != null) { @@ -379,7 +439,7 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { mAnimator.cancel(); } mEndPoint = point; - mAnimator = ObjectAnimator.ofInt(mBackground, "cutPoint", curPoint, point); + mAnimator = ObjectAnimator.ofInt(mListBackground, "cutPoint", curPoint, point); if (mCollapse) { mAnimator.setStartDelay(300); mCollapse = false; @@ -404,6 +464,10 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { mCollapse = true; } + public void setHasSeparatedButton(boolean hasSeparatedButton) { + mHasSeparatedButton = hasSeparatedButton; + } + public static HardwareUiLayout get(View v) { if (v instanceof HardwareUiLayout) return (HardwareUiLayout) v; if (v.getParent() instanceof View) { @@ -413,14 +477,14 @@ public class HardwareUiLayout extends FrameLayout implements Tunable { } private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsListener = inoutInfo -> { - if (mHasOutsideTouch || (mChild == null)) { + if (mHasOutsideTouch || (mList == null)) { inoutInfo.setTouchableInsets( ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME); return; } inoutInfo.setTouchableInsets( ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT); - inoutInfo.contentInsets.set(mChild.getLeft(), mChild.getTop(), - 0, getBottom() - mChild.getBottom()); + inoutInfo.contentInsets.set(mList.getLeft(), mList.getTop(), + 0, getBottom() - mList.getBottom()); }; } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index d232108ded40..532fa034a03b 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -28,12 +28,10 @@ import android.app.WallpaperManager; import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; import android.content.BroadcastReceiver; -import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; -import android.content.ServiceConnection; import android.content.pm.UserInfo; import android.database.ContentObserver; import android.graphics.Point; @@ -42,9 +40,7 @@ import android.media.AudioManager; import android.net.ConnectivityManager; import android.os.Build; import android.os.Handler; -import android.os.IBinder; import android.os.Message; -import android.os.Messenger; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; @@ -68,9 +64,9 @@ import android.view.Window; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; -import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.BaseAdapter; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; @@ -127,6 +123,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, private static final String GLOBAL_ACTION_KEY_ASSIST = "assist"; private static final String GLOBAL_ACTION_KEY_RESTART = "restart"; private static final String GLOBAL_ACTION_KEY_LOGOUT = "logout"; + private static final String GLOBAL_ACTION_KEY_EMERGENCY = "emergency"; private static final String GLOBAL_ACTION_KEY_SCREENSHOT = "screenshot"; private final Context mContext; @@ -149,6 +146,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, private boolean mDeviceProvisioned = false; private ToggleAction.State mAirplaneState = ToggleAction.State.Off; private boolean mIsWaitingForEcmExit = false; + private boolean mHasFasterEmergencyButton; private boolean mHasTelephony; private boolean mHasVibrator; private boolean mHasLogoutButton; @@ -319,6 +317,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, ArraySet<String> addedKeys = new ArraySet<String>(); mHasLogoutButton = false; mHasLockdownButton = false; + mHasFasterEmergencyButton = false; for (int i = 0; i < defaultActions.length; i++) { String actionKey = defaultActions[i]; if (addedKeys.contains(actionKey)) { @@ -357,6 +356,13 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, mItems.add(getAssistAction()); } else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) { mItems.add(new RestartAction()); + } else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) { + if (Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.FASTER_EMERGENCY_PHONE_CALL_ENABLED, 0) != 0 + && !mEmergencyAffordanceManager.needsEmergencyAffordance()) { + mItems.add(new EmergencyAction()); + mHasFasterEmergencyButton = true; + } } else if (GLOBAL_ACTION_KEY_SCREENSHOT.equals(actionKey)) { mItems.add(new ScreenshotAction()); } else if (GLOBAL_ACTION_KEY_LOGOUT.equals(actionKey)) { @@ -386,7 +392,8 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, } return false; }; - ActionsDialog dialog = new ActionsDialog(mContext, this, mAdapter, onItemLongClickListener); + ActionsDialog dialog = new ActionsDialog(mContext, this, mAdapter, onItemLongClickListener, + mHasFasterEmergencyButton); dialog.setCanceledOnTouchOutside(false); // Handled by the custom class. dialog.setKeyguardShowing(mKeyguardShowing); @@ -441,6 +448,33 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, } } + private class EmergencyAction extends SinglePressAction { + private static final String ACTION_EMERGENCY_DIALER_DIAL = + "com.android.phone.EmergencyDialer.DIAL"; + + private EmergencyAction() { + super(com.android.systemui.R.drawable.faster_emergency_icon, + R.string.global_action_emergency); + } + + @Override + public void onPress() { + Intent intent = new Intent(ACTION_EMERGENCY_DIALER_DIAL); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + mContext.startActivityAsUser(intent, UserHandle.CURRENT); + } + + @Override + public boolean showDuringKeyguard() { + return true; + } + + @Override + public boolean showBeforeProvisioning() { + return true; + } + } + private final class RestartAction extends SinglePressAction implements LongPressAction { private RestartAction() { super(R.drawable.ic_restart, R.string.global_action_restart); @@ -1354,15 +1388,17 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final Context mContext; private final MyAdapter mAdapter; private final LinearLayout mListView; + private final FrameLayout mSeparatedView; private final HardwareUiLayout mHardwareLayout; private final OnClickListener mClickListener; private final OnItemLongClickListener mLongClickListener; private final GradientDrawable mGradientDrawable; private final ColorExtractor mColorExtractor; private boolean mKeyguardShowing; + private boolean mShouldDisplaySeparatedButton; public ActionsDialog(Context context, OnClickListener clickListener, MyAdapter adapter, - OnItemLongClickListener longClickListener) { + OnItemLongClickListener longClickListener, boolean shouldDisplaySeparatedButton) { super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions); mContext = context; mAdapter = adapter; @@ -1370,6 +1406,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, mLongClickListener = longClickListener; mGradientDrawable = new GradientDrawable(mContext); mColorExtractor = Dependency.get(SysuiColorExtractor.class); + mShouldDisplaySeparatedButton = shouldDisplaySeparatedButton; // Window initialization Window window = getWindow(); @@ -1393,8 +1430,13 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, setContentView(com.android.systemui.R.layout.global_actions_wrapped); mListView = findViewById(android.R.id.list); + mSeparatedView = findViewById(com.android.systemui.R.id.separated_button); + if (!mShouldDisplaySeparatedButton) { + mSeparatedView.setVisibility(View.GONE); + } mHardwareLayout = HardwareUiLayout.get(mListView); mHardwareLayout.setOutsideTouchListener(view -> dismiss()); + mHardwareLayout.setHasSeparatedButton(mShouldDisplaySeparatedButton); setTitle(R.string.global_actions); mListView.setAccessibilityDelegate(new View.AccessibilityDelegate() { @Override @@ -1409,13 +1451,16 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, private void updateList() { mListView.removeAllViews(); + mSeparatedView.removeAllViews(); for (int i = 0; i < mAdapter.getCount(); i++) { - View v = mAdapter.getView(i, null, mListView); + ViewGroup parentView = mShouldDisplaySeparatedButton && i == mAdapter.getCount() - 1 + ? mSeparatedView : mListView; + View v = mAdapter.getView(i, null, parentView); final int pos = i; v.setOnClickListener(view -> mClickListener.onClick(this, pos)); v.setOnLongClickListener(view -> mLongClickListener.onItemLongClick(null, v, pos, 0)); - mListView.addView(v); + parentView.addView(v); } } |