blob: c0a683734b8b2b48d3257ed865c5397cc987b0d9 [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() {
Sundeep Ghumanc09b7f72017-07-26 20:23:32 -0700100 if (DEBUG) Log.d(TAG, "force update APs!");
101 mWifiTracker.forceUpdate();
102 fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
Jason Monkd52356a2015-01-28 10:40:41 -0500103 }
104
105 @Override
106 public int getIcon(AccessPoint ap) {
107 int level = ap.getLevel();
108 return ICONS[level >= 0 ? level : 0];
John Spurlock7f8f22a2014-07-02 18:54:17 -0400109 }
110
Jason Monk5d325072014-10-27 11:38:47 -0400111 public boolean connect(AccessPoint ap) {
112 if (ap == null) return false;
Jason Monkd52356a2015-01-28 10:40:41 -0500113 if (DEBUG) Log.d(TAG, "connect networkId=" + ap.getConfig().networkId);
114 if (ap.isSaved()) {
115 mWifiTracker.getManager().connect(ap.getConfig().networkId, mConnectListener);
116 } else {
Jason Monk5d325072014-10-27 11:38:47 -0400117 // Unknown network, need to add it.
Jason Monkd52356a2015-01-28 10:40:41 -0500118 if (ap.getSecurity() != AccessPoint.SECURITY_NONE) {
Jason Monk5d325072014-10-27 11:38:47 -0400119 Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
Jason Monkcc4b31e2015-06-18 12:37:03 -0400120 intent.putExtra(EXTRA_START_CONNECT_SSID, ap.getSsidStr());
Jason Monk5d325072014-10-27 11:38:47 -0400121 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Jason Monk17f3c3f2015-01-14 10:13:22 -0500122 fireSettingsIntentCallback(intent);
Jason Monk5d325072014-10-27 11:38:47 -0400123 return true;
124 } else {
Jason Monkd52356a2015-01-28 10:40:41 -0500125 ap.generateOpenNetworkConfig();
126 mWifiTracker.getManager().connect(ap.getConfig(), mConnectListener);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400127 }
Jason Monk5d325072014-10-27 11:38:47 -0400128 }
129 return false;
John Spurlock7f8f22a2014-07-02 18:54:17 -0400130 }
131
Jason Monk17f3c3f2015-01-14 10:13:22 -0500132 private void fireSettingsIntentCallback(Intent intent) {
133 for (AccessPointCallback callback : mCallbacks) {
134 callback.onSettingsActivityTriggered(intent);
135 }
136 }
137
Jason Monkd52356a2015-01-28 10:40:41 -0500138 private void fireAcccessPointsCallback(List<AccessPoint> aps) {
John Spurlock7f8f22a2014-07-02 18:54:17 -0400139 for (AccessPointCallback callback : mCallbacks) {
140 callback.onAccessPointsChanged(aps);
141 }
142 }
143
Jason Monkd52356a2015-01-28 10:40:41 -0500144 public void dump(PrintWriter pw) {
145 mWifiTracker.dump(pw);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400146 }
147
Jason Monkd52356a2015-01-28 10:40:41 -0500148 @Override
149 public void onWifiStateChanged(int state) {
John Spurlock7f8f22a2014-07-02 18:54:17 -0400150 }
151
Jason Monkd52356a2015-01-28 10:40:41 -0500152 @Override
153 public void onConnectedChanged() {
154 fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400155 }
156
Jason Monkd52356a2015-01-28 10:40:41 -0500157 @Override
158 public void onAccessPointsChanged() {
159 fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400160 }
161
Jason Monk5d325072014-10-27 11:38:47 -0400162 private final ActionListener mConnectListener = new ActionListener() {
163 @Override
164 public void onSuccess() {
165 if (DEBUG) Log.d(TAG, "connect success");
166 }
167
168 @Override
169 public void onFailure(int reason) {
170 if (DEBUG) Log.d(TAG, "connect failure reason=" + reason);
171 }
172 };
John Spurlock7f8f22a2014-07-02 18:54:17 -0400173}