am 7938feef: am 52277428: Merge "Integrate remote display providers into Quick Settings." into klp-dev

* commit '7938feef5abd003bf54efa4f862f995856305e44':
  Integrate remote display providers into Quick Settings.
This commit is contained in:
Jeff Brown
2013-11-07 17:44:17 -08:00
committed by Android Git Automerger
4 changed files with 172 additions and 56 deletions

View File

@ -490,10 +490,8 @@
<string name="quick_settings_wifi_no_network">No Network</string> <string name="quick_settings_wifi_no_network">No Network</string>
<!-- QuickSettings: Wifi (Off) [CHAR LIMIT=NONE] --> <!-- QuickSettings: Wifi (Off) [CHAR LIMIT=NONE] -->
<string name="quick_settings_wifi_off_label">Wi-Fi Off</string> <string name="quick_settings_wifi_off_label">Wi-Fi Off</string>
<!-- QuickSettings: Wifi display [CHAR LIMIT=NONE] --> <!-- QuickSettings: Remote display [CHAR LIMIT=NONE] -->
<string name="quick_settings_wifi_display_label">Wi-Fi Display</string> <string name="quick_settings_remote_display_no_connection_label">Cast Screen</string>
<!-- QuickSettings: Wifi display [CHAR LIMIT=NONE] -->
<string name="quick_settings_wifi_display_no_connection_label">Wireless Display</string>
<!-- QuickSettings: Brightness dialog title [CHAR LIMIT=NONE] --> <!-- QuickSettings: Brightness dialog title [CHAR LIMIT=NONE] -->
<string name="quick_settings_brightness_dialog_title">Brightness</string> <string name="quick_settings_brightness_dialog_title">Brightness</string>
<!-- QuickSettings: Brightness dialog auto brightness button [CHAR LIMIT=NONE] --> <!-- QuickSettings: Brightness dialog auto brightness button [CHAR LIMIT=NONE] -->

View File

