Merge "Move mobile signal indicator to QS footer." into pi-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
75a81749f3
25
packages/SystemUI/res/drawable/ic_swap_vert.xml
Normal file
25
packages/SystemUI/res/drawable/ic_swap_vert.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3L5 6.99h3V14h2V6.99h3L9 3z" />
|
||||
</vector>
|
||||
@@ -16,7 +16,7 @@
|
||||
** limitations under the License.
|
||||
*/
|
||||
-->
|
||||
<LinearLayout
|
||||
<com.android.keyguard.AlphaOptimizedLinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:systemui="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/mobile_combo"
|
||||
@@ -79,4 +79,4 @@
|
||||
android:contentDescription="@string/data_connection_roaming"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
</LinearLayout>
|
||||
</com.android.keyguard.AlphaOptimizedLinearLayout>
|
||||
|
||||
@@ -43,6 +43,14 @@
|
||||
android:layout_gravity="center_vertical"
|
||||
android:gravity="end" >
|
||||
|
||||
<include
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|start"
|
||||
android:layout_margin="15dp"
|
||||
android:visibility="gone"
|
||||
layout="@layout/mobile_signal_group" />
|
||||
|
||||
<com.android.keyguard.CarrierText
|
||||
android:id="@+id/qs_carrier_text"
|
||||
android:layout_width="0dp"
|
||||
|
||||
@@ -39,9 +39,15 @@ import com.android.internal.telephony.IccCardConstants;
|
||||
import com.android.internal.telephony.IccCardConstants.State;
|
||||
import com.android.internal.telephony.TelephonyIntents;
|
||||
import com.android.settingslib.WirelessUtils;
|
||||
|
||||
import android.telephony.TelephonyManager;
|
||||
|
||||
public class CarrierText extends TextView {
|
||||
/** Do not show missing sim message. */
|
||||
public static final int FLAG_HIDE_MISSING_SIM = 1 << 0;
|
||||
/** Do not show airplane mode message. */
|
||||
public static final int FLAG_HIDE_AIRPLANE_MODE = 1 << 1;
|
||||
|
||||
private static final boolean DEBUG = KeyguardConstants.DEBUG;
|
||||
private static final String TAG = "CarrierText";
|
||||
|
||||
@@ -55,6 +61,8 @@ public class CarrierText extends TextView {
|
||||
|
||||
private boolean[] mSimErrorState = new boolean[TelephonyManager.getDefault().getPhoneCount()];
|
||||
|
||||
private int mFlags;
|
||||
|
||||
private KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
|
||||
@Override
|
||||
public void onRefreshCarrierInfo() {
|
||||
@@ -85,6 +93,11 @@ public class CarrierText extends TextView {
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
public void setDisplayFlags(int flags) {
|
||||
mFlags = flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* The status of this lock screen. Primarily used for widgets on LockScreen.
|
||||
*/
|
||||
@@ -196,8 +209,7 @@ public class CarrierText extends TextView {
|
||||
// Grab the first subscripton, because they all should contain the emergency text,
|
||||
// described above.
|
||||
displayText = makeCarrierStringOnEmergencyCapable(
|
||||
getContext().getText(R.string.keyguard_missing_sim_message_short),
|
||||
subs.get(0).getCarrierName());
|
||||
getMissingSimMessage(), subs.get(0).getCarrierName());
|
||||
} else {
|
||||
// We don't have a SubscriptionInfo to get the emergency calls only from.
|
||||
// Grab it from the old sticky broadcast if possible instead. We can use it
|
||||
@@ -223,8 +235,7 @@ public class CarrierText extends TextView {
|
||||
text = concatenate(plmn, spn);
|
||||
}
|
||||
}
|
||||
displayText = makeCarrierStringOnEmergencyCapable(
|
||||
getContext().getText(R.string.keyguard_missing_sim_message_short), text);
|
||||
displayText = makeCarrierStringOnEmergencyCapable(getMissingSimMessage(), text);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -232,11 +243,21 @@ public class CarrierText extends TextView {
|
||||
// APM (airplane mode) != no carrier state. There are carrier services
|
||||
// (e.g. WFC = Wi-Fi calling) which may operate in APM.
|
||||
if (!anySimReadyAndInService && WirelessUtils.isAirplaneModeOn(mContext)) {
|
||||
displayText = getContext().getString(R.string.airplane_mode);
|
||||
displayText = getAirplaneModeMessage();
|
||||
}
|
||||
setText(displayText);
|
||||
}
|
||||
|
||||
private String getMissingSimMessage() {
|
||||
return (mFlags & FLAG_HIDE_MISSING_SIM) == 0
|
||||
? getContext().getString(R.string.keyguard_missing_sim_message_short) : "";
|
||||
}
|
||||
|
||||
private String getAirplaneModeMessage() {
|
||||
return (mFlags & FLAG_HIDE_AIRPLANE_MODE) == 0
|
||||
? getContext().getString(R.string.airplane_mode) : "";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
|
||||
@@ -20,6 +20,7 @@ import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.PorterDuff.Mode;
|
||||
import android.graphics.drawable.Drawable;
|
||||
@@ -27,6 +28,7 @@ import android.graphics.drawable.RippleDrawable;
|
||||
import android.os.UserManager;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
@@ -36,15 +38,18 @@ import android.widget.Toast;
|
||||
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.keyguard.CarrierText;
|
||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||
import com.android.settingslib.Utils;
|
||||
import com.android.settingslib.drawable.UserIconDrawable;
|
||||
import com.android.settingslib.graph.SignalDrawable;
|
||||
import com.android.systemui.Dependency;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.R.dimen;
|
||||
import com.android.systemui.SysUiServiceProvider;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.qs.TouchAnimator.Builder;
|
||||
import com.android.systemui.qs.tileimpl.QSTileImpl;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.phone.MultiUserSwitch;
|
||||
import com.android.systemui.statusbar.phone.SettingsButton;
|
||||
@@ -64,7 +69,7 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
|
||||
private UserInfoController mUserInfoController;
|
||||
private SettingsButton mSettingsButton;
|
||||
protected View mSettingsContainer;
|
||||
private View mCarrierText;
|
||||
private CarrierText mCarrierText;
|
||||
|
||||
private boolean mQsDisabled;
|
||||
private QSPanel mQsPanel;
|
||||
@@ -86,9 +91,15 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
|
||||
|
||||
private View mActionsContainer;
|
||||
private View mDragHandle;
|
||||
private View mMobileGroup;
|
||||
private ImageView mMobileSignal;
|
||||
private ImageView mMobileRoaming;
|
||||
private final int mColorForeground;
|
||||
private final CellSignalState mInfo = new CellSignalState();
|
||||
|
||||
public QSFooterImpl(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
mColorForeground = Utils.getColorAttr(context, android.R.attr.colorForeground);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -104,7 +115,12 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
|
||||
mSettingsContainer = findViewById(R.id.settings_button_container);
|
||||
mSettingsButton.setOnClickListener(this);
|
||||
|
||||
mMobileGroup = findViewById(R.id.mobile_combo);
|
||||
mMobileSignal = findViewById(R.id.mobile_signal);
|
||||
mMobileRoaming = findViewById(R.id.mobile_roaming);
|
||||
mCarrierText = findViewById(R.id.qs_carrier_text);
|
||||
mCarrierText.setDisplayFlags(
|
||||
CarrierText.FLAG_HIDE_AIRPLANE_MODE | CarrierText.FLAG_HIDE_MISSING_SIM);
|
||||
|
||||
mMultiUserSwitch = findViewById(R.id.multi_user_switch);
|
||||
mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar);
|
||||
@@ -165,6 +181,7 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
|
||||
return new TouchAnimator.Builder()
|
||||
.addFloat(mDivider, "alpha", 0, 1)
|
||||
.addFloat(mCarrierText, "alpha", 0, 0, 1)
|
||||
.addFloat(mMobileGroup, "alpha", 0, 1)
|
||||
.addFloat(mActionsContainer, "alpha", 0, 1)
|
||||
.addFloat(mDragHandle, "alpha", 1, 0, 0)
|
||||
.setStartDelay(0.15f)
|
||||
@@ -338,4 +355,64 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
|
||||
}
|
||||
mMultiUserAvatar.setImageDrawable(picture);
|
||||
}
|
||||
|
||||
private void handleUpdateState() {
|
||||
mMobileGroup.setVisibility(mInfo.visible ? View.VISIBLE : View.GONE);
|
||||
if (mInfo.visible) {
|
||||
mMobileRoaming.setVisibility(mInfo.roaming ? View.VISIBLE : View.GONE);
|
||||
mMobileRoaming.setImageTintList(ColorStateList.valueOf(mColorForeground));
|
||||
SignalDrawable d = new SignalDrawable(mContext);
|
||||
d.setDarkIntensity(QuickStatusBarHeader.getColorIntensity(mColorForeground));
|
||||
mMobileSignal.setImageDrawable(d);
|
||||
mMobileSignal.setImageLevel(mInfo.mobileSignalIconId);
|
||||
|
||||
StringBuilder contentDescription = new StringBuilder();
|
||||
if (mInfo.contentDescription != null) {
|
||||
contentDescription.append(mInfo.contentDescription).append(", ");
|
||||
}
|
||||
if (mInfo.roaming) {
|
||||
contentDescription
|
||||
.append(mContext.getString(R.string.data_connection_roaming))
|
||||
.append(", ");
|
||||
}
|
||||
// TODO: show mobile data off/no internet text for 5 seconds before carrier text
|
||||
if (TextUtils.equals(mInfo.typeContentDescription,
|
||||
mContext.getString(R.string.data_connection_no_internet))
|
||||
|| TextUtils.equals(mInfo.typeContentDescription,
|
||||
mContext.getString(R.string.cell_data_off))) {
|
||||
contentDescription.append(mInfo.typeContentDescription);
|
||||
}
|
||||
mMobileSignal.setContentDescription(contentDescription);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMobileDataIndicators(NetworkController.IconState statusIcon,
|
||||
NetworkController.IconState qsIcon, int statusType,
|
||||
int qsType, boolean activityIn, boolean activityOut,
|
||||
String typeContentDescription,
|
||||
String description, boolean isWide, int subId, boolean roaming) {
|
||||
mInfo.visible = statusIcon.visible;
|
||||
mInfo.mobileSignalIconId = statusIcon.icon;
|
||||
mInfo.contentDescription = statusIcon.contentDescription;
|
||||
mInfo.typeContentDescription = typeContentDescription;
|
||||
mInfo.roaming = roaming;
|
||||
handleUpdateState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNoSims(boolean hasNoSims, boolean simDetected) {
|
||||
if (hasNoSims) {
|
||||
mInfo.visible = false;
|
||||
}
|
||||
handleUpdateState();
|
||||
}
|
||||
|
||||
private final class CellSignalState {
|
||||
boolean visible;
|
||||
int mobileSignalIconId;
|
||||
public String contentDescription;
|
||||
String typeContentDescription;
|
||||
boolean roaming;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.annotation.ColorInt;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.AlarmManager;
|
||||
import android.content.Context;
|
||||
@@ -128,7 +129,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue
|
||||
|
||||
Rect tintArea = new Rect(0, 0, 0, 0);
|
||||
int colorForeground = Utils.getColorAttr(getContext(), android.R.attr.colorForeground);
|
||||
float intensity = colorForeground == Color.WHITE ? 0 : 1;
|
||||
float intensity = getColorIntensity(colorForeground);
|
||||
int fillColor = fillColorForIntensity(intensity, getContext());
|
||||
|
||||
// Set light text on the header icons because they will always be on a black background
|
||||
@@ -443,4 +444,9 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue
|
||||
.getBestDateTimePattern(Locale.getDefault(), skeleton);
|
||||
return android.text.format.DateFormat.format(pattern, info.getTriggerTime()).toString();
|
||||
}
|
||||
|
||||
public static float getColorIntensity(@ColorInt int color) {
|
||||
return color == Color.WHITE ? 0 : 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,12 +18,9 @@ package com.android.systemui.qs.tiles;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.AlertDialog.Builder;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Resources;
|
||||
import android.os.SystemProperties;
|
||||
import android.provider.Settings;
|
||||
import android.service.quicksettings.Tile;
|
||||
import android.text.TextUtils;
|
||||
@@ -32,6 +29,7 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager.LayoutParams;
|
||||
import android.widget.Switch;
|
||||
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settingslib.net.DataUsageController;
|
||||
@@ -43,7 +41,6 @@ import com.android.systemui.plugins.qs.DetailAdapter;
|
||||
import com.android.systemui.plugins.qs.QSIconView;
|
||||
import com.android.systemui.plugins.qs.QSTile.SignalState;
|
||||
import com.android.systemui.qs.CellTileView;
|
||||
import com.android.systemui.qs.CellTileView.SignalIcon;
|
||||
import com.android.systemui.qs.QSHost;
|
||||
import com.android.systemui.qs.tileimpl.QSTileImpl;
|
||||
import com.android.systemui.statusbar.phone.SystemUIDialog;
|
||||
@@ -159,31 +156,15 @@ public class CellularTile extends QSTileImpl<SignalState> {
|
||||
final Resources r = mContext.getResources();
|
||||
state.activityIn = cb.enabled && cb.activityIn;
|
||||
state.activityOut = cb.enabled && cb.activityOut;
|
||||
state.isOverlayIconWide = cb.isDataTypeIconWide;
|
||||
state.overlayIconId = cb.dataTypeIconId;
|
||||
|
||||
state.label = r.getString(R.string.mobile_data);
|
||||
|
||||
final String signalContentDesc = cb.enabled && (cb.mobileSignalIconId > 0)
|
||||
? cb.signalContentDescription
|
||||
: r.getString(R.string.accessibility_no_signal);
|
||||
boolean mobileDataEnabled = mDataController.isMobileDataSupported()
|
||||
&& mDataController.isMobileDataEnabled();
|
||||
state.value = mobileDataEnabled;
|
||||
if (cb.noSim) {
|
||||
state.contentDescription = state.label;
|
||||
} else {
|
||||
state.contentDescription = signalContentDesc + ", " + state.label;
|
||||
}
|
||||
|
||||
state.expandedAccessibilityClassName = Switch.class.getName();
|
||||
state.value = mDataController.isMobileDataSupported()
|
||||
&& mDataController.isMobileDataEnabled();
|
||||
|
||||
if (cb.noSim) {
|
||||
state.icon = ResourceIcon.get(R.drawable.ic_qs_no_sim);
|
||||
} else {
|
||||
state.icon = new SignalIcon(cb.mobileSignalIconId);
|
||||
state.icon = ResourceIcon.get(R.drawable.ic_swap_vert);
|
||||
}
|
||||
|
||||
if (cb.noSim) {
|
||||
@@ -199,6 +180,7 @@ public class CellularTile extends QSTileImpl<SignalState> {
|
||||
state.state = Tile.STATE_INACTIVE;
|
||||
state.secondaryLabel = r.getString(R.string.cell_data_off);
|
||||
}
|
||||
state.contentDescription = state.label + ", " + state.secondaryLabel;
|
||||
}
|
||||
|
||||
private CharSequence getMobileDataDescription(CallbackInfo cb) {
|
||||
@@ -223,40 +205,18 @@ public class CellularTile extends QSTileImpl<SignalState> {
|
||||
return mController.hasMobileDataFeature();
|
||||
}
|
||||
|
||||
// Remove the period from the network name
|
||||
public static String removeTrailingPeriod(String string) {
|
||||
if (string == null) return null;
|
||||
final int length = string.length();
|
||||
if (string.endsWith(".")) {
|
||||
return string.substring(0, length - 1);
|
||||
}
|
||||
return string;
|
||||
}
|
||||
|
||||
private static final class CallbackInfo {
|
||||
boolean enabled;
|
||||
boolean wifiEnabled;
|
||||
boolean airplaneModeEnabled;
|
||||
int mobileSignalIconId;
|
||||
String signalContentDescription;
|
||||
int dataTypeIconId;
|
||||
String dataContentDescription;
|
||||
boolean activityIn;
|
||||
boolean activityOut;
|
||||
String enabledDesc;
|
||||
boolean noSim;
|
||||
boolean isDataTypeIconWide;
|
||||
boolean roaming;
|
||||
}
|
||||
|
||||
private final class CellSignalCallback implements SignalCallback {
|
||||
private final CallbackInfo mInfo = new CallbackInfo();
|
||||
@Override
|
||||
public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
|
||||
boolean activityIn, boolean activityOut, String description, boolean isTransient) {
|
||||
mInfo.wifiEnabled = enabled;
|
||||
refreshState(mInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
|
||||
@@ -267,14 +227,9 @@ public class CellularTile extends QSTileImpl<SignalState> {
|
||||
return;
|
||||
}
|
||||
mInfo.enabled = qsIcon.visible;
|
||||
mInfo.mobileSignalIconId = qsIcon.icon;
|
||||
mInfo.signalContentDescription = qsIcon.contentDescription;
|
||||
mInfo.dataTypeIconId = qsType;
|
||||
mInfo.dataContentDescription = typeContentDescription;
|
||||
mInfo.activityIn = activityIn;
|
||||
mInfo.activityOut = activityOut;
|
||||
mInfo.enabledDesc = description;
|
||||
mInfo.isDataTypeIconWide = qsType != 0 && isWide;
|
||||
mInfo.roaming = roaming;
|
||||
refreshState(mInfo);
|
||||
}
|
||||
@@ -282,16 +237,6 @@ public class CellularTile extends QSTileImpl<SignalState> {
|
||||
@Override
|
||||
public void setNoSims(boolean show, boolean simDetected) {
|
||||
mInfo.noSim = show;
|
||||
if (mInfo.noSim) {
|
||||
// Make sure signal gets cleared out when no sims.
|
||||
mInfo.mobileSignalIconId = 0;
|
||||
mInfo.dataTypeIconId = 0;
|
||||
// Show a No SIMs description to avoid emergency calls message.
|
||||
mInfo.enabled = true;
|
||||
mInfo.enabledDesc = mContext.getString(
|
||||
R.string.keyguard_missing_sim_message_short);
|
||||
mInfo.signalContentDescription = mInfo.enabledDesc;
|
||||
}
|
||||
refreshState(mInfo);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user