diff --git a/src/com/android/settings/sim/smartForwarding/DisableSmartForwardingTask.java b/src/com/android/settings/sim/smartForwarding/DisableSmartForwardingTask.java index a1035dc8477..8448319f32c 100644 --- a/src/com/android/settings/sim/smartForwarding/DisableSmartForwardingTask.java +++ b/src/com/android/settings/sim/smartForwarding/DisableSmartForwardingTask.java @@ -23,6 +23,14 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; +import com.android.settings.sim.smartForwarding.EnableSmartForwardingTask.UpdateCommand; + +import com.google.common.util.concurrent.SettableFuture; + +import java.util.ArrayList; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + public class DisableSmartForwardingTask implements Runnable { private final TelephonyManager tm; private final boolean[] callWaitingStatus; @@ -37,22 +45,123 @@ public class DisableSmartForwardingTask implements Runnable { @Override public void run() { - for (int i = 0; i < tm.getActiveModemCount(); i++) { - int subId = getSubId(i); - if (callWaitingStatus != null - && subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - Log.d(TAG, "Restore call waiting to " + callWaitingStatus[i]); - tm.createForSubscriptionId(subId) - .setCallWaitingEnabled(callWaitingStatus[i], null, null); + FlowController controller = new FlowController(); + if (controller.init()) { + controller.startProcess(); + } + } + + class FlowController { + private final ArrayList mSteps = new ArrayList<>(); + + /* package */ boolean init() { + if (tm == null) { + Log.e(TAG, "TelephonyManager is null"); + return false; } - if (callForwardingInfo != null - && callForwardingInfo[i] != null - && subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - Log.d(TAG, "Restore call forwarding to " + callForwardingInfo[i]); - tm.createForSubscriptionId(subId) - .setCallForwarding(callForwardingInfo[i], null, null); + if (callWaitingStatus == null || callForwardingInfo == null) { + Log.e(TAG, "CallWaitingStatus or CallForwardingInfo array is null"); + return false; } + + int slotCount = tm.getActiveModemCount(); + if (callWaitingStatus.length != slotCount || callForwardingInfo.length != slotCount) { + Log.e(TAG, "The length of CallWaitingStatus and CallForwardingInfo array" + + " should be the same as phone count."); + return false; + } + + Executor executor = Executors.newSingleThreadExecutor(); + + for (int i = 0; i < slotCount; i++) { + int subId = getSubId(i); + if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + continue; + } + + mSteps.add(new RestoreCallWaitingCommand( + tm, executor, callWaitingStatus[i], subId)); + + if (callForwardingInfo[i] != null) { + mSteps.add(new RestoreCallForwardingCommand( + tm, executor, callForwardingInfo[i], subId)); + } + } + + return true; + } + + /* package */ void startProcess() { + int index = 0; + + while (index < mSteps.size()) { + UpdateCommand currentStep = mSteps.get(index); + Log.d(TAG, "processing : " + currentStep); + + try { + currentStep.process(); + index++; + } catch (Exception e) { + Log.e(TAG, "Failed on : " + currentStep, e); + } + } + } + } + + class RestoreCallForwardingCommand extends UpdateCommand { + private SettableFuture mResultFuture = SettableFuture.create(); + private CallForwardingInfo mCallForwardingInfo; + + /* package */ RestoreCallForwardingCommand(TelephonyManager tm, Executor executor, + CallForwardingInfo mCallForwardingInfo, int subId) { + super(tm, executor, subId); + this.mCallForwardingInfo = mCallForwardingInfo; + } + + @Override + public boolean process() throws Exception { + Log.d(TAG, "Restore call forwarding to " + mCallForwardingInfo); + tm.createForSubscriptionId(subId).setCallForwarding(mCallForwardingInfo, executor, + this::updateStatusCallBack); + return mResultFuture.get(); + } + + @Override + void onRestore() { + } + + private void updateStatusCallBack(int result) { + Log.d(TAG, "updateStatusCallBack for CallForwarding: " + result); + mResultFuture.set(true); + } + } + + class RestoreCallWaitingCommand extends UpdateCommand { + private SettableFuture mResultFuture = SettableFuture.create(); + private boolean mCallWaitingStatus; + + /* package */ RestoreCallWaitingCommand(TelephonyManager tm, Executor executor, + boolean mCallWaitingStatus, int subId) { + super(tm, executor, subId); + this.mCallWaitingStatus = mCallWaitingStatus; + } + + @Override + public boolean process() throws Exception { + Log.d(TAG, "Restore call waiting to " + mCallWaitingStatus); + tm.createForSubscriptionId(subId).setCallWaitingEnabled(mCallWaitingStatus, executor, + this::updateStatusCallBack); + return mResultFuture.get(); + } + + @Override + void onRestore() { + } + + private void updateStatusCallBack(int result) { + Log.d(TAG, "updateStatusCallBack for CallWaiting: " + result); + mResultFuture.set(true); } } diff --git a/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java b/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java index 95ac99923dd..4f05a8b150f 100644 --- a/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java +++ b/src/com/android/settings/sim/smartForwarding/SmartForwardingActivity.java @@ -85,12 +85,7 @@ public class SmartForwardingActivity extends SettingsBaseActivity { public void enableSmartForwarding(String[] phoneNumber) { // Pop-up ongoing dialog - ProgressDialog dialog = new ProgressDialog(this); - dialog.setTitle(R.string.smart_forwarding_ongoing_title); - dialog.setIndeterminate(true); - dialog.setMessage(getText(R.string.smart_forwarding_ongoing_text)); - dialog.setCancelable(false); - dialog.show(); + ProgressDialog dialog = showOngoingDialog(); // Enable feature ListenableFuture enableTask = @@ -140,6 +135,9 @@ public class SmartForwardingActivity extends SettingsBaseActivity { boolean[] callWaitingStatus = getAllSlotCallWaitingStatus(this, tm); CallForwardingInfo[] callForwardingInfo = getAllSlotCallForwardingStatus(this, sm, tm); + // Pop-up ongoing dialog + ProgressDialog dialog = showOngoingDialog(); + // Disable feature ListenableFuture disableTask = service.submit(new DisableSmartForwardingTask( tm, callWaitingStatus, callForwardingInfo)); @@ -147,11 +145,13 @@ public class SmartForwardingActivity extends SettingsBaseActivity { @Override public void onSuccess(Object result) { clearAllBackupData(SmartForwardingActivity.this, sm, tm); + dialog.dismiss(); } @Override public void onFailure(Throwable t) { Log.e(TAG, "Disable Feature exception" + t); + dialog.dismiss(); } }, ContextCompat.getMainExecutor(this)); } @@ -174,4 +174,15 @@ public class SmartForwardingActivity extends SettingsBaseActivity { .create(); mDialog.show(); } + + private ProgressDialog showOngoingDialog() { + ProgressDialog dialog = new ProgressDialog(this); + dialog.setTitle(R.string.smart_forwarding_ongoing_title); + dialog.setIndeterminate(true); + dialog.setMessage(getText(R.string.smart_forwarding_ongoing_text)); + dialog.setCancelable(false); + dialog.show(); + + return dialog; + } }