@ -39,7 +39,6 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.LevelListDrawable; import android.graphics.drawable.LevelListDrawable;
import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager;
import android.hardware.display.WifiDisplayStatus;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Handler; import android.os.Handler;
@ -92,9 +91,7 @@ class QuickSettings {
private QuickSettingsModel mModel; private QuickSettingsModel mModel;
private ViewGroup mContainerView; private ViewGroup mContainerView;
private DisplayManager mDisplayManager;
private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager;
private WifiDisplayStatus mWifiDisplayStatus;
private PhoneStatusBar mStatusBarService; private PhoneStatusBar mStatusBarService;
private BluetoothState mBluetoothState; private BluetoothState mBluetoothState;
private BluetoothAdapter mBluetoothAdapter; private BluetoothAdapter mBluetoothAdapter;
@ -118,13 +115,11 @@ class QuickSettings {
new ArrayList<QuickSettingsTileView>(); new ArrayList<QuickSettingsTileView>();
public QuickSettings(Context context, QuickSettingsContainerView container) { public QuickSettings(Context context, QuickSettingsContainerView container) {
mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
mDevicePolicyManager mDevicePolicyManager
= (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
mContext = context; mContext = context;
mContainerView = container; mContainerView = container;
mModel = new QuickSettingsModel(context); mModel = new QuickSettingsModel(context);
mWifiDisplayStatus = new WifiDisplayStatus();
mBluetoothState = new QuickSettingsModel.BluetoothState(); mBluetoothState = new QuickSettingsModel.BluetoothState();
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
@ -171,7 +166,6 @@ class QuickSettings {
mLocationController = locationController; mLocationController = locationController;
setupQuickSettings(); setupQuickSettings();
updateWifiDisplayStatus();
updateResources(); updateResources();
applyLocationEnabledStatus(); applyLocationEnabledStatus();
@ -676,20 +670,20 @@ class QuickSettings {
}); });
parent.addView(alarmTile); parent.addView(alarmTile);
// Wifi Display // Remote Display
QuickSettingsBasicTile wifiDisplayTile QuickSettingsBasicTile remoteDisplayTile
= new QuickSettingsBasicTile(mContext); = new QuickSettingsBasicTile(mContext);
wifiDisplayTile.setImageResource(R.drawable.ic_qs_remote_display); remoteDisplayTile.setImageResource(R.drawable.ic_qs_remote_display);
wifiDisplayTile.setOnClickListener(new View.OnClickListener() { remoteDisplayTile.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
startSettingsActivity(android.provider.Settings.ACTION_WIFI_DISPLAY_SETTINGS); startSettingsActivity(android.provider.Settings.ACTION_WIFI_DISPLAY_SETTINGS);
} }
}); });
mModel.addWifiDisplayTile(wifiDisplayTile, mModel.addRemoteDisplayTile(remoteDisplayTile,
new QuickSettingsModel.BasicRefreshCallback(wifiDisplayTile) new QuickSettingsModel.BasicRefreshCallback(remoteDisplayTile)
.setShowWhenEnabled(true)); .setShowWhenEnabled(true));
parent.addView(wifiDisplayTile); parent.addView(remoteDisplayTile);
if (SHOW_IME_TILE || DEBUG_GONE_TILES) { if (SHOW_IME_TILE || DEBUG_GONE_TILES) {
// IME // IME
@ -824,15 +818,6 @@ class QuickSettings {
dialog.show(); dialog.show();
} }
private void updateWifiDisplayStatus() {
mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
applyWifiDisplayStatus();
}
private void applyWifiDisplayStatus() {
mModel.onWifiDisplayStateChanged(mWifiDisplayStatus);
}
private void applyBluetoothStatus() { private void applyBluetoothStatus() {
mModel.onBluetoothStateChange(mBluetoothState); mModel.onBluetoothStateChange(mBluetoothState);
} }
@ -856,12 +841,7 @@ class QuickSettings {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
final String action = intent.getAction(); final String action = intent.getAction();
if (DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED.equals(action)) { if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
WifiDisplayStatus status = (WifiDisplayStatus)intent.getParcelableExtra(
DisplayManager.EXTRA_WIFI_DISPLAY_STATUS);
mWifiDisplayStatus = status;
applyWifiDisplayStatus();
} else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR); BluetoothAdapter.ERROR);
mBluetoothState.enabled = (state == BluetoothAdapter.STATE_ON); mBluetoothState.enabled = (state == BluetoothAdapter.STATE_ON);

View File

