1/*
2 * Copyright (C) 2015 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.settings.wifi;
18
19import android.app.Activity;
20import android.content.DialogInterface;
21import android.content.Intent;
22import android.net.NetworkInfo;
23import android.net.wifi.WifiConfiguration;
24import android.net.wifi.WifiManager;
25import android.net.wifi.WifiManager.ActionListener;
26import android.os.Bundle;
27import android.support.annotation.VisibleForTesting;
28import android.util.Log;
29
30import com.android.settings.SetupWizardUtils;
31import com.android.settingslib.wifi.AccessPoint;
32import com.android.setupwizardlib.util.WizardManagerHelper;
33
34public class WifiDialogActivity extends Activity implements WifiDialog.WifiDialogListener,
35        DialogInterface.OnDismissListener {
36
37    private static final String TAG = "WifiDialogActivity";
38
39    private static final int RESULT_CONNECTED = RESULT_FIRST_USER;
40    private static final int RESULT_FORGET = RESULT_FIRST_USER + 1;
41
42    private static final String KEY_ACCESS_POINT_STATE = "access_point_state";
43    private static final String KEY_WIFI_CONFIGURATION = "wifi_configuration";
44
45    /**
46     * Boolean extra indicating whether this activity should connect to an access point on the
47     * caller's behalf. If this is set to false, the caller should check
48     * {@link #KEY_WIFI_CONFIGURATION} in the result data and save that using
49     * {@link WifiManager#connect(WifiConfiguration, ActionListener)}. Default is true.
50     */
51    @VisibleForTesting
52    static final String KEY_CONNECT_FOR_CALLER = "connect_for_caller";
53
54    @Override
55    protected void onCreate(Bundle savedInstanceState) {
56        final Intent intent = getIntent();
57        if (WizardManagerHelper.isSetupWizardIntent(intent)) {
58            setTheme(SetupWizardUtils.getTransparentTheme(intent));
59        }
60
61        super.onCreate(savedInstanceState);
62
63        final Bundle accessPointState = intent.getBundleExtra(KEY_ACCESS_POINT_STATE);
64        AccessPoint accessPoint = null;
65        if (accessPointState != null) {
66            accessPoint = new AccessPoint(this, accessPointState);
67        }
68
69        WifiDialog dialog = WifiDialog.createModal(
70                this, this, accessPoint, WifiConfigUiBase.MODE_CONNECT);
71        dialog.show();
72        dialog.setOnDismissListener(this);
73    }
74
75    @Override
76    public void finish() {
77        super.finish();
78        overridePendingTransition(0, 0);
79    }
80
81    @Override
82    public void onForget(WifiDialog dialog) {
83        final WifiManager wifiManager = getSystemService(WifiManager.class);
84        final AccessPoint accessPoint = dialog.getController().getAccessPoint();
85        if (accessPoint != null) {
86            if (!accessPoint.isSaved()) {
87                if (accessPoint.getNetworkInfo() != null &&
88                        accessPoint.getNetworkInfo().getState() != NetworkInfo.State.DISCONNECTED) {
89                    // Network is active but has no network ID - must be ephemeral.
90                    wifiManager.disableEphemeralNetwork(
91                            AccessPoint.convertToQuotedString(accessPoint.getSsidStr()));
92                } else {
93                    // Should not happen, but a monkey seems to trigger it
94                    Log.e(TAG, "Failed to forget invalid network " + accessPoint.getConfig());
95                }
96            } else {
97                wifiManager.forget(accessPoint.getConfig().networkId, null /* listener */);
98            }
99        }
100
101        Intent resultData = new Intent();
102        if (accessPoint != null) {
103            Bundle accessPointState = new Bundle();
104            accessPoint.saveWifiState(accessPointState);
105            resultData.putExtra(KEY_ACCESS_POINT_STATE, accessPointState);
106        }
107        setResult(RESULT_FORGET);
108        finish();
109    }
110
111    @Override
112    public void onSubmit(WifiDialog dialog) {
113        final WifiConfiguration config = dialog.getController().getConfig();
114        final AccessPoint accessPoint = dialog.getController().getAccessPoint();
115        final WifiManager wifiManager = getSystemService(WifiManager.class);
116
117        if (getIntent().getBooleanExtra(KEY_CONNECT_FOR_CALLER, true)) {
118            if (config == null) {
119                if (accessPoint != null && accessPoint.isSaved()) {
120                    wifiManager.connect(accessPoint.getConfig(), null /* listener */);
121                }
122            } else {
123                wifiManager.save(config, null /* listener */);
124                if (accessPoint != null) {
125                    // accessPoint is null for "Add network"
126                    NetworkInfo networkInfo = accessPoint.getNetworkInfo();
127                    if (networkInfo == null || !networkInfo.isConnected()) {
128                        wifiManager.connect(config, null /* listener */);
129                    }
130                }
131            }
132        }
133
134        Intent resultData = new Intent();
135        if (accessPoint != null) {
136            Bundle accessPointState = new Bundle();
137            accessPoint.saveWifiState(accessPointState);
138            resultData.putExtra(KEY_ACCESS_POINT_STATE, accessPointState);
139        }
140        if (config != null) {
141            resultData.putExtra(KEY_WIFI_CONFIGURATION, config);
142        }
143        setResult(RESULT_CONNECTED, resultData);
144        finish();
145    }
146
147    @Override
148    public void onDismiss(DialogInterface dialogInterface) {
149        finish();
150    }
151}
152