1 /*
2  * Copyright (C) 2014 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.content.Intent;
21 import android.net.IpConfiguration;
22 import android.net.wifi.WifiConfiguration;
23 import android.os.Bundle;
24 import android.os.UserHandle;
25 import android.os.UserManager;
26 
27 import androidx.fragment.app.Fragment;
28 import androidx.fragment.app.FragmentTransaction;
29 import androidx.lifecycle.ViewModelProviders;
30 
31 import com.android.settingslib.RestrictedLockUtils;
32 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
33 import com.android.settingslib.RestrictedLockUtilsInternal;
34 import com.android.tv.settings.R;
35 import com.android.tv.settings.connectivity.setup.AdvancedWifiOptionsFlow;
36 import com.android.tv.settings.connectivity.util.State;
37 import com.android.tv.settings.connectivity.util.StateMachine;
38 import com.android.tv.settings.core.instrumentation.InstrumentedActivity;
39 
40 /**
41  * Allows the modification of advanced Wi-Fi settings
42  */
43 public class EditIpSettingsActivity extends InstrumentedActivity implements
44         State.FragmentChangeListener {
45     private static final String TAG = "EditIpSettingsActivity";
46 
47     private static final int NETWORK_ID_ETHERNET = WifiConfiguration.INVALID_NETWORK_ID;
48     private static final String EXTRA_NETWORK_ID = "network_id";
49     private static final String EXTRA_IFACE = "interface_name";
50     private static final String EXTRA_IP_CONFIG = "ip_config";
51 
52     /**
53      * Create a new Intent for WiFi network.
54      */
createWifiIntent(Context context, int networkId)55     public static Intent createWifiIntent(Context context, int networkId) {
56         return new Intent(context, EditIpSettingsActivity.class)
57                 .putExtra(EXTRA_NETWORK_ID, networkId);
58     }
59 
60     /**
61      * Create a new Intent for Ethernet network.
62      */
createEthernetIntent(Context context, String iface, IpConfiguration initialConfig)63     public static Intent createEthernetIntent(Context context, String iface,
64             IpConfiguration initialConfig) {
65         return new Intent(context, EditIpSettingsActivity.class)
66                 .putExtra(EXTRA_NETWORK_ID, NETWORK_ID_ETHERNET)
67                 .putExtra(EXTRA_IFACE, iface)
68                 .putExtra(EXTRA_IP_CONFIG, initialConfig);
69     }
70 
71     private State mSaveState;
72     private State mSaveSuccessState;
73     private State mSaveFailedState;
74     private StateMachine mStateMachine;
75     private final StateMachine.Callback mStateMachineCallback = result -> {
76         setResult(result);
77         finish();
78     };
79 
80     @Override
onCreate(Bundle savedInstanceState)81     protected void onCreate(Bundle savedInstanceState) {
82         super.onCreate(savedInstanceState);
83         setContentView(R.layout.wifi_container);
84         mStateMachine = ViewModelProviders.of(this).get(StateMachine.class);
85         mStateMachine.setCallback(mStateMachineCallback);
86         mSaveState = new SaveState(this);
87         mSaveSuccessState = new SaveSuccessState(this);
88         mSaveFailedState = new SaveFailedState(this);
89         final Intent intent = getIntent();
90         int networkId = intent.getIntExtra(EXTRA_NETWORK_ID, NETWORK_ID_ETHERNET);
91         NetworkConfiguration netConfig;
92         if (networkId == NETWORK_ID_ETHERNET) {
93             final String iface = intent.getStringExtra(EXTRA_IFACE);
94             final IpConfiguration initialConfig = intent.getParcelableExtra(EXTRA_IP_CONFIG);
95             netConfig = new EthernetConfig(this, iface, initialConfig);
96         } else {
97             final UserManager userManager = UserManager.get(this);
98             if (userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI)) {
99                 EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
100                         this, UserManager.DISALLOW_CONFIG_WIFI, UserHandle.myUserId());
101                 if (admin != null) {
102                     RestrictedLockUtils.sendShowAdminSupportDetailsIntent(this, admin);
103                 }
104                 finish();
105                 return;
106             }
107 
108             netConfig = new WifiConfig(this);
109             ((WifiConfig) netConfig).load(networkId);
110             if (((WifiConfig) netConfig).isLockedDown(this)) {
111                 EnforcedAdmin admin = RestrictedLockUtils.getProfileOrDeviceOwner(this,
112                         UserHandle.of(UserHandle.myUserId()));
113                 RestrictedLockUtils.sendShowAdminSupportDetailsIntent(this, admin);
114                 finish();
115                 return;
116             }
117         }
118         EditSettingsInfo editSettingsInfo =
119                     ViewModelProviders.of(this).get(EditSettingsInfo.class);
120         editSettingsInfo.setNetworkConfiguration(netConfig);
121         AdvancedWifiOptionsFlow.createFlow(this, false, true, netConfig,
122                 null, mSaveState, AdvancedWifiOptionsFlow.START_IP_SETTINGS_PAGE);
123 
124         /* Save */
125         mStateMachine.addState(
126                 mSaveState,
127                 StateMachine.RESULT_SUCCESS,
128                 mSaveSuccessState
129         );
130         mStateMachine.addState(
131                 mSaveState,
132                 StateMachine.RESULT_FAILURE,
133                 mSaveFailedState
134         );
135 
136         mStateMachine.start(true);
137     }
138 
139 
140 
141     @Override
onBackPressed()142     public void onBackPressed() {
143         mStateMachine.back();
144     }
145 
updateView(Fragment fragment, boolean movingForward)146     private void updateView(Fragment fragment, boolean movingForward) {
147         if (fragment != null) {
148             FragmentTransaction updateTransaction = getSupportFragmentManager().beginTransaction();
149             if (movingForward) {
150                 updateTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
151             } else {
152                 updateTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
153             }
154             updateTransaction.replace(R.id.wifi_container, fragment, TAG);
155             updateTransaction.commitAllowingStateLoss();
156         }
157     }
158 
159     @Override
onFragmentChange(Fragment newFragment, boolean movingForward)160     public void onFragmentChange(Fragment newFragment, boolean movingForward) {
161         updateView(newFragment, movingForward);
162     }
163 }
164