1 /* 2 * Copyright (C) 2017 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 package com.android.car.settings.quicksettings; 17 18 19 import android.annotation.DrawableRes; 20 import android.annotation.Nullable; 21 import android.content.Context; 22 import android.graphics.drawable.Drawable; 23 import android.view.View; 24 import android.view.View.OnClickListener; 25 26 import com.android.car.settings.R; 27 import com.android.car.settings.common.BaseFragment.FragmentController; 28 import com.android.car.settings.wifi.CarWifiManager; 29 import com.android.car.settings.wifi.WifiSettingsFragment; 30 import com.android.car.settings.wifi.WifiUtil; 31 import com.android.settingslib.wifi.AccessPoint; 32 33 /** 34 * Controls Wifi tile on quick setting page. 35 */ 36 public class WifiTile implements QuickSettingGridAdapter.Tile, CarWifiManager.Listener { 37 private final StateChangedListener mStateChangedListener; 38 private final CarWifiManager mCarWifiManager; 39 private final Context mContext; 40 private final FragmentController mFragmentController; 41 42 private final OnClickListener mSwitchSavedWifiListener; 43 44 @DrawableRes 45 private int mIconRes = R.drawable.ic_settings_wifi; 46 47 private String mText; 48 49 private State mState = State.OFF; 50 WifiTile(Context context, StateChangedListener stateChangedListener, FragmentController fragmentController)51 WifiTile(Context context, StateChangedListener stateChangedListener, 52 FragmentController fragmentController) { 53 mContext = context; 54 mFragmentController = fragmentController; 55 mSwitchSavedWifiListener = v -> { 56 mFragmentController.launchFragment( 57 WifiSettingsFragment.newInstance().showSavedApOnly(true)); 58 }; 59 mCarWifiManager = new CarWifiManager(context, /* listener= */ this); 60 mCarWifiManager.start(); 61 mStateChangedListener = stateChangedListener; 62 // init icon and text etc. 63 updateAccessPointSsid(); 64 onWifiStateChanged(mCarWifiManager.getWifiState()); 65 } 66 67 @Nullable getDeepDiveListener()68 public OnClickListener getDeepDiveListener() { 69 return !mCarWifiManager.getSavedAccessPoints().isEmpty() 70 ? mSwitchSavedWifiListener : null; 71 } 72 73 @Override isAvailable()74 public boolean isAvailable() { 75 return WifiUtil.isWifiAvailable(mContext); 76 } 77 78 @Override getIcon()79 public Drawable getIcon() { 80 return mContext.getDrawable(mIconRes); 81 } 82 83 @Override 84 @Nullable getText()85 public String getText() { 86 return mText; 87 } 88 89 @Override getState()90 public State getState() { 91 return mState; 92 } 93 94 @Override stop()95 public void stop() { 96 mCarWifiManager.stop(); 97 mCarWifiManager.destroy(); 98 } 99 100 @Override onAccessPointsChanged()101 public void onAccessPointsChanged() { 102 if (updateAccessPointSsid()) { 103 mStateChangedListener.onStateChanged(); 104 } 105 } 106 107 @Override onWifiStateChanged(int state)108 public void onWifiStateChanged(int state) { 109 mIconRes = WifiUtil.getIconRes(state); 110 int stringId = WifiUtil.getStateDesc(state); 111 if (stringId != 0) { 112 mText = mContext.getString(stringId); 113 } else if (!updateAccessPointSsid()) { 114 if (wifiEnabledNotConnected()) { 115 mText = mContext.getString(R.string.wifi_settings); 116 } 117 } 118 mState = WifiUtil.isWifiOn(state) ? State.ON : State.OFF; 119 mStateChangedListener.onStateChanged(); 120 } 121 122 @Override onClick(View v)123 public void onClick(View v) { 124 mCarWifiManager.setWifiEnabled(!mCarWifiManager.isWifiEnabled()); 125 } 126 wifiEnabledNotConnected()127 private boolean wifiEnabledNotConnected() { 128 return mCarWifiManager.isWifiEnabled() && mCarWifiManager.getConnectedAccessPoint() == null; 129 } 130 131 /** 132 * Updates the text with access point connected, if any 133 * @return {@code true} if the text is updated, {@code false} other wise. 134 */ updateAccessPointSsid()135 private boolean updateAccessPointSsid() { 136 AccessPoint accessPoint = mCarWifiManager.getConnectedAccessPoint(); 137 if (accessPoint != null) { 138 mText = accessPoint.getConfigName(); 139 return true; 140 } 141 return false; 142 } 143 } 144