• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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