diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6ad4c055e31..854d4099fc1 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -140,6 +140,7 @@ + Password is now set up + + + diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java index ebfa9352123..f05f65c3cb6 100644 --- a/src/com/android/settings/ResetNetwork.java +++ b/src/com/android/settings/ResetNetwork.java @@ -21,7 +21,6 @@ import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; -import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.provider.Settings; @@ -128,6 +127,8 @@ public class ResetNetwork extends InstrumentedFragment { | ResetNetworkRequest.RESET_VPN_MANAGER; if (Flags.resetMobileNetworkSettings()) { resetOptions |= ResetNetworkRequest.RESET_IMS_STACK; + resetOptions |= ResetNetworkRequest.RESET_PHONE_PROCESS; + resetOptions |= ResetNetworkRequest.RESET_RILD; } ResetNetworkRequest request = new ResetNetworkRequest(resetOptions); if (mSubscriptions != null && mSubscriptions.size() > 0) { diff --git a/src/com/android/settings/ResetNetworkRequest.java b/src/com/android/settings/ResetNetworkRequest.java index 71c12b1932e..4be8b3206a6 100644 --- a/src/com/android/settings/ResetNetworkRequest.java +++ b/src/com/android/settings/ResetNetworkRequest.java @@ -51,6 +51,12 @@ public class ResetNetworkRequest { /* Reset option - reset IMS stack */ public static final int RESET_IMS_STACK = 0x20; + /* Reset option - reset phone process */ + public static final int RESET_PHONE_PROCESS = 0x40; + + /* Reset option - reset RILD */ + public static final int RESET_RILD = 0x80; + /** * Subscription ID indicates NOT resetting any of the components below: * - TelephonyAndNetworkPolicy @@ -264,6 +270,12 @@ public class ResetNetworkRequest { if ((mResetOptions & RESET_IMS_STACK) != 0) { builder.resetIms(mSubscriptionIdToResetIms); } + if ((mResetOptions & RESET_PHONE_PROCESS) != 0) { + builder.restartPhoneProcess(); + } + if ((mResetOptions & RESET_RILD) != 0) { + builder.restartRild(); + } return builder; } } diff --git a/src/com/android/settings/network/ResetNetworkOperationBuilder.java b/src/com/android/settings/network/ResetNetworkOperationBuilder.java index 61f57f949df..ac07897aebb 100644 --- a/src/com/android/settings/network/ResetNetworkOperationBuilder.java +++ b/src/com/android/settings/network/ResetNetworkOperationBuilder.java @@ -33,6 +33,8 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; +import com.android.settings.R; import com.android.settings.ResetNetworkRequest; import com.android.settings.network.apn.ApnSettings; @@ -50,6 +52,13 @@ public class ResetNetworkOperationBuilder { private static final boolean DRY_RUN = false; + // TelephonyContentProvider method to restart phone process + @VisibleForTesting + static final String METHOD_RESTART_PHONE_PROCESS = "restartPhoneProcess"; + // TelephonyContentProvider method to restart RILD + @VisibleForTesting + static final String METHOD_RESTART_RILD = "restartRild"; + private Context mContext; private List mResetSequence = new ArrayList(); @@ -229,16 +238,56 @@ public class ResetNetworkOperationBuilder { // Reset IMS for all slots for (int slotIndex = 0; slotIndex < tm.getActiveModemCount(); slotIndex++) { tm.resetIms(slotIndex); + Log.i(TAG, "IMS was reset for slot " + slotIndex); } } else { // Reset IMS for the slot specified by the sucriptionId. final int slotIndex = SubscriptionManager.getSlotIndex(subId); tm.resetIms(slotIndex); + Log.i(TAG, "IMS was reset for slot " + slotIndex); } }); return this; } + /** + * Append a step to restart phone process by the help of TelephonyContentProvider. + * It's a no-op if TelephonyContentProvider doesn't exist. + * @return this + */ + public ResetNetworkOperationBuilder restartPhoneProcess() { + try { + mContext.getContentResolver().call( + getResetTelephonyContentProviderAuthority(), + METHOD_RESTART_PHONE_PROCESS, + /* arg= */ null, + /* extras= */ null); + Log.i(TAG, "Phone process was restarted."); + } catch (IllegalArgumentException iae) { + Log.w(TAG, "Fail to restart phone process: " + iae); + } + return this; + } + + /** + * Append a step to restart RILD by the help of TelephonyContentProvider. + * It's a no-op if TelephonyContentProvider doesn't exist. + * @return this + */ + public ResetNetworkOperationBuilder restartRild() { + try { + mContext.getContentResolver().call( + getResetTelephonyContentProviderAuthority(), + METHOD_RESTART_RILD, + /* arg= */ null, + /* extras= */ null); + Log.i(TAG, "RILD was restarted."); + } catch (IllegalArgumentException iae) { + Log.w(TAG, "Fail to restart RILD: " + iae); + } + return this; + } + /** * Construct a Runnable containing all operations appended. * @return Runnable @@ -262,4 +311,14 @@ public class ResetNetworkOperationBuilder { }; mResetSequence.add(runnable); } + + /** + * @return the authority of the telephony content provider that support methods + * resetPhoneProcess and resetRild. + */ + @VisibleForTesting + String getResetTelephonyContentProviderAuthority() { + return mContext.getResources().getString( + R.string.reset_telephony_stack_content_provider_authority); + } } diff --git a/tests/unit/src/com/android/settings/network/ResetNetworkOperationBuilderTest.java b/tests/unit/src/com/android/settings/network/ResetNetworkOperationBuilderTest.java index 41b6b27471b..6213f8eeb33 100644 --- a/tests/unit/src/com/android/settings/network/ResetNetworkOperationBuilderTest.java +++ b/tests/unit/src/com/android/settings/network/ResetNetworkOperationBuilderTest.java @@ -16,13 +16,20 @@ package com.android.settings.network; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import android.content.ContentProvider; +import android.content.ContentResolver; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkPolicyManager; @@ -59,6 +66,9 @@ public class ResetNetworkOperationBuilderTest { private TelephonyManager mTelephonyManager; @Mock private NetworkPolicyManager mNetworkPolicyManager; + @Mock + private ContentProvider mContentProvider;; + private Context mContext; private ResetNetworkOperationBuilder mBuilder; @@ -67,6 +77,7 @@ public class ResetNetworkOperationBuilderTest { public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(ApplicationProvider.getApplicationContext()); + doReturn(ContentResolver.wrap(mContentProvider)).when(mContext).getContentResolver(); mBuilder = spy(new ResetNetworkOperationBuilder(mContext)); } @@ -171,4 +182,42 @@ public class ResetNetworkOperationBuilderTest { verify(mTelephonyManager, times(2)).resetIms(anyInt()); } + + @Test + public void restartPhoneProcess_withoutTelephonyContentProvider_shouldNotCrash() { + doThrow(new IllegalArgumentException()).when(mContentProvider).call( + anyString(), anyString(), anyString(), any()); + + mBuilder.restartPhoneProcess(); + } + + @Test + public void restartRild_withoutTelephonyContentProvider_shouldNotCrash() { + doThrow(new IllegalArgumentException()).when(mContentProvider).call( + anyString(), anyString(), anyString(), any()); + + mBuilder.restartRild(); + } + + @Test + public void restartPhoneProcess_withTelephonyContentProvider_shouldCallRestartPhoneProcess() { + mBuilder.restartPhoneProcess(); + + verify(mContentProvider).call( + eq(mBuilder.getResetTelephonyContentProviderAuthority()), + eq(ResetNetworkOperationBuilder.METHOD_RESTART_PHONE_PROCESS), + isNull(), + isNull()); + } + + @Test + public void restartRild_withTelephonyContentProvider_shouldCallRestartRild() { + mBuilder.restartRild(); + + verify(mContentProvider).call( + eq(mBuilder.getResetTelephonyContentProviderAuthority()), + eq(ResetNetworkOperationBuilder.METHOD_RESTART_RILD), + isNull(), + isNull()); + } }