resolve merge conflicts of e58c780571 to stage-aosp-master
Bug: None Test: I solemnly swear I tested this conflict resolution. Change-Id: I6d2feec990c23fb3536fc6b3e19c0b2696b81441 Merged-In: I9c920e31433c0ac23165f917d8dd2befaaa4938d Merged-In: I8e6bb72ce7b8cecdb6bd01150b53f61f1515dbb1 Merged-In: Ic08cabc63daebc4001c8eda751857d11cb0e6352
This commit is contained in:
@@ -11319,6 +11319,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
30
packages/SystemUI/res/drawable/faster_emergency_icon.xml
Normal file
30
packages/SystemUI/res/drawable/faster_emergency_icon.xml
Normal file
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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());
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user