| /* |
| * Copyright 2018, The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.managedprovisioning.task; |
| |
| import android.content.Context; |
| import android.os.Handler; |
| import android.provider.Settings; |
| |
| import com.android.managedprovisioning.R; |
| import com.android.managedprovisioning.common.ProvisionLogger; |
| import com.android.managedprovisioning.common.Utils; |
| import com.android.managedprovisioning.model.ProvisioningParams; |
| import com.android.managedprovisioning.task.wifi.NetworkMonitor; |
| |
| /** |
| * A task that enables mobile data and waits for it to successfully connect. If connection times out |
| * {@link #error(int)} will be called. |
| */ |
| public class ConnectMobileNetworkTask extends AbstractProvisioningTask |
| implements NetworkMonitor.NetworkConnectedCallback { |
| private static final int RECONNECT_TIMEOUT_MS = 60000; |
| |
| private final NetworkMonitor mNetworkMonitor; |
| |
| private Handler mHandler; |
| private boolean mTaskDone = false; |
| |
| private final Utils mUtils; |
| private Runnable mTimeoutRunnable; |
| |
| public ConnectMobileNetworkTask( |
| Context context, |
| ProvisioningParams provisioningParams, |
| Callback callback) { |
| super(context, provisioningParams, callback); |
| mNetworkMonitor = new NetworkMonitor(context); |
| mUtils = new Utils(); |
| } |
| |
| /** |
| * Sets {@link Settings.Global#DEVICE_PROVISIONING_MOBILE_DATA_ENABLED} to 1, and if not already |
| * connected to the network, starts listening for a connection. Calls {@link #success()} when |
| * connected or {@link #error(int)} if it times out after 10 minutes. |
| */ |
| @Override |
| public void run(int userId) { |
| Settings.Global.putInt(mContext.getContentResolver(), |
| Settings.Global.DEVICE_PROVISIONING_MOBILE_DATA_ENABLED, 1); |
| |
| if (mUtils.isConnectedToNetwork(mContext)) { |
| success(); |
| return; |
| } |
| |
| mTaskDone = false; |
| mHandler = new Handler(); |
| mNetworkMonitor.startListening(this); |
| |
| // NetworkMonitor will call onNetworkConnected. |
| // Post time out event in case the NetworkMonitor doesn't call back. |
| mTimeoutRunnable = () -> finishTask(false); |
| mHandler.postDelayed(mTimeoutRunnable, RECONNECT_TIMEOUT_MS); |
| } |
| |
| @Override |
| public int getStatusMsgId() { |
| return R.string.progress_connect_to_mobile_network; |
| } |
| |
| @Override |
| public void onNetworkConnected() { |
| ProvisionLogger.logd("onNetworkConnected"); |
| if (mUtils.isConnectedToNetwork(mContext)) { |
| ProvisionLogger.logd("Connected to the mobile network"); |
| finishTask(true); |
| // Remove time out callback. |
| mHandler.removeCallbacks(mTimeoutRunnable); |
| } |
| } |
| |
| private synchronized void finishTask(boolean isSuccess) { |
| if (mTaskDone) { |
| return; |
| } |
| |
| mTaskDone = true; |
| mNetworkMonitor.stopListening(); |
| if (isSuccess) { |
| success(); |
| } else { |
| error(0); |
| } |
| } |
| } |