summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI/src/com/android
diff options
context:
space:
mode:
authorJason Monk <jmonk@google.com>2014-07-22 19:36:10 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-07-20 04:41:30 +0000
commit464cb8fdc235500316c616848b5a67814098e616 (patch)
tree0259abf73406ef459adfa3686f0d7a10e3fe2689 /packages/SystemUI/src/com/android
parent2471498511be43f1b6023a9f9dffb5a0f36f2049 (diff)
parent51e4dc0a153bd0da197728ce6fe34df662b1cea2 (diff)
downloadframeworks_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.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java83
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java12
-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.java108
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());
+ }
+ }
+}