blob: 6ee6cb2ed1777d4bac6b9ddd708c8a554d7abb25 [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 Monk5d325072014-10-27 11:38:47 -040023import android.os.UserHandle;
24import android.os.UserManager;
25import android.provider.Settings;
John Spurlock7f8f22a2014-07-02 18:54:17 -040026import android.util.Log;
27
Jason Monkd52356a2015-01-28 10:40:41 -050028import com.android.settingslib.wifi.AccessPoint;
29import com.android.settingslib.wifi.WifiTracker;
30import com.android.settingslib.wifi.WifiTracker.WifiListener;
John Spurlock7f8f22a2014-07-02 18:54:17 -040031import com.android.systemui.R;
John Spurlock7f8f22a2014-07-02 18:54:17 -040032
Jason Monkd52356a2015-01-28 10:40:41 -050033import java.io.PrintWriter;
John Spurlock7f8f22a2014-07-02 18:54:17 -040034import java.util.ArrayList;
John Spurlock7f8f22a2014-07-02 18:54:17 -040035import java.util.List;
36
Jason Monkd52356a2015-01-28 10:40:41 -050037public class AccessPointControllerImpl
38 implements NetworkController.AccessPointController, WifiListener {
Jason Monk5d325072014-10-27 11:38:47 -040039 private static final String TAG = "AccessPointController";
40 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
41
42 // This string extra specifies a network to open the connect dialog on, so the user can enter
43 // network credentials. This is used by quick settings for secured networks.
44 private static final String EXTRA_START_CONNECT_SSID = "wifi_start_connect_ssid";
John Spurlock7f8f22a2014-07-02 18:54:17 -040045
46 private static final int[] ICONS = {
Jason Monk3d804a42015-05-19 13:46:00 -040047 R.drawable.ic_qs_wifi_full_0,
John Spurlock7f8f22a2014-07-02 18:54:17 -040048 R.drawable.ic_qs_wifi_full_1,
49 R.drawable.ic_qs_wifi_full_2,
50 R.drawable.ic_qs_wifi_full_3,
51 R.drawable.ic_qs_wifi_full_4,
52 };
53
54 private final Context mContext;
55 private final ArrayList<AccessPointCallback> mCallbacks = new ArrayList<AccessPointCallback>();
Jason Monkd52356a2015-01-28 10:40:41 -050056 private final WifiTracker mWifiTracker;
Jason Monk5d325072014-10-27 11:38:47 -040057 private final UserManager mUserManager;
John Spurlock7f8f22a2014-07-02 18:54:17 -040058
Jason Monk5d325072014-10-27 11:38:47 -040059 private int mCurrentUser;
John Spurlock7f8f22a2014-07-02 18:54:17 -040060
Tony Mantler0edf09b2017-09-28 15:03:37 -070061 public AccessPointControllerImpl(Context context) {
John Spurlock7f8f22a2014-07-02 18:54:17 -040062 mContext = context;
Jason Monk5d325072014-10-27 11:38:47 -040063 mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
Tony Mantler0edf09b2017-09-28 15:03:37 -070064 mWifiTracker = new WifiTracker(context, this, false, true);
Jason Monk5d325072014-10-27 11:38:47 -040065 mCurrentUser = ActivityManager.getCurrentUser();
66 }
67
Tony Mantler0edf09b2017-09-28 15:03:37 -070068 @Override
69 protected void finalize() throws Throwable {
70 super.finalize();
71 mWifiTracker.onDestroy();
72 }
73
Jason Monk5d325072014-10-27 11:38:47 -040074 public boolean canConfigWifi() {
75 return !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI,
76 new UserHandle(mCurrentUser));
77 }
78
Jason Monkd2263cd2014-11-10 14:22:56 -050079 public void onUserSwitched(int newUserId) {
Jason Monk5d325072014-10-27 11:38:47 -040080 mCurrentUser = newUserId;
John Spurlock7f8f22a2014-07-02 18:54:17 -040081 }
82
Jason Monkd2263cd2014-11-10 14:22:56 -050083 @Override
84 public void addAccessPointCallback(AccessPointCallback callback) {
John Spurlock7f8f22a2014-07-02 18:54:17 -040085 if (callback == null || mCallbacks.contains(callback)) return;
86 if (DEBUG) Log.d(TAG, "addCallback " + callback);
87 mCallbacks.add(callback);
Jason Monkd52356a2015-01-28 10:40:41 -050088 if (mCallbacks.size() == 1) {
Tony Mantler0edf09b2017-09-28 15:03:37 -070089 mWifiTracker.onStart();
Jason Monkd52356a2015-01-28 10:40:41 -050090 }
John Spurlock7f8f22a2014-07-02 18:54:17 -040091 }
92
Jason Monkd2263cd2014-11-10 14:22:56 -050093 @Override
94 public void removeAccessPointCallback(AccessPointCallback callback) {
John Spurlock7f8f22a2014-07-02 18:54:17 -040095 if (callback == null) return;
96 if (DEBUG) Log.d(TAG, "removeCallback " + callback);
97 mCallbacks.remove(callback);
Jason Monkd52356a2015-01-28 10:40:41 -050098 if (mCallbacks.isEmpty()) {
Tony Mantler0edf09b2017-09-28 15:03:37 -070099 mWifiTracker.onStop();
Jason Monkd52356a2015-01-28 10:40:41 -0500100 }
John Spurlock7f8f22a2014-07-02 18:54:17 -0400101 }
102
Jason Monkd2263cd2014-11-10 14:22:56 -0500103 @Override
104 public void scanForAccessPoints() {
Sundeep Ghumanc09b7f72017-07-26 20:23:32 -0700105 fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
Jason Monkd52356a2015-01-28 10:40:41 -0500106 }
107
108 @Override
109 public int getIcon(AccessPoint ap) {
110 int level = ap.getLevel();
111 return ICONS[level >= 0 ? level : 0];
John Spurlock7f8f22a2014-07-02 18:54:17 -0400112 }
113
Jason Monk5d325072014-10-27 11:38:47 -0400114 public boolean connect(AccessPoint ap) {
115 if (ap == null) return false;
Jason Monkd52356a2015-01-28 10:40:41 -0500116 if (DEBUG) Log.d(TAG, "connect networkId=" + ap.getConfig().networkId);
117 if (ap.isSaved()) {
118 mWifiTracker.getManager().connect(ap.getConfig().networkId, mConnectListener);
119 } else {
Jason Monk5d325072014-10-27 11:38:47 -0400120 // Unknown network, need to add it.
Jason Monkd52356a2015-01-28 10:40:41 -0500121 if (ap.getSecurity() != AccessPoint.SECURITY_NONE) {
Jason Monk5d325072014-10-27 11:38:47 -0400122 Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
Jason Monkcc4b31e2015-06-18 12:37:03 -0400123 intent.putExtra(EXTRA_START_CONNECT_SSID, ap.getSsidStr());
Jason Monk5d325072014-10-27 11:38:47 -0400124 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Jason Monk17f3c3f2015-01-14 10:13:22 -0500125 fireSettingsIntentCallback(intent);
Jason Monk5d325072014-10-27 11:38:47 -0400126 return true;
127 } else {
Jason Monkd52356a2015-01-28 10:40:41 -0500128 ap.generateOpenNetworkConfig();
129 mWifiTracker.getManager().connect(ap.getConfig(), mConnectListener);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400130 }
Jason Monk5d325072014-10-27 11:38:47 -0400131 }
132 return false;
John Spurlock7f8f22a2014-07-02 18:54:17 -0400133 }
134
Jason Monk17f3c3f2015-01-14 10:13:22 -0500135 private void fireSettingsIntentCallback(Intent intent) {
136 for (AccessPointCallback callback : mCallbacks) {
137 callback.onSettingsActivityTriggered(intent);
138 }
139 }
140
Jason Monkd52356a2015-01-28 10:40:41 -0500141 private void fireAcccessPointsCallback(List<AccessPoint> aps) {
John Spurlock7f8f22a2014-07-02 18:54:17 -0400142 for (AccessPointCallback callback : mCallbacks) {
143 callback.onAccessPointsChanged(aps);
144 }
145 }
146
Jason Monkd52356a2015-01-28 10:40:41 -0500147 public void dump(PrintWriter pw) {
148 mWifiTracker.dump(pw);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400149 }
150
Jason Monkd52356a2015-01-28 10:40:41 -0500151 @Override
152 public void onWifiStateChanged(int state) {
John Spurlock7f8f22a2014-07-02 18:54:17 -0400153 }
154
Jason Monkd52356a2015-01-28 10:40:41 -0500155 @Override
156 public void onConnectedChanged() {
157 fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400158 }
159
Jason Monkd52356a2015-01-28 10:40:41 -0500160 @Override
161 public void onAccessPointsChanged() {
162 fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400163 }
164
Jason Monk5d325072014-10-27 11:38:47 -0400165 private final ActionListener mConnectListener = new ActionListener() {
166 @Override
167 public void onSuccess() {
168 if (DEBUG) Log.d(TAG, "connect success");
169 }
170
171 @Override
172 public void onFailure(int reason) {
173 if (DEBUG) Log.d(TAG, "connect failure reason=" + reason);
174 }
175 };
John Spurlock7f8f22a2014-07-02 18:54:17 -0400176}