diff options
author | Jason Monk <jmonk@google.com> | 2014-07-22 19:36:10 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-07-20 04:41:30 +0000 |
commit | 464cb8fdc235500316c616848b5a67814098e616 (patch) | |
tree | 0259abf73406ef459adfa3686f0d7a10e3fe2689 /packages/SystemUI/src/com/android | |
parent | 2471498511be43f1b6023a9f9dffb5a0f36f2049 (diff) | |
parent | 51e4dc0a153bd0da197728ce6fe34df662b1cea2 (diff) | |
download | frameworks_base-464cb8fdc235500316c616848b5a67814098e616.zip frameworks_base-464cb8fdc235500316c616848b5a67814098e616.tar.gz frameworks_base-464cb8fdc235500316c616848b5a67814098e616.tar.bz2 |
Merge "Implement hotspot tile" into lmp-dev
Diffstat (limited to 'packages/SystemUI/src/com/android')
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/qs/QSTile.java | 4 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java | 83 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java | 6 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java | 12 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotController.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/policy/TetheringController.java) | 5 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java | 108 |
6 files changed, 191 insertions, 27 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java index d70da2a..93766af 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java @@ -35,7 +35,7 @@ import com.android.systemui.statusbar.policy.Listenable; import com.android.systemui.statusbar.policy.LocationController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.RotationLockController; -import com.android.systemui.statusbar.policy.TetheringController; +import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.volume.VolumeComponent; @@ -251,7 +251,7 @@ public abstract class QSTile<TState extends State> implements Listenable { RotationLockController getRotationLockController(); NetworkController getNetworkController(); ZenModeController getZenModeController(); - TetheringController getTetheringController(); + HotspotController getHotspotController(); CastController getCastController(); FlashlightController getFlashlightController(); KeyguardMonitor getKeyguardMonitor(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index f2ba558..35dfdda 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -16,45 +16,98 @@ package com.android.systemui.qs.tiles; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import com.android.systemui.R; import com.android.systemui.qs.QSTile; -import com.android.systemui.statusbar.policy.TetheringController; +import com.android.systemui.statusbar.policy.HotspotController; +import com.android.systemui.statusbar.policy.KeyguardMonitor; /** Quick settings tile: Hotspot **/ -public class HotspotTile extends QSTile<QSTile.State> { - private static final Intent TETHER_SETTINGS = new Intent() - .setClassName("com.android.settings", "com.android.settings.TetherSettings"); +public class HotspotTile extends QSTile<QSTile.BooleanState> { + private static final String KEY_LAST_USED_DATE = "lastUsedDate"; + private static final long MILLIS_PER_DAY = 1000 * 60 * 60 * 24; - // TODO: implement. see com.android.settings.TetherSettings - - private final TetheringController mController; + private final HotspotController mController; + private final KeyguardMonitor mKeyguard; + private final Callback mCallback = new Callback(); + private final long mTimeToShowTile; public HotspotTile(Host host) { super(host); - mController = host.getTetheringController(); + mController = host.getHotspotController(); + mKeyguard = host.getKeyguardMonitor(); + + mTimeToShowTile = MILLIS_PER_DAY + * mContext.getResources().getInteger(R.integer.days_to_show_hotspot); } @Override - protected State newTileState() { - return new State(); + protected BooleanState newTileState() { + return new BooleanState(); } @Override public void setListening(boolean listening) { - + if (listening) { + mController.addCallback(mCallback); + mKeyguard.addCallback(mCallback); + } else { + mController.removeCallback(mCallback); + mKeyguard.removeCallback(mCallback); + } } @Override protected void handleClick() { - mHost.startSettingsActivity(TETHER_SETTINGS); + final boolean isEnabled = (Boolean) mState.value; + mController.setHotspotEnabled(!isEnabled); } @Override - protected void handleUpdateState(State state, Object arg) { - state.visible = mController != null; + protected void handleUpdateState(BooleanState state, Object arg) { + state.visible = !(mKeyguard.isSecure() && mKeyguard.isShowing()) + && mController.isHotspotSupported() && isHotspotRecentlyUsed(); state.label = mContext.getString(R.string.quick_settings_hotspot_label); - state.iconId = R.drawable.ic_qs_hotspot_off; + + state.value = mController.isHotspotEnabled(); + state.iconId = state.visible && state.value ? R.drawable.ic_qs_hotspot_on + : R.drawable.ic_qs_hotspot_off; + } + + private boolean isHotspotRecentlyUsed() { + long lastDay = getSharedPrefs(mContext).getLong(KEY_LAST_USED_DATE, 0); + return (System.currentTimeMillis() - lastDay) < mTimeToShowTile; + } + + private static SharedPreferences getSharedPrefs(Context context) { + return context.getSharedPreferences(context.getPackageName(), 0); + } + + private final class Callback implements HotspotController.Callback, KeyguardMonitor.Callback { + @Override + public void onHotspotChanged(boolean enabled) { + refreshState(); + } + + @Override + public void onKeyguardChanged() { + refreshState(); + } + }; + + /** + * This will catch broadcasts for changes in hotspot state so we can show + * the hotspot tile for a number of days after use. + */ + public static class APChangedReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + long currentTime = System.currentTimeMillis(); + getSharedPrefs(context).edit().putLong(KEY_LAST_USED_DATE, currentTime).commit(); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 2f96e3e..a5dee6d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -28,7 +28,6 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.TimeInterpolator; @@ -132,6 +131,7 @@ import com.android.systemui.statusbar.policy.FlashlightController; import com.android.systemui.statusbar.policy.HeadsUpNotificationView; import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; +import com.android.systemui.statusbar.policy.HotspotControllerImpl; import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.LocationControllerImpl; import com.android.systemui.statusbar.policy.NetworkControllerImpl; @@ -205,6 +205,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, BatteryController mBatteryController; LocationControllerImpl mLocationController; NetworkControllerImpl mNetworkController; + HotspotControllerImpl mHotspotController; RotationLockControllerImpl mRotationLockController; UserInfoController mUserInfoController; ZenModeController mZenModeController; @@ -705,6 +706,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mLocationController = new LocationControllerImpl(mContext); // will post a notification mBatteryController = new BatteryController(mContext); mNetworkController = new NetworkControllerImpl(mContext); + mHotspotController = new HotspotControllerImpl(mContext); mBluetoothController = new BluetoothControllerImpl(mContext); if (mContext.getResources().getBoolean(R.bool.config_showRotationLock)) { mRotationLockController = new RotationLockControllerImpl(mContext); @@ -758,7 +760,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mQSPanel != null) { final QSTileHost qsh = new QSTileHost(mContext, this, mBluetoothController, mLocationController, mRotationLockController, - mNetworkController, mZenModeController, null /*tethering*/, + mNetworkController, mZenModeController, mHotspotController, mCastController, mFlashlightController, mUserSwitcherController, mKeyguardMonitor); mQSPanel.setHost(qsh); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index 378b531..c2fd24c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -40,7 +40,7 @@ import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.LocationController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.RotationLockController; -import com.android.systemui.statusbar.policy.TetheringController; +import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; @@ -57,7 +57,7 @@ public class QSTileHost implements QSTile.Host { private final RotationLockController mRotation; private final NetworkController mNetwork; private final ZenModeController mZen; - private final TetheringController mTethering; + private final HotspotController mHotspot; private final CastController mCast; private final Looper mLooper; private final CurrentUserTracker mUserTracker; @@ -69,7 +69,7 @@ public class QSTileHost implements QSTile.Host { public QSTileHost(Context context, PhoneStatusBar statusBar, BluetoothController bluetooth, LocationController location, RotationLockController rotation, NetworkController network, - ZenModeController zen, TetheringController tethering, + ZenModeController zen, HotspotController hotspot, CastController cast, FlashlightController flashlight, UserSwitcherController userSwitcher, KeyguardMonitor keyguard) { mContext = context; @@ -79,7 +79,7 @@ public class QSTileHost implements QSTile.Host { mRotation = rotation; mNetwork = network; mZen = zen; - mTethering = tethering; + mHotspot = hotspot; mCast = cast; mFlashlight = flashlight; mUserSwitcherController = userSwitcher; @@ -167,8 +167,8 @@ public class QSTileHost implements QSTile.Host { } @Override - public TetheringController getTetheringController() { - return mTethering; + public HotspotController getHotspotController() { + return mHotspot; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TetheringController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotController.java index 143ebaa..7ca91a5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TetheringController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotController.java @@ -16,13 +16,14 @@ package com.android.systemui.statusbar.policy; -public interface TetheringController { +public interface HotspotController { void addCallback(Callback callback); void removeCallback(Callback callback); boolean isHotspotEnabled(); boolean isHotspotSupported(); + void setHotspotEnabled(boolean enabled); public interface Callback { - void onHotspotChanged(boolean hotspot); + void onHotspotChanged(boolean enabled); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java new file mode 100644 index 0000000..eea8396 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2014 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. + */ + +package com.android.systemui.statusbar.policy; + +import java.util.ArrayList; + +import android.app.ActivityManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.wifi.WifiManager; +import android.os.UserHandle; +import android.util.Log; + +public class HotspotControllerImpl implements HotspotController { + + private static final String TAG = "HotspotController"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>(); + private final Receiver mReceiver = new Receiver(); + private final Context mContext; + private final WifiManager mWifiManager; + private final ConnectivityManager mConnectivityManager; + + public HotspotControllerImpl(Context context) { + mContext = context; + mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); + mConnectivityManager = (ConnectivityManager) + mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + } + + public void addCallback(Callback callback) { + if (callback == null || mCallbacks.contains(callback)) return; + if (DEBUG) Log.d(TAG, "addCallback " + callback); + mCallbacks.add(callback); + mReceiver.setListening(!mCallbacks.isEmpty()); + } + + public void removeCallback(Callback callback) { + if (callback == null) return; + if (DEBUG) Log.d(TAG, "removeCallback " + callback); + mCallbacks.remove(callback); + mReceiver.setListening(!mCallbacks.isEmpty()); + } + + @Override + public boolean isHotspotEnabled() { + return mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED; + } + + @Override + public boolean isHotspotSupported() { + final boolean isSecondaryUser = ActivityManager.getCurrentUser() != UserHandle.USER_OWNER; + return !isSecondaryUser && mConnectivityManager.isTetheringSupported(); + } + + @Override + public void setHotspotEnabled(boolean enabled) { + mWifiManager.setWifiApEnabled(null, enabled); + } + + private void fireCallback(boolean isEnabled) { + for (Callback callback : mCallbacks) { + callback.onHotspotChanged(isEnabled); + } + } + + private final class Receiver extends BroadcastReceiver { + private boolean mRegistered; + + public void setListening(boolean listening) { + if (listening && !mRegistered) { + if (DEBUG) Log.d(TAG, "Registering receiver"); + final IntentFilter filter = new IntentFilter(); + filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); + mContext.registerReceiver(this, filter); + mRegistered = true; + } else if (!listening && mRegistered) { + if (DEBUG) Log.d(TAG, "Unregistering receiver"); + mContext.unregisterReceiver(this); + mRegistered = false; + } + } + + @Override + public void onReceive(Context context, Intent intent) { + if (DEBUG) Log.d(TAG, "onReceive " + intent.getAction()); + fireCallback(isHotspotEnabled()); + } + } +} |