Home | History | Annotate | Download | only in wifi
      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.wifi;
     17 
     18 import android.net.NetworkInfo.State;
     19 import android.net.wifi.WifiManager;
     20 import android.os.Bundle;
     21 import android.support.annotation.StringRes;
     22 import android.util.Log;
     23 import android.view.View;
     24 import android.widget.Button;
     25 import android.widget.TextView;
     26 import android.widget.Toast;
     27 
     28 import com.android.car.settings.common.ListSettingsActivity;
     29 import com.android.car.settings.common.SimpleTextLineItem;
     30 import com.android.car.settings.common.TypedPagedListAdapter;
     31 import com.android.settingslib.wifi.AccessPoint;
     32 
     33 import com.android.car.settings.R;
     34 
     35 import java.util.ArrayList;
     36 
     37 /**
     38  * Shows details about a wifi network, including actions related to the network,
     39  * e.g. ignore, disconnect, etc. The intent should include information about
     40  * access point, use that to render UI, e.g. show SSID etc.
     41  */
     42 public class WifiDetailActivity extends ListSettingsActivity {
     43     private static final String TAG = "WifiDetailActivity";
     44     private AccessPoint mAccessPoint;
     45     private WifiManager mWifiManager;
     46 
     47     private class ActionFailListener implements WifiManager.ActionListener {
     48         @StringRes private final int mMessageResId;
     49 
     50         public ActionFailListener(@StringRes int messageResId) {
     51             mMessageResId = messageResId;
     52         }
     53 
     54         @Override
     55         public void onSuccess() {
     56         }
     57         @Override
     58         public void onFailure(int reason) {
     59             Toast.makeText(WifiDetailActivity.this,
     60                     R.string.wifi_failed_connect_message,
     61                     Toast.LENGTH_SHORT).show();
     62         }
     63     }
     64 
     65     @Override
     66     public void setupActionBar() {
     67         super.setupActionBar();
     68         getActionBar().setCustomView(R.layout.action_bar_with_button);
     69         getActionBar().setDisplayShowCustomEnabled(true);
     70     }
     71 
     72     @Override
     73     protected void onCreate(Bundle savedInstanceState) {
     74         mWifiManager = (WifiManager) getSystemService(WifiManager.class);
     75         mAccessPoint = new AccessPoint(this, getIntent().getExtras());
     76 
     77         super.onCreate(savedInstanceState);
     78         ((TextView) findViewById(R.id.title)).setText(mAccessPoint.getSsid());
     79         Button forgetButton = (Button) findViewById(R.id.action_button1);
     80         forgetButton.setText(R.string.forget);
     81         forgetButton.setOnClickListener(v -> {
     82                 forget();
     83                 finish();
     84             });
     85 
     86         if (mAccessPoint.isSaved() && !mAccessPoint.isActive()) {
     87             Button connectButton = (Button) findViewById(R.id.action_button2);
     88             connectButton.setVisibility(View.VISIBLE);
     89             connectButton.setText(R.string.wifi_setup_connect);
     90             connectButton.setOnClickListener(v -> {
     91                 mWifiManager.connect(mAccessPoint.getConfig(),
     92                         new ActionFailListener(R.string.wifi_failed_connect_message));
     93                 finish();
     94             });
     95         }
     96     }
     97 
     98     @Override
     99     public ArrayList<TypedPagedListAdapter.LineItem> getLineItems() {
    100         ArrayList<TypedPagedListAdapter.LineItem> lineItems = new ArrayList<>();
    101         lineItems.add(
    102                 new SimpleTextLineItem(getText(R.string.wifi_status), mAccessPoint.getSummary()));
    103         lineItems.add(
    104                 new SimpleTextLineItem(getText(R.string.wifi_signal), getSignalString()));
    105         lineItems.add(new SimpleTextLineItem(getText(R.string.wifi_security),
    106                 mAccessPoint.getSecurityString(true /* concise*/)));
    107         return lineItems;
    108     }
    109 
    110     private String getSignalString() {
    111         String[] signalStrings = getResources().getStringArray(R.array.wifi_signals);
    112 
    113         int level = WifiManager.calculateSignalLevel(
    114                 mAccessPoint.getRssi(), signalStrings.length);
    115         return signalStrings[level];
    116     }
    117 
    118     private void forget() {
    119         if (!mAccessPoint.isSaved()) {
    120             if (mAccessPoint.getNetworkInfo() != null &&
    121                     mAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED) {
    122                 // Network is active but has no network ID - must be ephemeral.
    123                 mWifiManager.disableEphemeralNetwork(
    124                         AccessPoint.convertToQuotedString(mAccessPoint.getSsidStr()));
    125             } else {
    126                 // Should not happen, but a monkey seems to trigger it
    127                 Log.e(TAG, "Failed to forget invalid network " + mAccessPoint.getConfig());
    128                 return;
    129             }
    130         } else {
    131             mWifiManager.forget(mAccessPoint.getConfig().networkId,
    132                     new ActionFailListener(R.string.wifi_failed_forget_message));
    133         }
    134     }
    135 }
    136