Merge "Add activity indicator icons to quick settings tiles." into klp-dev

This commit is contained in:
John Spurlock
2013-09-11 14:50:08 +00:00
committed by Android (Google) Code Review
41 changed files with 155 additions and 25 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -13,32 +13,49 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--> -->
<LinearLayout <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="top" android:layout_gravity="top">
android:orientation="vertical">
<FrameLayout <FrameLayout
android:id="@+id/rssi_images"
android:layout_marginTop="@dimen/qs_tile_margin_above_icon" android:layout_marginTop="@dimen/qs_tile_margin_above_icon"
android:layout_marginBottom="@dimen/qs_tile_margin_below_icon" android:layout_marginBottom="@dimen/qs_tile_margin_below_icon"
android:layout_width="@dimen/qs_tile_icon_size" android:layout_width="@dimen/qs_tile_icon_size"
android:layout_height="@dimen/qs_tile_icon_size" android:layout_height="@dimen/qs_tile_icon_size"
android:layout_gravity="top|center_horizontal" android:layout_gravity="top|center_horizontal"
android:layout_centerHorizontal="true"
> >
<ImageView <ImageView
android:id="@+id/rssi_image" android:id="@+id/rssi_image"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_centerInParent="true"
/> />
<ImageView <ImageView
android:id="@+id/rssi_overlay_image" android:id="@+id/rssi_overlay_image"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_centerInParent="true"
/> />
</FrameLayout> </FrameLayout>
<ImageView
android:id="@+id/activity_in"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_qs_signal_in"
android:layout_toRightOf="@id/rssi_images"
android:layout_alignBottom="@id/rssi_images"
/>
<ImageView
android:id="@+id/activity_out"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_qs_signal_out"
android:layout_toRightOf="@id/rssi_images"
android:layout_alignBottom="@id/rssi_images"
/>
<TextView <TextView
style="@style/TextAppearance.QuickSettings.TileView" style="@style/TextAppearance.QuickSettings.TileView"
android:id="@+id/rssi_textview" android:id="@+id/rssi_textview"
@ -47,5 +64,7 @@
android:layout_gravity="top|center_horizontal" android:layout_gravity="top|center_horizontal"
android:gravity="top|center_horizontal" android:gravity="top|center_horizontal"
android:text="@string/quick_settings_rssi_label" android:text="@string/quick_settings_rssi_label"
android:layout_centerHorizontal="true"
android:layout_below="@id/rssi_images"
/> />
</LinearLayout> </RelativeLayout>

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 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.
-->
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top">
<ImageView
android:id="@+id/image"
android:layout_marginTop="@dimen/qs_tile_margin_above_icon"
android:layout_marginBottom="@dimen/qs_tile_margin_below_icon"
android:layout_width="@dimen/qs_tile_icon_size"
android:layout_height="@dimen/qs_tile_icon_size"
android:layout_gravity="top|center_horizontal"
android:layout_centerHorizontal="true"
android:scaleType="centerInside"
/>
<ImageView
android:id="@+id/activity_in"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_qs_wifi_in"
android:layout_toRightOf="@id/image"
android:layout_alignBottom="@id/image"
/>
<ImageView
android:id="@+id/activity_out"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_qs_wifi_out"
android:layout_toRightOf="@id/image"
android:layout_alignBottom="@id/image"
/>
<TextView
style="@style/TextAppearance.QuickSettings.TileView"
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top|center_horizontal"
android:gravity="top|center_horizontal"
android:layout_centerHorizontal="true"
android:layout_below="@id/image"
/>
</RelativeLayout>

View File

