summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/res/drawable/ic_swap_vert.xml25
-rw-r--r--packages/SystemUI/res/layout/mobile_signal_group.xml4
-rw-r--r--packages/SystemUI/res/layout/qs_footer_impl.xml8
-rw-r--r--packages/SystemUI/src/com/android/keyguard/CarrierText.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java79
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java61
7 files changed, 149 insertions, 67 deletions
diff --git a/packages/SystemUI/res/drawable/ic_swap_vert.xml b/packages/SystemUI/res/drawable/ic_swap_vert.xml
new file mode 100644
index 000000000000..eed79ffa4f2f
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_swap_vert.xml
@@ -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> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml
index b8ed09ee1102..3485b362480f 100644
--- a/packages/SystemUI/res/layout/mobile_signal_group.xml
+++ b/packages/SystemUI/res/layout/mobile_signal_group.xml
@@ -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>
diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml
index 9bf787012dd3..7500bc6a5d44 100644
--- a/packages/SystemUI/res/layout/qs_footer_impl.xml
+++ b/packages/SystemUI/res/layout/qs_footer_impl.xml
@@ -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"
diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierText.java b/packages/SystemUI/src/com/android/keyguard/CarrierText.java
index 45d1aad8d3a4..5b0f1c39f74b 100644
--- a/packages/SystemUI/src/com/android/keyguard/CarrierText.java
+++ b/packages/SystemUI/src/com/android/keyguard/CarrierText.java
@@ -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();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index e9888df74f74..dbf17455bc9e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -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;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index ec4d1a66f7cb..0548e698be33 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -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;
+ }
+
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index 57ff1c32420c..b7a64e1545a8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -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);
}