Merge "Add SIM color picker" into qt-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f4ff282..fc3888b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -102,8 +102,6 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
- <protected-broadcast android:name="com.android.settings.DELETE_SIM_PROFILE_RESULT"/>
-
<application android:label="@string/settings_label"
android:icon="@drawable/ic_launcher_settings"
android:theme="@style/Theme.Settings"
diff --git a/res/layout-land/confirm_lock_pattern.xml b/res/layout-land/confirm_lock_pattern.xml
index 20a7bfc..6ca9be4 100644
--- a/res/layout-land/confirm_lock_pattern.xml
+++ b/res/layout-land/confirm_lock_pattern.xml
@@ -87,11 +87,9 @@
<com.android.internal.widget.LockPatternView
android:id="@+id/lockPattern"
- android:layout_width="288dp"
- android:layout_height="288dp"
- android:layout_marginStart="-42dp"
- android:layout_marginEnd="-42dp"
- android:layout_gravity="center_vertical"/>
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"/>
<TextView
style="@style/TextAppearance.ErrorText"
diff --git a/res/layout/notif_importance_preference.xml b/res/layout/notif_importance_preference.xml
index 2fc2740..395e049 100644
--- a/res/layout/notif_importance_preference.xml
+++ b/res/layout/notif_importance_preference.xml
@@ -24,7 +24,7 @@
android:padding="@dimen/notification_importance_toggle_marginTop"
android:orientation="vertical">
- <RelativeLayout
+ <com.android.settings.notification.NotificationButtonRelativeLayout
android:id="@+id/alert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -65,7 +65,7 @@
android:layout_below="@id/alert_icon"
android:textAppearance="@style/TextAppearance.NotificationImportanceDetail"
android:visibility="gone" />
- </RelativeLayout>
+ </com.android.settings.notification.NotificationButtonRelativeLayout>
<RelativeLayout
android:id="@+id/silence"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2eb3be8..3cd63a7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8104,7 +8104,7 @@
<string name="notification_silence_title">Silent</string>
<!-- [CHAR LIMIT=100] Notification Importance title -->
- <string name="notification_alert_title">Prioritized</string>
+ <string name="notification_alert_title">Alerting</string>
<!-- [CHAR LIMIT=40] Notification importance title. This setting controls how notifications in older apps may alert the user (eg, sound, visual, vibrate). -->
<string name="allow_interruption">Allow interruptions</string>
diff --git a/src/com/android/settings/FallbackHome.java b/src/com/android/settings/FallbackHome.java
index 59347ad..e3944a6 100644
--- a/src/com/android/settings/FallbackHome.java
+++ b/src/com/android/settings/FallbackHome.java
@@ -25,6 +25,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ResolveInfo;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -65,7 +66,7 @@
@Override
public void onColorsChanged(WallpaperColors colors, int which) {
if (colors != null) {
- View decorView = getWindow().getDecorView();
+ final View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
updateVisibilityFlagsFromColors(colors, decorView.getSystemUiVisibility()));
mWallManager.removeOnColorsChangedListener(this);
@@ -81,7 +82,7 @@
// we don't flash the wallpaper before SUW
mProvisioned = Settings.Global.getInt(getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 0) != 0;
- int flags;
+ final int flags;
if (!mProvisioned) {
setTheme(R.style.FallbackHome_SetupWizard);
flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
@@ -91,18 +92,11 @@
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
}
- // Set the system ui flags to light status bar if the wallpaper supports dark text to match
- // current system ui color tints. Use a listener to wait for colors if not ready yet.
mWallManager = getSystemService(WallpaperManager.class);
if (mWallManager == null) {
Log.w(TAG, "Wallpaper manager isn't ready, can't listen to color changes!");
} else {
- WallpaperColors colors = mWallManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
- if (colors == null) {
- mWallManager.addOnColorsChangedListener(mColorsChangedListener, null /* handler */);
- } else {
- flags = updateVisibilityFlagsFromColors(colors, flags);
- }
+ loadWallpaperColors(flags);
}
getWindow().getDecorView().setSystemUiVisibility(flags);
@@ -139,6 +133,33 @@
}
};
+ private void loadWallpaperColors(int flags) {
+ final AsyncTask loadWallpaperColorsTask = new AsyncTask<Object, Void, Integer>() {
+ @Override
+ protected Integer doInBackground(Object... params) {
+ final WallpaperColors colors =
+ mWallManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
+
+ // Use a listener to wait for colors if not ready yet.
+ if (colors == null) {
+ mWallManager.addOnColorsChangedListener(mColorsChangedListener,
+ null /* handler */);
+ return null;
+ }
+ return updateVisibilityFlagsFromColors(colors, flags);
+ }
+
+ @Override
+ protected void onPostExecute(Integer flagsToUpdate) {
+ if (flagsToUpdate == null) {
+ return;
+ }
+ getWindow().getDecorView().setSystemUiVisibility(flagsToUpdate);
+ }
+ };
+ loadWallpaperColorsTask.execute();
+ }
+
private void maybeFinish() {
if (getSystemService(UserManager.class).isUserUnlocked()) {
final Intent homeIntent = new Intent(Intent.ACTION_MAIN)
@@ -162,6 +183,8 @@
}
}
+ // Set the system ui flags to light status bar if the wallpaper supports dark text to match
+ // current system ui color tints.
private int updateVisibilityFlagsFromColors(WallpaperColors colors, int flags) {
if ((colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0) {
return flags | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
diff --git a/src/com/android/settings/network/MobileNetworkListFragment.java b/src/com/android/settings/network/MobileNetworkListFragment.java
index c90827e..4690a28 100644
--- a/src/com/android/settings/network/MobileNetworkListFragment.java
+++ b/src/com/android/settings/network/MobileNetworkListFragment.java
@@ -18,6 +18,7 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
+import android.os.UserManager;
import android.provider.SearchIndexableResource;
import com.android.settings.R;
@@ -66,5 +67,10 @@
result.add(sir);
return result;
}
+
+ @Override
+ protected boolean isPageSearchEnabled(Context context) {
+ return context.getSystemService(UserManager.class).isAdminUser();
+ }
};
}
diff --git a/src/com/android/settings/network/telephony/DeleteSimProfileConfirmationDialog.java b/src/com/android/settings/network/telephony/DeleteSimProfileConfirmationDialog.java
deleted file mode 100644
index 13bfa92..0000000
--- a/src/com/android/settings/network/telephony/DeleteSimProfileConfirmationDialog.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2019 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.settings.network.telephony;
-
-import android.app.Dialog;
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.telephony.SubscriptionInfo;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.appcompat.app.AlertDialog;
-
-import com.android.settings.R;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-
-public class DeleteSimProfileConfirmationDialog extends InstrumentedDialogFragment implements
- DialogInterface.OnClickListener {
- public static final String TAG = "confirm_delete_sim";
- public static final String KEY_SUBSCRIPTION_INFO = "subscription_info";
- private SubscriptionInfo mInfo;
-
- public static DeleteSimProfileConfirmationDialog newInstance(SubscriptionInfo info) {
- final DeleteSimProfileConfirmationDialog dialog =
- new DeleteSimProfileConfirmationDialog();
- final Bundle args = new Bundle();
- args.putParcelable(KEY_SUBSCRIPTION_INFO, info);
- dialog.setArguments(args);
- return dialog;
- }
-
- @NonNull
- @Override
- public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
- mInfo = getArguments().getParcelable(KEY_SUBSCRIPTION_INFO);
- Context context = getContext();
- final String message = context.getString(R.string.mobile_network_erase_sim_dialog_body,
- mInfo.getCarrierName(), mInfo.getCarrierName());
- return new AlertDialog.Builder(context)
- .setTitle(R.string.mobile_network_erase_sim_dialog_title)
- .setMessage(message)
- .setNegativeButton(R.string.cancel, null)
- .setPositiveButton(R.string.mobile_network_erase_sim_dialog_ok, this)
- .create();
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (which == DialogInterface.BUTTON_POSITIVE) {
- beginDeletionWithProgress();
- }
- }
-
- @VisibleForTesting
- void beginDeletionWithProgress() {
- final DeleteSimProfileProgressDialog progress =
- DeleteSimProfileProgressDialog.newInstance(mInfo.getSubscriptionId());
- progress.setTargetFragment(getTargetFragment(), 0);
- progress.show(getFragmentManager(), DeleteSimProfileProgressDialog.TAG);
- }
-
- @Override
- public int getMetricsCategory() {
- return SettingsEnums.DIALOG_DELETE_SIM_CONFIRMATION;
- }
-}
diff --git a/src/com/android/settings/network/telephony/DeleteSimProfilePreferenceController.java b/src/com/android/settings/network/telephony/DeleteSimProfilePreferenceController.java
index 22ff2b6..daabf8b 100644
--- a/src/com/android/settings/network/telephony/DeleteSimProfilePreferenceController.java
+++ b/src/com/android/settings/network/telephony/DeleteSimProfilePreferenceController.java
@@ -17,7 +17,9 @@
package com.android.settings.network.telephony;
import android.content.Context;
+import android.content.Intent;
import android.telephony.SubscriptionInfo;
+import android.telephony.euicc.EuiccManager;
import androidx.fragment.app.Fragment;
import androidx.preference.Preference;
@@ -31,12 +33,13 @@
private SubscriptionInfo mSubscriptionInfo;
private Fragment mParentFragment;
+ private int mRequestCode;
public DeleteSimProfilePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
- public void init(int subscriptionId, Fragment parentFragment) {
+ public void init(int subscriptionId, Fragment parentFragment, int requestCode) {
mParentFragment = parentFragment;
for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(
@@ -46,6 +49,7 @@
break;
}
}
+ mRequestCode = requestCode;
}
@Override
@@ -53,11 +57,10 @@
super.displayPreference(screen);
final Preference pref = screen.findPreference(getPreferenceKey());
pref.setOnPreferenceClickListener(p -> {
- final DeleteSimProfileConfirmationDialog dialogFragment =
- DeleteSimProfileConfirmationDialog.newInstance(mSubscriptionInfo);
- dialogFragment.setTargetFragment(mParentFragment, 0);
- dialogFragment.show(mParentFragment.getFragmentManager(),
- DeleteSimProfileConfirmationDialog.TAG);
+ final Intent intent = new Intent(EuiccManager.ACTION_DELETE_SUBSCRIPTION_PRIVILEGED);
+ intent.putExtra(EuiccManager.EXTRA_SUBSCRIPTION_ID,
+ mSubscriptionInfo.getSubscriptionId());
+ mParentFragment.startActivityForResult(intent, mRequestCode);
return true;
});
}
diff --git a/src/com/android/settings/network/telephony/DeleteSimProfileProgressDialog.java b/src/com/android/settings/network/telephony/DeleteSimProfileProgressDialog.java
deleted file mode 100644
index c176f3c..0000000
--- a/src/com/android/settings/network/telephony/DeleteSimProfileProgressDialog.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2019 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.settings.network.telephony;
-
-import android.app.Activity;
-import android.app.Dialog;
-import android.app.PendingIntent;
-import android.app.ProgressDialog;
-import android.app.settings.SettingsEnums;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.telephony.euicc.EuiccManager;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-
-public class DeleteSimProfileProgressDialog extends InstrumentedDialogFragment {
- public static final String TAG = "delete_sim_progress";
-
- // Note that this must be listed in AndroidManfiest.xml in a <protected-broadcast> tag
- @VisibleForTesting
- static final String PENDING_INTENT =
- "com.android.settings.DELETE_SIM_PROFILE_RESULT";
- private static final int PENDING_INTENT_REQUEST_CODE = 1;
- private static final String KEY_SUBSCRIPTION_ID = "subscription_id";
- @VisibleForTesting
- static final String KEY_DELETE_STARTED = "delete_started";
-
- private boolean mDeleteStarted;
- private BroadcastReceiver mReceiver;
-
- public static DeleteSimProfileProgressDialog newInstance(int subscriptionId) {
- final DeleteSimProfileProgressDialog dialog = new DeleteSimProfileProgressDialog();
- final Bundle args = new Bundle();
- args.putInt(KEY_SUBSCRIPTION_ID, subscriptionId);
- dialog.setArguments(args);
- return dialog;
- }
-
- @Override
- public void onSaveInstanceState(@NonNull Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putBoolean(KEY_DELETE_STARTED, mDeleteStarted);
- }
-
- @NonNull
- @Override
- public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
- if (savedInstanceState != null) {
- mDeleteStarted = savedInstanceState.getBoolean(KEY_DELETE_STARTED, false);
- }
- final Context context = getContext();
- final ProgressDialog progressDialog = new ProgressDialog(context);
- progressDialog.setMessage(
- context.getString(R.string.mobile_network_erase_sim_dialog_progress));
-
- mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- dismiss();
- final Activity activity = getActivity();
- if (activity != null && !activity.isFinishing()) {
- activity.finish();
- }
- }
- };
- context.registerReceiver(mReceiver, new IntentFilter(PENDING_INTENT));
-
- if (!mDeleteStarted) {
- final PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
- PENDING_INTENT_REQUEST_CODE, new Intent(PENDING_INTENT),
- PendingIntent.FLAG_ONE_SHOT);
-
- final EuiccManager euiccManager = context.getSystemService(EuiccManager.class);
- final int subId = getArguments().getInt(KEY_SUBSCRIPTION_ID);
- euiccManager.deleteSubscription(subId, pendingIntent);
- mDeleteStarted = true;
- }
-
- return progressDialog;
- }
-
- @Override
- public void onDismiss(@NonNull DialogInterface dialog) {
- if (mReceiver != null) {
- final Context context = getContext();
- if (context != null) {
- context.unregisterReceiver(mReceiver);
- }
- mReceiver = null;
- }
- }
-
- @Override
- public int getMetricsCategory() {
- return SettingsEnums.DIALOG_DELETE_SIM_PROGRESS;
- }
-}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index e18971d..838aa12 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -61,6 +61,7 @@
private static final String LOG_TAG = "NetworkSettings";
public static final int REQUEST_CODE_EXIT_ECM = 17;
+ public static final int REQUEST_CODE_DELETE_SUBSCRIPTION = 18;
@VisibleForTesting
static final String KEY_CLICKED_PREF = "key_clicked_pref";
@@ -138,7 +139,8 @@
use(BillingCyclePreferenceController.class).init(mSubId);
use(MmsMessagePreferenceController.class).init(mSubId);
use(DisabledSubscriptionController.class).init(getLifecycle(), mSubId);
- use(DeleteSimProfilePreferenceController.class).init(mSubId, this);
+ use(DeleteSimProfilePreferenceController.class).init(mSubId, this,
+ REQUEST_CODE_DELETE_SUBSCRIPTION);
}
use(MobileDataPreferenceController.class).init(getFragmentManager(), mSubId);
use(RoamingPreferenceController.class).init(getFragmentManager(), mSubId);
@@ -226,6 +228,13 @@
}
break;
+ case REQUEST_CODE_DELETE_SUBSCRIPTION:
+ final Activity activity = getActivity();
+ if (activity != null && !activity.isFinishing()) {
+ activity.finish();
+ }
+ break;
+
default:
break;
}
@@ -268,5 +277,11 @@
result.add(sir);
return result;
}
+
+ /** suppress full page if user is not admin */
+ @Override
+ protected boolean isPageSearchEnabled(Context context) {
+ return context.getSystemService(UserManager.class).isAdminUser();
+ }
};
}
diff --git a/src/com/android/settings/notification/AudioHelper.java b/src/com/android/settings/notification/AudioHelper.java
index d178113..01945fd 100644
--- a/src/com/android/settings/notification/AudioHelper.java
+++ b/src/com/android/settings/notification/AudioHelper.java
@@ -22,6 +22,7 @@
import android.media.AudioSystem;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.Log;
import com.android.settings.Utils;
@@ -30,6 +31,7 @@
*/
public class AudioHelper {
+ private static final String TAG = "AudioHelper";
private Context mContext;
private AudioManager mAudioManager;
@@ -76,6 +78,15 @@
}
public int getMinVolume(int stream) {
- return mAudioManager.getStreamMinVolume(stream);
+ int minVolume;
+ try {
+ minVolume = mAudioManager.getStreamMinVolume(stream);
+ } catch (IllegalArgumentException e) {
+ Log.w(TAG, "Invalid stream type " + stream);
+ // Fallback to STREAM_VOICE_CALL because CallVolumePreferenceController.java default
+ // return STREAM_VOICE_CALL in getAudioStream
+ minVolume = mAudioManager.getStreamMinVolume(AudioManager.STREAM_VOICE_CALL);
+ }
+ return minVolume;
}
}
diff --git a/src/com/android/settings/notification/ImportancePreference.java b/src/com/android/settings/notification/ImportancePreference.java
index 0d39c8f..3e81d0c 100644
--- a/src/com/android/settings/notification/ImportancePreference.java
+++ b/src/com/android/settings/notification/ImportancePreference.java
@@ -117,11 +117,13 @@
case IMPORTANCE_LOW:
mAlertButton.setBackground(unselectedBackground);
mSilenceButton.setBackground(selectedBackground);
+ mSilenceButton.setSelected(true);
break;
case IMPORTANCE_HIGH:
default:
mSilenceButton.setBackground(unselectedBackground);
mAlertButton.setBackground(selectedBackground);
+ mAlertButton.setSelected(true);
break;
}
setImportanceSummary((ViewGroup) holder.itemView, mImportance, false);
diff --git a/src/com/android/settings/notification/NotificationButtonRelativeLayout.java b/src/com/android/settings/notification/NotificationButtonRelativeLayout.java
new file mode 100644
index 0000000..358cbf3
--- /dev/null
+++ b/src/com/android/settings/notification/NotificationButtonRelativeLayout.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 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.settings.notification;
+
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.Button;
+import android.widget.RelativeLayout;
+
+public class NotificationButtonRelativeLayout extends RelativeLayout {
+
+ public NotificationButtonRelativeLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public CharSequence getAccessibilityClassName() {
+ return Button.class.getName();
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/slices/SlicePreferenceController.java b/src/com/android/settings/slices/SlicePreferenceController.java
index 89294c7..2432c99 100644
--- a/src/com/android/settings/slices/SlicePreferenceController.java
+++ b/src/com/android/settings/slices/SlicePreferenceController.java
@@ -40,7 +40,8 @@
LifecycleObserver, OnStart, OnStop, Observer<Slice> {
@VisibleForTesting
LiveData<Slice> mLiveData;
- private SlicePreference mSlicePreference;
+ @VisibleForTesting
+ SlicePreference mSlicePreference;
private Uri mUri;
public SlicePreferenceController(Context context, String preferenceKey) {
@@ -82,8 +83,6 @@
@Override
public void onChanged(Slice slice) {
- if (slice != null) {
- mSlicePreference.onSliceUpdated(slice);
- }
+ mSlicePreference.onSliceUpdated(slice);
}
}
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java
new file mode 100644
index 0000000..a65ff24
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/MobileNetworkListFragmentTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2019 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.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserManager;
+
+import com.android.settings.search.BaseSearchIndexProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.util.ReflectionHelpers;
+
+
+@RunWith(RobolectricTestRunner.class)
+public class MobileNetworkListFragmentTest {
+ @Mock
+ private Context mContext;
+ @Mock
+ private UserManager mUserManager;
+
+ private MobileNetworkListFragment mFragment;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mFragment = new MobileNetworkListFragment();
+ }
+
+ @Test
+ public void isPageSearchEnabled_adminUser_shouldReturnTrue() {
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ final BaseSearchIndexProvider provider =
+ (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER;
+
+ final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled",
+ ReflectionHelpers.ClassParameter.from(Context.class, mContext));
+ final boolean isEnabled = (Boolean) obj;
+
+ assertThat(isEnabled).isTrue();
+ }
+
+ @Test
+ public void isPageSearchEnabled_nonAdminUser_shouldReturnFalse() {
+ when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+ when(mUserManager.isAdminUser()).thenReturn(false);
+ final BaseSearchIndexProvider provider =
+ (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER;
+
+ final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled",
+ ReflectionHelpers.ClassParameter.from(Context.class, mContext));
+ final boolean isEnabled = (Boolean) obj;
+
+ assertThat(isEnabled).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfileConfirmationDialogTest.java b/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfileConfirmationDialogTest.java
deleted file mode 100644
index 9b6f551..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfileConfirmationDialogTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2019 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.settings.network.telephony;
-
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.telephony.SubscriptionInfo;
-
-import androidx.appcompat.app.AlertDialog;
-import androidx.fragment.app.FragmentActivity;
-
-import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.androidx.fragment.FragmentController;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowAlertDialogCompat.class)
-public class DeleteSimProfileConfirmationDialogTest {
- @Mock
- private SubscriptionInfo mSubscriptionInfo;
-
- private DeleteSimProfileConfirmationDialog mDialogFragment;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mDialogFragment = spy(DeleteSimProfileConfirmationDialog.newInstance(mSubscriptionInfo));
- doNothing().when(mDialogFragment).beginDeletionWithProgress();
- }
-
- @Test
- public void showDialog_dialogCancelled_deleteNotCalled() {
- FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
- 0 /* containerViewId */,
- null /* bundle */);
- final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
- dialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
- verify(mDialogFragment, never()).beginDeletionWithProgress();
- }
-
- @Test
- public void showDialog_dialogOk_deleteWasCalled() {
- FragmentController.setupFragment(mDialogFragment, FragmentActivity.class,
- 0 /* containerViewId */,
- null /* bundle */);
- final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
- dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
- verify(mDialogFragment).beginDeletionWithProgress();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfilePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfilePreferenceControllerTest.java
index 21fd19b..ca8fcf8 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfilePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfilePreferenceControllerTest.java
@@ -18,11 +18,15 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.content.Intent;
import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
import android.telephony.euicc.EuiccManager;
import androidx.fragment.app.Fragment;
@@ -35,6 +39,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
@@ -46,12 +51,12 @@
@RunWith(RobolectricTestRunner.class)
public class DeleteSimProfilePreferenceControllerTest {
private static final String PREF_KEY = "delete_profile_key";
+ private static final int REQUEST_CODE = 4321;
private static final int SUB_ID = 1234;
private static final int OTHER_ID = 5678;
@Mock
private Fragment mFragment;
-
@Mock
private SubscriptionInfo mSubscriptionInfo;
@Mock
@@ -85,27 +90,42 @@
@Test
public void getAvailabilityStatus_noSubs_notAvailable() {
SubscriptionUtil.setAvailableSubscriptionsForTesting(new ArrayList<>());
- mController.init(SUB_ID, mFragment);
+ mController.init(SUB_ID, mFragment, REQUEST_CODE);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void getAvailabilityStatus_physicalSim_notAvailable() {
when(mSubscriptionInfo.isEmbedded()).thenReturn(false);
- mController.init(SUB_ID, mFragment);
+ mController.init(SUB_ID, mFragment, REQUEST_CODE);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void getAvailabilityStatus_unknownSim_notAvailable() {
when(mSubscriptionInfo.getSubscriptionId()).thenReturn(OTHER_ID);
- mController.init(SUB_ID, mFragment);
+ mController.init(SUB_ID, mFragment, REQUEST_CODE);
assertThat(mController.isAvailable()).isFalse();
}
@Test
public void getAvailabilityStatus_knownEsim_isAvailable() {
- mController.init(SUB_ID, mFragment);
+ mController.init(SUB_ID, mFragment, REQUEST_CODE);
assertThat(mController.isAvailable()).isTrue();
}
+
+ @Test
+ public void onPreferenceClick_startsIntent() {
+ mController.init(SUB_ID, mFragment, REQUEST_CODE);
+ mController.displayPreference(mScreen);
+ mPreference.performClick();
+
+ final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mFragment).startActivityForResult(intentCaptor.capture(), eq(REQUEST_CODE));
+ final Intent intent = intentCaptor.getValue();
+ assertThat(intent.getAction()).isEqualTo(
+ EuiccManager.ACTION_DELETE_SUBSCRIPTION_PRIVILEGED);
+ assertThat(intent.getIntExtra(EuiccManager.EXTRA_SUBSCRIPTION_ID,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID)).isEqualTo(SUB_ID);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfileProgressDialogTest.java b/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfileProgressDialogTest.java
deleted file mode 100644
index aebcc46..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/DeleteSimProfileProgressDialogTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2019 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.settings.network.telephony;
-
-import static com.android.settings.network.telephony.DeleteSimProfileProgressDialog.KEY_DELETE_STARTED;
-import static com.android.settings.network.telephony.DeleteSimProfileProgressDialog.PENDING_INTENT;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.notNull;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.Dialog;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.telephony.euicc.EuiccManager;
-
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-
-import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowAlertDialogCompat.class)
-public class DeleteSimProfileProgressDialogTest {
- private static final int SUB_ID = 111;
-
- @Mock
- private FragmentActivity mActivity;
- @Mock
- private Fragment mTargetFragment;
- @Mock
- private EuiccManager mEuiccManager;
-
- private Context mContext;
- private DeleteSimProfileProgressDialog mDialogFragment;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
-
- when(mContext.getSystemService(EuiccManager.class)).thenReturn(mEuiccManager);
- mDialogFragment = spy(DeleteSimProfileProgressDialog.newInstance(SUB_ID));
- when(mDialogFragment.getContext()).thenReturn(mContext);
- when(mDialogFragment.getTargetFragment()).thenReturn(mTargetFragment);
- when(mDialogFragment.getActivity()).thenReturn(mActivity);
- }
-
- @Test
- public void onCreateDialog_firstShowing_deleteStartedAndRecordedInOutState() {
- mDialogFragment.onCreateDialog(null);
- verify(mEuiccManager).deleteSubscription(eq(SUB_ID), notNull());
-
- final Bundle outState = new Bundle();
- mDialogFragment.onSaveInstanceState(outState);
- assertThat(outState.containsKey(KEY_DELETE_STARTED)).isTrue();
- assertThat(outState.getBoolean(KEY_DELETE_STARTED)).isTrue();
- }
-
- @Test
- public void showDialog_secondShowing_deleteNotStarted() {
- final Bundle inState = new Bundle();
- inState.putBoolean(KEY_DELETE_STARTED, true);
- mDialogFragment.onCreateDialog(inState);
-
- verify(mEuiccManager, never()).deleteSubscription(anyInt(), any());
-
- final Bundle outState = new Bundle();
- mDialogFragment.onSaveInstanceState(outState);
- assertThat(outState.containsKey(KEY_DELETE_STARTED)).isTrue();
- assertThat(outState.getBoolean(KEY_DELETE_STARTED)).isTrue();
- }
-
- @Test
- public void showDialog_pendingIntentReceiverFired_activityFinished() {
- mDialogFragment.onCreateDialog(null);
-
- final ArgumentCaptor<PendingIntent> intentCaptor = ArgumentCaptor.forClass(
- PendingIntent.class);
- verify(mEuiccManager).deleteSubscription(eq(SUB_ID), intentCaptor.capture());
- assertThat(intentCaptor.getValue()).isNotNull();
-
- final ArgumentCaptor<BroadcastReceiver> receiverCaptor = ArgumentCaptor.forClass(
- BroadcastReceiver.class);
- verify(mContext).registerReceiver(receiverCaptor.capture(), any(IntentFilter.class));
-
- doNothing().when(mDialogFragment).dismiss();
- receiverCaptor.getValue().onReceive(mContext, new Intent(PENDING_INTENT));
- verify(mDialogFragment).dismiss();
- verify(mActivity).finish();
- }
-
- @Test
- public void onDismiss_receiverUnregistered() {
- Dialog dialog = mDialogFragment.onCreateDialog(null);
- final ArgumentCaptor<BroadcastReceiver> receiverCaptor = ArgumentCaptor.forClass(
- BroadcastReceiver.class);
- verify(mContext).registerReceiver(receiverCaptor.capture(), any(IntentFilter.class));
-
- mDialogFragment.onDismiss(dialog);
- verify(mContext).unregisterReceiver(eq(receiverCaptor.getValue()));
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java
index 011bca5..4afe0fc 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileNetworkSettingsTest.java
@@ -16,17 +16,21 @@
package com.android.settings.network.telephony;
+import static com.android.settings.network.telephony.MobileNetworkSettings.REQUEST_CODE_DELETE_SUBSCRIPTION;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.net.NetworkPolicyManager;
import android.os.Bundle;
+import android.os.UserManager;
import android.provider.Settings;
import android.telephony.TelephonyManager;
@@ -35,6 +39,7 @@
import com.android.settings.core.FeatureFlags;
import com.android.settings.datausage.DataUsageSummaryPreferenceController;
import com.android.settings.development.featureflags.FeatureFlagPersistent;
+import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -47,6 +52,7 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
import java.util.List;
@@ -80,6 +86,7 @@
args.putInt(Settings.EXTRA_SUB_ID, subscriptionId);
mFragment.setArguments(args);
when(mFragment.getActivity()).thenReturn(mActivity);
+ when(mActivity.isFinishing()).thenReturn(false);
when(mActivity.getSystemService(NetworkPolicyManager.class)).thenReturn(
mNetworkPolicyManager);
}
@@ -118,4 +125,47 @@
.count())
.isEqualTo(1);
}
+
+ @Test
+ public void onActivityResult_noActivity_noCrash() {
+ when(mFragment.getActivity()).thenReturn(null);
+ // this should not crash
+ mFragment.onActivityResult(REQUEST_CODE_DELETE_SUBSCRIPTION, 0, null);
+ }
+
+ @Test
+ public void onActivityResult_deleteSubscription_activityFinishes() {
+ mFragment.onActivityResult(REQUEST_CODE_DELETE_SUBSCRIPTION, 0, null);
+ verify(mActivity).finish();
+ }
+
+ @Test
+ public void isPageSearchEnabled_adminUser_shouldReturnTrue() {
+ final UserManager userManager = mock(UserManager.class);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(userManager);
+ when(userManager.isAdminUser()).thenReturn(true);
+ final BaseSearchIndexProvider provider =
+ (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER;
+
+ final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled",
+ ReflectionHelpers.ClassParameter.from(Context.class, mContext));
+ final boolean isEnabled = (Boolean) obj;
+
+ assertThat(isEnabled).isTrue();
+ }
+
+ @Test
+ public void isPageSearchEnabled_nonAdminUser_shouldReturnFalse() {
+ final UserManager userManager = mock(UserManager.class);
+ when(mContext.getSystemService(UserManager.class)).thenReturn(userManager);
+ when(userManager.isAdminUser()).thenReturn(false);
+ final BaseSearchIndexProvider provider =
+ (BaseSearchIndexProvider) mFragment.SEARCH_INDEX_DATA_PROVIDER;
+
+ final Object obj = ReflectionHelpers.callInstanceMethod(provider, "isPageSearchEnabled",
+ ReflectionHelpers.ClassParameter.from(Context.class, mContext));
+ final boolean isEnabled = (Boolean) obj;
+
+ assertThat(isEnabled).isFalse();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/notification/AudioHelperTest.java b/tests/robotests/src/com/android/settings/notification/AudioHelperTest.java
new file mode 100644
index 0000000..79d0198
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/AudioHelperTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 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.settings.notification;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class AudioHelperTest {
+
+ private static final int START = -10;
+ private static final int END = 10;
+ private static final int DEFAULT = -100;
+
+ private Context mContext;
+ private AudioHelper mAudioHelper;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mAudioHelper = new AudioHelper(mContext);
+ }
+
+ @Test
+ public void getMaxVolume_anyStreamType_getValue() {
+ int volume = DEFAULT;
+
+ for (int i = START; i < END; i++) {
+ volume = mAudioHelper.getMaxVolume(i);
+ assertThat(volume).isNotEqualTo(DEFAULT);
+ }
+ }
+
+ @Test
+ public void getMinVolume_anyStreamType_getValue() {
+ int volume = DEFAULT;
+
+ for (int i = START; i < END; i++) {
+ volume = mAudioHelper.getMinVolume(i);
+ assertThat(volume).isNotEqualTo(DEFAULT);
+ }
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java
index 364fb60..65eaddd 100644
--- a/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SlicePreferenceControllerTest.java
@@ -41,6 +41,8 @@
@Mock
private LiveData<Slice> mLiveData;
+ @Mock
+ private SlicePreference mSlicePreference;
private Context mContext;
private SlicePreferenceController mController;
private Uri mUri;
@@ -53,6 +55,7 @@
mContext = spy(RuntimeEnvironment.application);
mController = new SlicePreferenceController(mContext, KEY);
mController.mLiveData = mLiveData;
+ mController.mSlicePreference = mSlicePreference;
mUri = Uri.EMPTY;
}
@@ -78,4 +81,11 @@
mController.onStop();
verify(mLiveData).removeObserver(mController);
}
+
+ @Test
+ public void onChanged_nullSlice_updateSlice() {
+ mController.onChanged(null);
+
+ verify(mController.mSlicePreference).onSliceUpdated(null);
+ }
}
\ No newline at end of file