@ -16,6 +16,7 @@
package com.android.systemui.statusbar.phone; package com.android.systemui.statusbar.phone;
import android.animation.ValueAnimator;
import android.app.ActivityManagerNative; import android.app.ActivityManagerNative;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
@ -62,6 +63,7 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.statusbar.phone.QuickSettingsModel.ActivityState;
import com.android.systemui.statusbar.phone.QuickSettingsModel.BluetoothState; import com.android.systemui.statusbar.phone.QuickSettingsModel.BluetoothState;
import com.android.systemui.statusbar.phone.QuickSettingsModel.RSSIState; import com.android.systemui.statusbar.phone.QuickSettingsModel.RSSIState;
import com.android.systemui.statusbar.phone.QuickSettingsModel.State; import com.android.systemui.statusbar.phone.QuickSettingsModel.State;
@ -401,8 +403,9 @@ class QuickSettings {
private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) { private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) {
// Wi-fi // Wi-fi
final QuickSettingsBasicTile wifiTile final QuickSettingsTileView wifiTile = (QuickSettingsTileView)
= new QuickSettingsBasicTile(mContext); inflater.inflate(R.layout.quick_settings_tile, parent, false);
wifiTile.setContent(R.layout.quick_settings_tile_wifi, inflater);
wifiTile.setOnClickListener(new View.OnClickListener() { wifiTile.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -433,12 +436,15 @@ class QuickSettings {
return true; return true;
}} ); }} );
} }
mModel.addWifiTile(wifiTile, new QuickSettingsModel.RefreshCallback() { mModel.addWifiTile(wifiTile, new NetworkActivityCallback() {
@Override @Override
public void refreshView(QuickSettingsTileView unused, State state) { public void refreshView(QuickSettingsTileView view, State state) {
WifiState wifiState = (WifiState) state; WifiState wifiState = (WifiState) state;
wifiTile.setImageResource(wifiState.iconId); ImageView iv = (ImageView) view.findViewById(R.id.image);
wifiTile.setText(wifiState.label); iv.setImageResource(wifiState.iconId);
setActivity(view, wifiState);
TextView tv = (TextView) view.findViewById(R.id.text);
tv.setText(wifiState.label);
wifiTile.setContentDescription(mContext.getString( wifiTile.setContentDescription(mContext.getString(
R.string.accessibility_quick_settings_wifi, R.string.accessibility_quick_settings_wifi,
wifiState.signalContentDescription, wifiState.signalContentDescription,
@ -462,7 +468,7 @@ class QuickSettings {
startSettingsActivity(intent); startSettingsActivity(intent);
} }
}); });
mModel.addRSSITile(rssiTile, new QuickSettingsModel.RefreshCallback() { mModel.addRSSITile(rssiTile, new NetworkActivityCallback() {
@Override @Override
public void refreshView(QuickSettingsTileView view, State state) { public void refreshView(QuickSettingsTileView view, State state) {
RSSIState rssiState = (RSSIState) state; RSSIState rssiState = (RSSIState) state;
@ -478,6 +484,8 @@ class QuickSettings {
} else { } else {
iov.setImageDrawable(null); iov.setImageDrawable(null);
} }
setActivity(view, rssiState);
tv.setText(state.label); tv.setText(state.label);
view.setContentDescription(mContext.getResources().getString( view.setContentDescription(mContext.getResources().getString(
R.string.accessibility_quick_settings_mobile, R.string.accessibility_quick_settings_mobile,
@ -942,4 +950,25 @@ class QuickSettings {
} }
}; };
private abstract static class NetworkActivityCallback
implements QuickSettingsModel.RefreshCallback {
private final long mDefaultDuration = new ValueAnimator().getDuration();
private final long mShortDuration = mDefaultDuration / 3;
public void setActivity(View view, ActivityState state) {
setVisibility(view.findViewById(R.id.activity_in), state.activityIn);
setVisibility(view.findViewById(R.id.activity_out), state.activityOut);
}
private void setVisibility(View view, boolean visible) {
final float newAlpha = visible ? 1 : 0;
if (view.getAlpha() != newAlpha) {
view.animate()
.setDuration(visible ? mShortDuration : mDefaultDuration)
.alpha(newAlpha)
.start();
}
}
}
} }

View File

@ -70,13 +70,17 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
int batteryLevel; int batteryLevel;
boolean pluggedIn; boolean pluggedIn;
} }
static class RSSIState extends State { static class ActivityState extends State {
boolean activityIn;
boolean activityOut;
}
static class RSSIState extends ActivityState {
int signalIconId; int signalIconId;
String signalContentDescription; String signalContentDescription;
int dataTypeIconId; int dataTypeIconId;
String dataContentDescription; String dataContentDescription;
} }
static class WifiState extends State { static class WifiState extends ActivityState {
String signalContentDescription; String signalContentDescription;
boolean connected; boolean connected;
} }
@ -430,6 +434,7 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
// NetworkSignalChanged callback // NetworkSignalChanged callback
@Override @Override
public void onWifiSignalChanged(boolean enabled, int wifiSignalIconId, public void onWifiSignalChanged(boolean enabled, int wifiSignalIconId,
boolean activityIn, boolean activityOut,
String wifiSignalContentDescription, String enabledDesc) { String wifiSignalContentDescription, String enabledDesc) {
// TODO: If view is in awaiting state, disable // TODO: If view is in awaiting state, disable
Resources r = mContext.getResources(); Resources r = mContext.getResources();
@ -438,6 +443,8 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
boolean wifiNotConnected = (wifiSignalIconId > 0) && (enabledDesc == null); boolean wifiNotConnected = (wifiSignalIconId > 0) && (enabledDesc == null);
mWifiState.enabled = enabled; mWifiState.enabled = enabled;
mWifiState.connected = wifiConnected; mWifiState.connected = wifiConnected;
mWifiState.activityIn = enabled && activityIn;
mWifiState.activityOut = enabled && activityOut;
if (wifiConnected) { if (wifiConnected) {
mWifiState.iconId = wifiSignalIconId; mWifiState.iconId = wifiSignalIconId;
mWifiState.label = removeDoubleQuotes(enabledDesc); mWifiState.label = removeDoubleQuotes(enabledDesc);
@ -468,7 +475,8 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
@Override @Override
public void onMobileDataSignalChanged( public void onMobileDataSignalChanged(
boolean enabled, int mobileSignalIconId, String signalContentDescription, boolean enabled, int mobileSignalIconId, String signalContentDescription,
int dataTypeIconId, String dataContentDescription, String enabledDesc) { int dataTypeIconId, boolean activityIn, boolean activityOut,
String dataContentDescription,String enabledDesc) {
if (deviceHasMobileData()) { if (deviceHasMobileData()) {
// TODO: If view is in awaiting state, disable // TODO: If view is in awaiting state, disable
Resources r = mContext.getResources(); Resources r = mContext.getResources();
@ -481,6 +489,8 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
mRSSIState.dataTypeIconId = enabled && (dataTypeIconId > 0) && !mWifiState.enabled mRSSIState.dataTypeIconId = enabled && (dataTypeIconId > 0) && !mWifiState.enabled
? dataTypeIconId ? dataTypeIconId
: 0; : 0;
mRSSIState.activityIn = enabled && activityIn;
mRSSIState.activityOut = enabled && activityOut;
mRSSIState.dataContentDescription = enabled && (dataTypeIconId > 0) && !mWifiState.enabled mRSSIState.dataContentDescription = enabled && (dataTypeIconId > 0) && !mWifiState.enabled
? dataContentDescription ? dataContentDescription
: r.getString(R.string.accessibility_no_data); : r.getString(R.string.accessibility_no_data);

View File

@ -165,9 +165,11 @@ public class NetworkController extends BroadcastReceiver implements DemoMode {
public interface NetworkSignalChangedCallback { public interface NetworkSignalChangedCallback {
void onWifiSignalChanged(boolean enabled, int wifiSignalIconId, void onWifiSignalChanged(boolean enabled, int wifiSignalIconId,
String wifitSignalContentDescriptionId, String description); boolean activityIn, boolean activityOut,
String wifiSignalContentDescriptionId, String description);
void onMobileDataSignalChanged(boolean enabled, int mobileSignalIconId, void onMobileDataSignalChanged(boolean enabled, int mobileSignalIconId,
String mobileSignalContentDescriptionId, int dataTypeIconId, String mobileSignalContentDescriptionId, int dataTypeIconId,
boolean activityIn, boolean activityOut,
String dataTypeContentDescriptionId, String description); String dataTypeContentDescriptionId, String description);
void onAirplaneModeChanged(boolean enabled); void onAirplaneModeChanged(boolean enabled);
} }
@ -313,22 +315,33 @@ public class NetworkController extends BroadcastReceiver implements DemoMode {
boolean wifiEnabled = mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature); boolean wifiEnabled = mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature);
String wifiDesc = wifiEnabled ? String wifiDesc = wifiEnabled ?
mWifiSsid : null; mWifiSsid : null;
cb.onWifiSignalChanged(wifiEnabled, mQSWifiIconId, mContentDescriptionWifi, wifiDesc); boolean wifiIn = wifiEnabled && mWifiSsid != null
&& (mWifiActivity == WifiManager.DATA_ACTIVITY_INOUT
|| mWifiActivity == WifiManager.DATA_ACTIVITY_IN);
boolean wifiOut = wifiEnabled && mWifiSsid != null
&& (mWifiActivity == WifiManager.DATA_ACTIVITY_INOUT
|| mWifiActivity == WifiManager.DATA_ACTIVITY_OUT);
cb.onWifiSignalChanged(wifiEnabled, mQSWifiIconId, wifiIn, wifiOut,
mContentDescriptionWifi, wifiDesc);
boolean mobileIn = mDataConnected && (mDataActivity == TelephonyManager.DATA_ACTIVITY_INOUT
|| mDataActivity == TelephonyManager.DATA_ACTIVITY_IN);
boolean mobileOut = mDataConnected && (mDataActivity == TelephonyManager.DATA_ACTIVITY_INOUT
|| mDataActivity == TelephonyManager.DATA_ACTIVITY_OUT);
if (isEmergencyOnly()) { if (isEmergencyOnly()) {
cb.onMobileDataSignalChanged(false, mQSPhoneSignalIconId, cb.onMobileDataSignalChanged(false, mQSPhoneSignalIconId,
mContentDescriptionPhoneSignal, mQSDataTypeIconId, mContentDescriptionDataType, mContentDescriptionPhoneSignal, mQSDataTypeIconId, mobileIn, mobileOut,
null); mContentDescriptionDataType, null);
} else { } else {
if (mIsWimaxEnabled && mWimaxConnected) { if (mIsWimaxEnabled && mWimaxConnected) {
// Wimax is special // Wimax is special
cb.onMobileDataSignalChanged(true, mQSPhoneSignalIconId, cb.onMobileDataSignalChanged(true, mQSPhoneSignalIconId,
mContentDescriptionPhoneSignal, mQSDataTypeIconId, mContentDescriptionPhoneSignal, mQSDataTypeIconId, mobileIn, mobileOut,
mContentDescriptionDataType, mNetworkName); mContentDescriptionDataType, mNetworkName);
} else { } else {
// Normal mobile data // Normal mobile data
cb.onMobileDataSignalChanged(mHasMobileDataFeature, mQSPhoneSignalIconId, cb.onMobileDataSignalChanged(mHasMobileDataFeature, mQSPhoneSignalIconId,
mContentDescriptionPhoneSignal, mQSDataTypeIconId, mContentDescriptionPhoneSignal, mQSDataTypeIconId, mobileIn, mobileOut,
mContentDescriptionDataType, mNetworkName); mContentDescriptionDataType, mNetworkName);
} }
} }
@ -1125,6 +1138,11 @@ public class NetworkController extends BroadcastReceiver implements DemoMode {
+ " mBluetoothTetherIconId=0x" + Integer.toHexString(mBluetoothTetherIconId)); + " mBluetoothTetherIconId=0x" + Integer.toHexString(mBluetoothTetherIconId));
} }
// update QS
for (NetworkSignalChangedCallback cb : mSignalsChangedCallbacks) {
notifySignalsChangedCallbacks(cb);
}
if (mLastPhoneSignalIconId != mPhoneSignalIconId if (mLastPhoneSignalIconId != mPhoneSignalIconId
|| mLastWifiIconId != mWifiIconId || mLastWifiIconId != mWifiIconId
|| mLastWimaxIconId != mWimaxIconId || mLastWimaxIconId != mWimaxIconId
@ -1136,9 +1154,6 @@ public class NetworkController extends BroadcastReceiver implements DemoMode {
for (SignalCluster cluster : mSignalClusters) { for (SignalCluster cluster : mSignalClusters) {
refreshSignalCluster(cluster); refreshSignalCluster(cluster);
} }
for (NetworkSignalChangedCallback cb : mSignalsChangedCallbacks) {
notifySignalsChangedCallbacks(cb);
}
} }
if (mLastAirplaneMode != mAirplaneMode) { if (mLastAirplaneMode != mAirplaneMode) {