1 /* 2 * Copyright (C) 2016 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 17 package com.android.tv.settings.connectivity; 18 19 import android.content.Context; 20 import android.net.IpConfiguration; 21 import android.net.wifi.WifiConfiguration; 22 import android.net.wifi.WifiManager; 23 import android.os.Bundle; 24 import android.support.annotation.NonNull; 25 import android.support.v17.leanback.app.GuidedStepFragment; 26 import android.support.v17.leanback.widget.GuidanceStylist; 27 import android.support.v17.leanback.widget.GuidedAction; 28 import android.support.v17.preference.LeanbackPreferenceFragment; 29 import android.support.v7.preference.Preference; 30 import android.text.TextUtils; 31 32 import com.android.settingslib.wifi.AccessPoint; 33 import com.android.tv.settings.R; 34 35 import java.util.List; 36 37 public class WifiDetailsFragment extends LeanbackPreferenceFragment 38 implements ConnectivityListener.Listener, ConnectivityListener.WifiNetworkListener { 39 40 private static final String ARG_ACCESS_POINT_STATE = "apBundle"; 41 42 private static final String KEY_CONNECTION_STATUS = "connection_status"; 43 private static final String KEY_IP_ADDRESS = "ip_address"; 44 private static final String KEY_MAC_ADDRESS = "mac_address"; 45 private static final String KEY_SIGNAL_STRENGTH = "signal_strength"; 46 private static final String KEY_PROXY_SETTINGS = "proxy_settings"; 47 private static final String KEY_IP_SETTINGS = "ip_settings"; 48 private static final String KEY_FORGET_NETWORK = "forget_network"; 49 50 private Preference mConnectionStatusPref; 51 private Preference mIpAddressPref; 52 private Preference mMacAddressPref; 53 private Preference mSignalStrengthPref; 54 private Preference mProxySettingsPref; 55 private Preference mIpSettingsPref; 56 private Preference mForgetNetworkPref; 57 58 private ConnectivityListener mConnectivityListener; 59 private AccessPoint mAccessPoint; 60 61 public static void prepareArgs(@NonNull Bundle args, AccessPoint accessPoint) { 62 final Bundle apBundle = new Bundle(); 63 accessPoint.saveWifiState(apBundle); 64 args.putParcelable(ARG_ACCESS_POINT_STATE, apBundle); 65 } 66 67 @Override 68 public void onCreate(Bundle savedInstanceState) { 69 mConnectivityListener = new ConnectivityListener(getContext(), this); 70 71 mAccessPoint = new AccessPoint(getContext(), 72 getArguments().getBundle(ARG_ACCESS_POINT_STATE)); 73 super.onCreate(savedInstanceState); 74 } 75 76 @Override 77 public void onStart() { 78 super.onStart(); 79 mConnectivityListener.start(); 80 mConnectivityListener.setWifiListener(this); 81 } 82 83 @Override 84 public void onResume() { 85 super.onResume(); 86 update(); 87 } 88 89 @Override 90 public void onStop() { 91 super.onStop(); 92 mConnectivityListener.stop(); 93 } 94 95 @Override 96 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 97 setPreferencesFromResource(R.xml.wifi_details, null); 98 99 getPreferenceScreen().setTitle(mAccessPoint.getSsid()); 100 101 mConnectionStatusPref = findPreference(KEY_CONNECTION_STATUS); 102 mIpAddressPref = findPreference(KEY_IP_ADDRESS); 103 mMacAddressPref = findPreference(KEY_MAC_ADDRESS); 104 mSignalStrengthPref = findPreference(KEY_SIGNAL_STRENGTH); 105 mProxySettingsPref = findPreference(KEY_PROXY_SETTINGS); 106 mIpSettingsPref = findPreference(KEY_IP_SETTINGS); 107 mForgetNetworkPref = findPreference(KEY_FORGET_NETWORK); 108 } 109 110 @Override 111 public boolean onPreferenceTreeClick(Preference preference) { 112 return super.onPreferenceTreeClick(preference); 113 } 114 115 @Override 116 public void onConnectivityChange() { 117 update(); 118 } 119 120 @Override 121 public void onWifiListChanged() { 122 final List<AccessPoint> accessPoints = mConnectivityListener.getAvailableNetworks(); 123 for (final AccessPoint accessPoint : accessPoints) { 124 if (TextUtils.equals(mAccessPoint.getSsidStr(), accessPoint.getSsidStr()) 125 && mAccessPoint.getSecurity() == accessPoint.getSecurity()) { 126 // Make sure we're not holding on to the one we inflated from the bundle, because 127 // it won't be updated 128 mAccessPoint = accessPoint; 129 break; 130 } 131 } 132 update(); 133 } 134 135 private void update() { 136 if (!isAdded()) { 137 return; 138 } 139 140 final boolean active = mAccessPoint.isActive(); 141 142 mConnectionStatusPref.setSummary(active ? R.string.connected : R.string.not_connected); 143 mIpAddressPref.setVisible(active); 144 mMacAddressPref.setVisible(active); 145 mSignalStrengthPref.setVisible(active); 146 147 if (active) { 148 mIpAddressPref.setSummary(mConnectivityListener.getWifiIpAddress()); 149 mMacAddressPref.setSummary(mConnectivityListener.getWifiMacAddress()); 150 mSignalStrengthPref.setSummary(getSignalStrength()); 151 } 152 153 WifiConfiguration wifiConfiguration = mAccessPoint.getConfig(); 154 if (wifiConfiguration != null) { 155 final int networkId = wifiConfiguration.networkId; 156 mProxySettingsPref.setSummary( 157 wifiConfiguration.getProxySettings() == IpConfiguration.ProxySettings.NONE 158 ? R.string.wifi_action_proxy_none : R.string.wifi_action_proxy_manual); 159 mProxySettingsPref.setIntent(EditProxySettingsActivity.createIntent(getContext(), 160 networkId)); 161 162 mIpSettingsPref.setSummary( 163 wifiConfiguration.getIpAssignment() == IpConfiguration.IpAssignment.STATIC 164 ? R.string.wifi_action_static : R.string.wifi_action_dhcp); 165 mIpSettingsPref.setIntent(EditIpSettingsActivity.createIntent(getContext(), networkId)); 166 167 mForgetNetworkPref.setFragment(ForgetNetworkConfirmFragment.class.getName()); 168 ForgetNetworkConfirmFragment.prepareArgs(mForgetNetworkPref.getExtras(), mAccessPoint); 169 } 170 171 mProxySettingsPref.setVisible(wifiConfiguration != null); 172 mIpSettingsPref.setVisible(wifiConfiguration != null); 173 mForgetNetworkPref.setVisible(wifiConfiguration != null); 174 } 175 176 private String getSignalStrength() { 177 String[] signalLevels = getResources().getStringArray(R.array.wifi_signal_strength); 178 int strength = mConnectivityListener.getWifiSignalStrength(signalLevels.length); 179 return signalLevels[strength]; 180 } 181 182 public static class ForgetNetworkConfirmFragment extends GuidedStepFragment { 183 184 private AccessPoint mAccessPoint; 185 186 public static void prepareArgs(@NonNull Bundle args, AccessPoint accessPoint) { 187 final Bundle apBundle = new Bundle(); 188 accessPoint.saveWifiState(apBundle); 189 args.putParcelable(ARG_ACCESS_POINT_STATE, apBundle); 190 } 191 192 @Override 193 public void onCreate(Bundle savedInstanceState) { 194 mAccessPoint = new AccessPoint(getContext(), 195 getArguments().getBundle(ARG_ACCESS_POINT_STATE)); 196 super.onCreate(savedInstanceState); 197 } 198 199 @NonNull 200 @Override 201 public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { 202 return new GuidanceStylist.Guidance( 203 getString(R.string.wifi_forget_network), 204 getString(R.string.wifi_forget_network_description), 205 mAccessPoint.getSsidStr(), 206 getContext().getDrawable(R.drawable.ic_wifi_signal_4_white_132dp)); 207 } 208 209 @Override 210 public void onCreateActions(@NonNull List<GuidedAction> actions, 211 Bundle savedInstanceState) { 212 final Context context = getContext(); 213 actions.add(new GuidedAction.Builder(context) 214 .clickAction(GuidedAction.ACTION_ID_OK) 215 .build()); 216 actions.add(new GuidedAction.Builder(context) 217 .clickAction(GuidedAction.ACTION_ID_CANCEL) 218 .build()); 219 } 220 221 @Override 222 public void onGuidedActionClicked(GuidedAction action) { 223 if (action.getId() == GuidedAction.ACTION_ID_OK) { 224 WifiManager wifiManager = 225 (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); 226 wifiManager.forget(mAccessPoint.getConfig().networkId, null); 227 } 228 getFragmentManager().popBackStack(); 229 } 230 } 231 } 232