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 EditIpSettingsActivity extends InstrumentedActivity implements
43         State.FragmentChangeListener {
44     private static final String TAG = "EditIpSettingsActivity";
45 
46     private static final int NETWORK_ID_ETHERNET = WifiConfiguration.INVALID_NETWORK_ID;
47     private static final String EXTRA_NETWORK_ID = "network_id";
48 
createIntent(Context context, int networkId)49     public static Intent createIntent(Context context, int networkId) {
50         return new Intent(context, EditIpSettingsActivity.class)
51                 .putExtra(EXTRA_NETWORK_ID, networkId);
52     }
53 
54     private State mSaveState;
55     private State mSaveSuccessState;
56     private State mSaveFailedState;
57     private StateMachine mStateMachine;
58     private final StateMachine.Callback mStateMachineCallback = result -> {
59         setResult(result);
60         finish();
61     };
62 
63     @Override
onCreate(Bundle savedInstanceState)64     protected void onCreate(Bundle savedInstanceState) {
65         super.onCreate(savedInstanceState);
66         setContentView(R.layout.wifi_container);
67         mStateMachine = ViewModelProviders.of(this).get(StateMachine.class);
68         mStateMachine.setCallback(mStateMachineCallback);
69         mSaveState = new SaveState(this);
70         mSaveSuccessState = new SaveSuccessState(this);
71         mSaveFailedState = new SaveFailedState(this);
72         int networkId = getIntent().getIntExtra(EXTRA_NETWORK_ID, NETWORK_ID_ETHERNET);
73         NetworkConfiguration netConfig;
74         if (networkId == NETWORK_ID_ETHERNET) {
75             netConfig = new EthernetConfig(this);
76             ((EthernetConfig) netConfig).load();
77         } else {
78             final UserManager userManager = UserManager.get(this);
79             if (userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI)) {
80                 EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
81                         this, UserManager.DISALLOW_CONFIG_WIFI, UserHandle.myUserId());
82                 if (admin != null) {
83                     RestrictedLockUtils.sendShowAdminSupportDetailsIntent(this, admin);
84                 }
85                 finish();
86                 return;
87             }
88 
89             netConfig = new WifiConfig(this);
90             ((WifiConfig) netConfig).load(networkId);
91             if (((WifiConfig) netConfig).isLockedDown(this)) {
92                 EnforcedAdmin admin = RestrictedLockUtils.getProfileOrDeviceOwner(this,
93                         UserHandle.of(UserHandle.myUserId()));
94                 RestrictedLockUtils.sendShowAdminSupportDetailsIntent(this, admin);
95                 finish();
96                 return;
97             }
98         }
99         EditSettingsInfo editSettingsInfo =
100                     ViewModelProviders.of(this).get(EditSettingsInfo.class);
101         editSettingsInfo.setNetworkConfiguration(netConfig);
102         AdvancedWifiOptionsFlow.createFlow(this, false, true, netConfig,
103                 null, mSaveState, AdvancedWifiOptionsFlow.START_IP_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 
117         mStateMachine.start(true);
118     }
119 
120 
121 
122     @Override
onBackPressed()123     public void onBackPressed() {
124         mStateMachine.back();
125     }
126 
updateView(Fragment fragment, boolean movingForward)127     private void updateView(Fragment fragment, boolean movingForward) {
128         if (fragment != null) {
129             FragmentTransaction updateTransaction = getSupportFragmentManager().beginTransaction();
130             if (movingForward) {
131                 updateTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
132             } else {
133                 updateTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
134             }
135             updateTransaction.replace(R.id.wifi_container, fragment, TAG);
136             updateTransaction.commit();
137         }
138     }
139 
140     @Override
onFragmentChange(Fragment newFragment, boolean movingForward)141     public void onFragmentChange(Fragment newFragment, boolean movingForward) {
142         updateView(newFragment, movingForward);
143     }
144 }
145