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