diff options
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); } |