@ -27,7 +27,8 @@ import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.hardware.display.WifiDisplayStatus; import android.media.MediaRouter;
import android.media.MediaRouter.RouteInfo;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.os.Handler; import android.os.Handler;
import android.os.UserHandle; import android.os.UserHandle;
@ -57,7 +58,6 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
BrightnessStateChangeCallback, BrightnessStateChangeCallback,
RotationLockControllerCallback, RotationLockControllerCallback,
LocationSettingsChangeCallback { LocationSettingsChangeCallback {
// Sett InputMethoManagerService // Sett InputMethoManagerService
private static final String TAG_TRY_SUPPRESSING_IME_SWITCHER = "TrySuppressingImeSwitcher"; private static final String TAG_TRY_SUPPRESSING_IME_SWITCHER = "TrySuppressingImeSwitcher";
@ -199,6 +199,30 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
} }
} }
/** Callback for changes to remote display routes. */
private class RemoteDisplayRouteCallback extends MediaRouter.SimpleCallback {
@Override
public void onRouteAdded(MediaRouter router, RouteInfo route) {
updateRemoteDisplays();
}
@Override
public void onRouteChanged(MediaRouter router, RouteInfo route) {
updateRemoteDisplays();
}
@Override
public void onRouteRemoved(MediaRouter router, RouteInfo route) {
updateRemoteDisplays();
}
@Override
public void onRouteSelected(MediaRouter router, int type, RouteInfo route) {
updateRemoteDisplays();
}
@Override
public void onRouteUnselected(MediaRouter router, int type, RouteInfo route) {
updateRemoteDisplays();
}
}
private final Context mContext; private final Context mContext;
private final Handler mHandler; private final Handler mHandler;
private final CurrentUserTracker mUserTracker; private final CurrentUserTracker mUserTracker;
@ -206,6 +230,9 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
private final BugreportObserver mBugreportObserver; private final BugreportObserver mBugreportObserver;
private final BrightnessObserver mBrightnessObserver; private final BrightnessObserver mBrightnessObserver;
private final MediaRouter mMediaRouter;
private final RemoteDisplayRouteCallback mRemoteDisplayRouteCallback;
private final boolean mHasMobileData; private final boolean mHasMobileData;
private QuickSettingsTileView mUserTile; private QuickSettingsTileView mUserTile;
@ -228,9 +255,9 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
private RefreshCallback mWifiCallback; private RefreshCallback mWifiCallback;
private WifiState mWifiState = new WifiState(); private WifiState mWifiState = new WifiState();
private QuickSettingsTileView mWifiDisplayTile; private QuickSettingsTileView mRemoteDisplayTile;
private RefreshCallback mWifiDisplayCallback; private RefreshCallback mRemoteDisplayCallback;
private State mWifiDisplayState = new State(); private State mRemoteDisplayState = new State();
private QuickSettingsTileView mRSSITile; private QuickSettingsTileView mRSSITile;
private RefreshCallback mRSSICallback; private RefreshCallback mRSSICallback;
@ -278,12 +305,14 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
mContext = context; mContext = context;
mHandler = new Handler(); mHandler = new Handler();
mUserTracker = new CurrentUserTracker(mContext) { mUserTracker = new CurrentUserTracker(mContext) {
@Override
public void onUserSwitched(int newUserId) { public void onUserSwitched(int newUserId) {
mBrightnessObserver.startObserving(); mBrightnessObserver.startObserving();
refreshRotationLockTile(); refreshRotationLockTile();
onBrightnessLevelChanged(); onBrightnessLevelChanged();
onNextAlarmChanged(); onNextAlarmChanged();
onBugreportChanged(); onBugreportChanged();
rebindMediaRouterAsCurrentUser();
} }
}; };
@ -294,6 +323,11 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
mBrightnessObserver = new BrightnessObserver(mHandler); mBrightnessObserver = new BrightnessObserver(mHandler);
mBrightnessObserver.startObserving(); mBrightnessObserver.startObserving();
mMediaRouter = (MediaRouter)context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
rebindMediaRouterAsCurrentUser();
mRemoteDisplayRouteCallback = new RemoteDisplayRouteCallback();
ConnectivityManager cm = (ConnectivityManager) ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE); context.getSystemService(Context.CONNECTIVITY_SERVICE);
mHasMobileData = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); mHasMobileData = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
@ -621,24 +655,59 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
mBugreportCallback.refreshView(mBugreportTile, mBugreportState); mBugreportCallback.refreshView(mBugreportTile, mBugreportState);
} }
// Wifi Display // Remote Display
void addWifiDisplayTile(QuickSettingsTileView view, RefreshCallback cb) { void addRemoteDisplayTile(QuickSettingsTileView view, RefreshCallback cb) {
mWifiDisplayTile = view; mRemoteDisplayTile = view;
mWifiDisplayCallback = cb; mRemoteDisplayCallback = cb;
} final int[] count = new int[1];
public void onWifiDisplayStateChanged(WifiDisplayStatus status) { mRemoteDisplayTile.setOnPrepareListener(new QuickSettingsTileView.OnPrepareListener() {
mWifiDisplayState.enabled = @Override
(status.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON); public void onPrepare() {
if (status.getActiveDisplay() != null) { mMediaRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY,
mWifiDisplayState.label = status.getActiveDisplay().getFriendlyDisplayName(); mRemoteDisplayRouteCallback,
mWifiDisplayState.iconId = R.drawable.ic_qs_remote_display_connected; MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
} else { updateRemoteDisplays();
mWifiDisplayState.label = mContext.getString( }
R.string.quick_settings_wifi_display_no_connection_label); @Override
mWifiDisplayState.iconId = R.drawable.ic_qs_remote_display; public void onUnprepare() {
} mMediaRouter.removeCallback(mRemoteDisplayRouteCallback);
mWifiDisplayCallback.refreshView(mWifiDisplayTile, mWifiDisplayState); }
});
updateRemoteDisplays();
}
private void rebindMediaRouterAsCurrentUser() {
mMediaRouter.rebindAsUser(mUserTracker.getCurrentUserId());
}
private void updateRemoteDisplays() {
MediaRouter.RouteInfo connectedRoute = mMediaRouter.getSelectedRoute(
MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY);
boolean enabled = connectedRoute != null && (connectedRoute.getSupportedTypes()
& MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY) != 0;
if (!enabled) {
connectedRoute = null;
final int count = mMediaRouter.getRouteCount();
for (int i = 0; i < count; i++) {
MediaRouter.RouteInfo route = mMediaRouter.getRouteAt(i);
if ((route.getSupportedTypes() & MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY) != 0) {
enabled = true;
break;
}
}
}
mRemoteDisplayState.enabled = enabled;
if (connectedRoute != null) {
mRemoteDisplayState.label = connectedRoute.getName().toString();
mRemoteDisplayState.iconId = R.drawable.ic_qs_remote_display_connected;
} else {
mRemoteDisplayState.label = mContext.getString(
R.string.quick_settings_remote_display_no_connection_label);
mRemoteDisplayState.iconId = R.drawable.ic_qs_remote_display;
}
mRemoteDisplayCallback.refreshView(mRemoteDisplayTile, mRemoteDisplayState);
} }
// IME // IME

