blob: 0eb719767979384c7c01d3e2ad544bf0e1b0af50 [file] [log] [blame]
John Spurlock7f8f22a2014-07-02 18:54:17 -04001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.statusbar.policy;
18
Jason Monk5d325072014-10-27 11:38:47 -040019import android.app.ActivityManager;
John Spurlock7f8f22a2014-07-02 18:54:17 -040020import android.content.Context;
21import android.content.Intent;
John Spurlock7f8f22a2014-07-02 18:54:17 -040022import android.net.wifi.WifiManager.ActionListener;
Jason Monk30d80042015-05-08 16:54:18 -040023import android.os.Looper;
Jason Monk5d325072014-10-27 11:38:47 -040024import android.os.UserHandle;
25import android.os.UserManager;
26import android.provider.Settings;
John Spurlock7f8f22a2014-07-02 18:54:17 -040027import android.util.Log;
28
Jason Monkd52356a2015-01-28 10:40:41 -050029import com.android.settingslib.wifi.AccessPoint;
30import com.android.settingslib.wifi.WifiTracker;
31import com.android.settingslib.wifi.WifiTracker.WifiListener;
John Spurlock7f8f22a2014-07-02 18:54:17 -040032import com.android.systemui.R;
John Spurlock7f8f22a2014-07-02 18:54:17 -040033
Jason Monkd52356a2015-01-28 10:40:41 -050034import java.io.PrintWriter;
John Spurlock7f8f22a2014-07-02 18:54:17 -040035import java.util.ArrayList;
John Spurlock7f8f22a2014-07-02 18:54:17 -040036import java.util.List;
37
Jason Monkd52356a2015-01-28 10:40:41 -050038public class AccessPointControllerImpl
39 implements NetworkController.AccessPointController, WifiListener {
Jason Monk5d325072014-10-27 11:38:47 -040040 private static final String TAG = "AccessPointController";
41 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
42
43 // This string extra specifies a network to open the connect dialog on, so the user can enter
44 // network credentials. This is used by quick settings for secured networks.
45 private static final String EXTRA_START_CONNECT_SSID = "wifi_start_connect_ssid";
John Spurlock7f8f22a2014-07-02 18:54:17 -040046
47 private static final int[] ICONS = {
Jason Monk3d804a42015-05-19 13:46:00 -040048 R.drawable.ic_qs_wifi_full_0,
John Spurlock7f8f22a2014-07-02 18:54:17 -040049 R.drawable.ic_qs_wifi_full_1,
50 R.drawable.ic_qs_wifi_full_2,
51 R.drawable.ic_qs_wifi_full_3,
52 R.drawable.ic_qs_wifi_full_4,
53 };
54
55 private final Context mContext;
56 private final ArrayList<AccessPointCallback> mCallbacks = new ArrayList<AccessPointCallback>();
Jason Monkd52356a2015-01-28 10:40:41 -050057 private final WifiTracker mWifiTracker;
Jason Monk5d325072014-10-27 11:38:47 -040058 private final UserManager mUserManager;
John Spurlock7f8f22a2014-07-02 18:54:17 -040059
Jason Monk5d325072014-10-27 11:38:47 -040060 private int mCurrentUser;
John Spurlock7f8f22a2014-07-02 18:54:17 -040061
Jason Monk30d80042015-05-08 16:54:18 -040062 public AccessPointControllerImpl(Context context, Looper bgLooper) {
John Spurlock7f8f22a2014-07-02 18:54:17 -040063 mContext = context;
Jason Monk5d325072014-10-27 11:38:47 -040064 mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
Jason Monk30d80042015-05-08 16:54:18 -040065 mWifiTracker = new WifiTracker(context, this, bgLooper, false, true);
Jason Monk5d325072014-10-27 11:38:47 -040066 mCurrentUser = ActivityManager.getCurrentUser();
67 }
68
69 public boolean canConfigWifi() {
70 return !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI,
71 new UserHandle(mCurrentUser));
72 }
73
Jason Monkd2263cd2014-11-10 14:22:56 -050074 public void onUserSwitched(int newUserId) {
Jason Monk5d325072014-10-27 11:38:47 -040075 mCurrentUser = newUserId;
John Spurlock7f8f22a2014-07-02 18:54:17 -040076 }
77
Jason Monkd2263cd2014-11-10 14:22:56 -050078 @Override
79 public void addAccessPointCallback(AccessPointCallback callback) {
John Spurlock7f8f22a2014-07-02 18:54:17 -040080 if (callback == null || mCallbacks.contains(callback)) return;
81 if (DEBUG) Log.d(TAG, "addCallback " + callback);
82 mCallbacks.add(callback);
Jason Monkd52356a2015-01-28 10:40:41 -050083 if (mCallbacks.size() == 1) {
84 mWifiTracker.startTracking();
85 }
John Spurlock7f8f22a2014-07-02 18:54:17 -040086 }
87
Jason Monkd2263cd2014-11-10 14:22:56 -050088 @Override
89 public void removeAccessPointCallback(AccessPointCallback callback) {
John Spurlock7f8f22a2014-07-02 18:54:17 -040090 if (callback == null) return;
91 if (DEBUG) Log.d(TAG, "removeCallback " + callback);
92 mCallbacks.remove(callback);
Jason Monkd52356a2015-01-28 10:40:41 -050093 if (mCallbacks.isEmpty()) {
94 mWifiTracker.stopTracking();
95 }
John Spurlock7f8f22a2014-07-02 18:54:17 -040096 }
97
Jason Monkd2263cd2014-11-10 14:22:56 -050098 @Override
99 public void scanForAccessPoints() {
John Spurlock7f8f22a2014-07-02 18:54:17 -0400100 if (DEBUG) Log.d(TAG, "scan!");
Jason Monkd52356a2015-01-28 10:40:41 -0500101 mWifiTracker.forceScan();
102 }
103
104 @Override
105 public int getIcon(AccessPoint ap) {
106 int level = ap.getLevel();
107 return ICONS[level >= 0 ? level : 0];
John Spurlock7f8f22a2014-07-02 18:54:17 -0400108 }
109
Jason Monk5d325072014-10-27 11:38:47 -0400110 public boolean connect(AccessPoint ap) {
111 if (ap == null) return false;
Jason Monkd52356a2015-01-28 10:40:41 -0500112 if (DEBUG) Log.d(TAG, "connect networkId=" + ap.getConfig().networkId);
113 if (ap.isSaved()) {
114 mWifiTracker.getManager().connect(ap.getConfig().networkId, mConnectListener);
115 } else {
Jason Monk5d325072014-10-27 11:38:47 -0400116 // Unknown network, need to add it.
Jason Monkd52356a2015-01-28 10:40:41 -0500117 if (ap.getSecurity() != AccessPoint.SECURITY_NONE) {
Jason Monk5d325072014-10-27 11:38:47 -0400118 Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
Jason Monkd52356a2015-01-28 10:40:41 -0500119 intent.putExtra(EXTRA_START_CONNECT_SSID, ap.getSsid());
Jason Monk5d325072014-10-27 11:38:47 -0400120 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Jason Monk17f3c3f2015-01-14 10:13:22 -0500121 fireSettingsIntentCallback(intent);
Jason Monk5d325072014-10-27 11:38:47 -0400122 return true;
123 } else {
Jason Monkd52356a2015-01-28 10:40:41 -0500124 ap.generateOpenNetworkConfig();
125 mWifiTracker.getManager().connect(ap.getConfig(), mConnectListener);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400126 }
Jason Monk5d325072014-10-27 11:38:47 -0400127 }
128 return false;
John Spurlock7f8f22a2014-07-02 18:54:17 -0400129 }
130
Jason Monk17f3c3f2015-01-14 10:13:22 -0500131 private void fireSettingsIntentCallback(Intent intent) {
132 for (AccessPointCallback callback : mCallbacks) {
133 callback.onSettingsActivityTriggered(intent);
134 }
135 }
136
Jason Monkd52356a2015-01-28 10:40:41 -0500137 private void fireAcccessPointsCallback(List<AccessPoint> aps) {
John Spurlock7f8f22a2014-07-02 18:54:17 -0400138 for (AccessPointCallback callback : mCallbacks) {
139 callback.onAccessPointsChanged(aps);
140 }
141 }
142
Jason Monkd52356a2015-01-28 10:40:41 -0500143 public void dump(PrintWriter pw) {
144 mWifiTracker.dump(pw);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400145 }
146
Jason Monkd52356a2015-01-28 10:40:41 -0500147 @Override
148 public void onWifiStateChanged(int state) {
John Spurlock7f8f22a2014-07-02 18:54:17 -0400149 }
150
Jason Monkd52356a2015-01-28 10:40:41 -0500151 @Override
152 public void onConnectedChanged() {
153 fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400154 }
155
Jason Monkd52356a2015-01-28 10:40:41 -0500156 @Override
157 public void onAccessPointsChanged() {
158 fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400159 }
160
Jason Monk5d325072014-10-27 11:38:47 -0400161 private final ActionListener mConnectListener = new ActionListener() {
162 @Override
163 public void onSuccess() {
164 if (DEBUG) Log.d(TAG, "connect success");
165 }
166
167 @Override
168 public void onFailure(int reason) {
169 if (DEBUG) Log.d(TAG, "connect failure reason=" + reason);
170 }
171 };
John Spurlock7f8f22a2014-07-02 18:54:17 -0400172}