View File

@ -21,6 +21,7 @@ import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewParent;
import android.widget.FrameLayout; import android.widget.FrameLayout;
/** /**
@ -31,14 +32,14 @@ class QuickSettingsTileView extends FrameLayout {
private int mContentLayoutId; private int mContentLayoutId;
private int mColSpan; private int mColSpan;
private int mRowSpan; private boolean mPrepared;
private OnPrepareListener mOnPrepareListener;
public QuickSettingsTileView(Context context, AttributeSet attrs) { public QuickSettingsTileView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
mContentLayoutId = -1; mContentLayoutId = -1;
mColSpan = 1; mColSpan = 1;
mRowSpan = 1;
} }
void setColumnSpan(int span) { void setColumnSpan(int span) {
@ -77,4 +78,72 @@ class QuickSettingsTileView extends FrameLayout {
} }
super.setVisibility(vis); super.setVisibility(vis);
} }
public void setOnPrepareListener(OnPrepareListener listener) {
if (mOnPrepareListener != listener) {
mOnPrepareListener = listener;
mPrepared = false;
post(new Runnable() {
@Override
public void run() {
updatePreparedState();
}
});
}
}
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
updatePreparedState();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
updatePreparedState();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
updatePreparedState();
}
private void updatePreparedState() {
if (mOnPrepareListener != null) {
if (isParentVisible()) {
if (!mPrepared) {
mPrepared = true;
mOnPrepareListener.onPrepare();
}
} else if (mPrepared) {
mPrepared = false;
mOnPrepareListener.onUnprepare();
}
}
}
private boolean isParentVisible() {
if (!isAttachedToWindow()) {
return false;
}
for (ViewParent current = getParent(); current instanceof View;
current = current.getParent()) {
View view = (View)current;
if (view.getVisibility() != VISIBLE) {
return false;
}
}
return true;
}
/**
* Called when the view's parent becomes visible or invisible to provide
* an opportunity for the client to provide new content.
*/
public interface OnPrepareListener {
void onPrepare();
void onUnprepare();
}
} }