Snap for 5132890 from 1a2d01b8a6 to qt-release
Change-Id: If8d75e514b3eb8b4c5ce74df902587df7a54e991
This commit is contained in:
@@ -1463,7 +1463,7 @@
|
||||
android:exported="false"
|
||||
android:permission="android.permission.MANAGE_USERS"
|
||||
android:resizeableActivity="false"
|
||||
android:theme="@android:style/Theme.NoDisplay">
|
||||
android:theme="@android:style/Theme.Translucent.NoTitleBar">
|
||||
<intent-filter android:priority="1">
|
||||
<action android:name="android.app.action.CONFIRM_DEVICE_CREDENTIAL_WITH_USER" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
@@ -1598,6 +1598,11 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity android:name=".password.SetupChooseLockGeneric$InternalActivity"
|
||||
android:theme="@style/GlifTheme.Light"
|
||||
android:exported="false"
|
||||
android:excludeFromRecents="true" />
|
||||
|
||||
<activity android:name=".password.ChooseLockGeneric"
|
||||
android:label="@string/lockpassword_choose_lock_generic_header"
|
||||
android:excludeFromRecents="true"
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
android:id="@+id/search_bar_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_scrollFlags="scroll|enterAlways"
|
||||
android:background="?android:attr/colorPrimary">
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/search_bar"
|
||||
|
||||
@@ -15,28 +15,40 @@
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<LinearLayout
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:descendantFocusability="blocksDescendants">
|
||||
|
||||
android:layout_height="wrap_content">
|
||||
<include layout="@layout/search_bar"/>
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/contextual_cards_content"
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:descendantFocusability="blocksDescendants">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/main_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
<FrameLayout
|
||||
android:id="@+id/contextual_cards_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
<FrameLayout
|
||||
android:id="@+id/main_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
@@ -6462,7 +6462,7 @@
|
||||
<!-- User (self) removal confirmation title [CHAR LIMIT=30] -->
|
||||
<string name="user_confirm_remove_self_title">Delete yourself?</string>
|
||||
<!-- User removal confirmation title [CHAR LIMIT=25] -->
|
||||
<string name="user_confirm_remove_title">Remove this user?</string>
|
||||
<string name="user_confirm_remove_title">Delete this user?</string>
|
||||
<!-- Profile removal confirmation title [CHAR LIMIT=25] -->
|
||||
<string name="user_profile_confirm_remove_title">Remove this profile?</string>
|
||||
<!-- Work profile removal confirmation title [CHAR LIMIT=25] -->
|
||||
@@ -6500,7 +6500,7 @@
|
||||
<!-- Title of preference to enable calling and SMS [CHAR LIMIT=45] -->
|
||||
<string name="user_enable_calling_sms">Turn on phone calls & SMS</string>
|
||||
<!-- Title of preference to remove the user [CHAR LIMIT=35] -->
|
||||
<string name="user_remove_user">Remove user</string>
|
||||
<string name="user_remove_user">Delete user</string>
|
||||
<!-- Title for confirmation of turning on calls [CHAR LIMIT=40] -->
|
||||
<string name="user_enable_calling_confirm_title">Turn on phone calls?</string>
|
||||
<!-- Message for confirmation of turning on calls [CHAR LIMIT=none] -->
|
||||
@@ -7112,7 +7112,7 @@
|
||||
<string name="alarm_ringtone_title">Default alarm sound</string>
|
||||
|
||||
<!-- Sound: Title for the option managing whether or not to vibrate when ringing. [CHAR LIMIT=30] -->
|
||||
<string name="vibrate_when_ringing_title">Also vibrate for calls</string>
|
||||
<string name="vibrate_when_ringing_title">Vibrate for calls</string>
|
||||
|
||||
<!-- Sound: Title for the other sounds option and associated settings page. [CHAR LIMIT=30] -->
|
||||
<string name="other_sound_settings">Other sounds</string>
|
||||
@@ -10268,7 +10268,12 @@
|
||||
|
||||
<!-- Title for Network connection request Dialog [CHAR LIMIT=30] -->
|
||||
<string name="network_connection_request_dialog_title">Choose device</string>
|
||||
<!-- Message for Network connection timeout Dialog [CHAR LIMIT=NONE] -->
|
||||
<string name="network_connection_timeout_dialog_message">No devices found. Make sure the device is turned on and available to connect.</string>
|
||||
<!-- OK button for Network connection timeout Dialog [CHAR LIMIT=30] -->
|
||||
<string name="network_connection_timeout_dialog_ok">Scan again</string>
|
||||
|
||||
<!-- Summary for connected devices count in connected device slice. [CHAR LIMIT=NONE] -->
|
||||
<plurals name="show_connected_devices">
|
||||
<item quantity="one"><xliff:g id="number_device_count">%1$d</xliff:g> device connected</item>
|
||||
<item quantity="other"><xliff:g id="number_device_count">%1$d</xliff:g> devices connected</item>
|
||||
|
||||
@@ -36,6 +36,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.AppStateUsageBridge.UsageState;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
|
||||
public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenceChangeListener,
|
||||
OnPreferenceClickListener {
|
||||
@@ -113,8 +114,14 @@ public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenc
|
||||
void logSpecialPermissionChange(boolean newState, String packageName) {
|
||||
int logCategory = newState ? MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW
|
||||
: MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY;
|
||||
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(),
|
||||
logCategory, packageName);
|
||||
final MetricsFeatureProvider metricsFeatureProvider =
|
||||
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
|
||||
metricsFeatureProvider.action(
|
||||
metricsFeatureProvider.getAttribution(getActivity()),
|
||||
logCategory,
|
||||
getMetricsCategory(),
|
||||
packageName,
|
||||
0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -51,6 +51,7 @@ import com.android.settings.Utils;
|
||||
import com.android.settings.applications.ApplicationFeatureProvider;
|
||||
import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminAdd;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.widget.ActionButtonPreference;
|
||||
@@ -106,7 +107,7 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
|
||||
private final UserManager mUserManager;
|
||||
private final PackageManager mPm;
|
||||
private final SettingsActivity mActivity;
|
||||
private final Fragment mFragment;
|
||||
private final InstrumentedPreferenceFragment mFragment;
|
||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
||||
private final ApplicationFeatureProvider mApplicationFeatureProvider;
|
||||
private final int mUserId;
|
||||
@@ -119,7 +120,8 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
|
||||
private boolean mFinishing = false;
|
||||
private boolean mAppsControlDisallowedBySystem;
|
||||
|
||||
public AppButtonsPreferenceController(SettingsActivity activity, Fragment fragment,
|
||||
public AppButtonsPreferenceController(SettingsActivity activity,
|
||||
InstrumentedPreferenceFragment fragment,
|
||||
Lifecycle lifecycle, String packageName, ApplicationsState state,
|
||||
int requestUninstall, int requestRemoveDeviceAdmin) {
|
||||
super(activity, KEY_ACTION_BUTTONS);
|
||||
@@ -517,8 +519,12 @@ public class AppButtonsPreferenceController extends BasePreferenceController imp
|
||||
|
||||
@VisibleForTesting
|
||||
void forceStopPackage(String pkgName) {
|
||||
FeatureFactory.getFactory(mContext).getMetricsFeatureProvider().action(mContext,
|
||||
MetricsProto.MetricsEvent.ACTION_APP_FORCE_STOP, pkgName);
|
||||
mMetricsFeatureProvider.action(
|
||||
mMetricsFeatureProvider.getAttribution(mActivity),
|
||||
MetricsProto.MetricsEvent.ACTION_APP_FORCE_STOP,
|
||||
mFragment.getMetricsCategory(),
|
||||
pkgName,
|
||||
0);
|
||||
ActivityManager am = (ActivityManager) mActivity.getSystemService(
|
||||
Context.ACTIVITY_SERVICE);
|
||||
Log.d(TAG, "Stopping package " + pkgName);
|
||||
|
||||
@@ -42,6 +42,7 @@ import com.android.settings.applications.AppStateOverlayBridge;
|
||||
import com.android.settings.applications.AppStateOverlayBridge.OverlayState;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
|
||||
public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenceChangeListener,
|
||||
OnPreferenceClickListener {
|
||||
@@ -129,8 +130,14 @@ public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenc
|
||||
void logSpecialPermissionChange(boolean newState, String packageName) {
|
||||
int logCategory = newState ? MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW
|
||||
: MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY;
|
||||
FeatureFactory.getFactory(getContext())
|
||||
.getMetricsFeatureProvider().action(getContext(), logCategory, packageName);
|
||||
final MetricsFeatureProvider metricsFeatureProvider =
|
||||
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
|
||||
metricsFeatureProvider.action(
|
||||
metricsFeatureProvider.getAttribution(getActivity()),
|
||||
logCategory,
|
||||
getMetricsCategory(),
|
||||
packageName,
|
||||
0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -17,12 +17,12 @@
|
||||
package com.android.settings.applications.defaultapps;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
@@ -69,11 +69,12 @@ public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment
|
||||
|
||||
@Override
|
||||
protected void onRadioButtonConfirmed(String selectedKey) {
|
||||
mMetricsFeatureProvider.action(getContext(),
|
||||
mMetricsFeatureProvider.action(
|
||||
mMetricsFeatureProvider.getAttribution(getActivity()),
|
||||
MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP,
|
||||
getMetricsCategory(),
|
||||
selectedKey,
|
||||
Pair.create(MetricsEvent.FIELD_CONTEXT, getMetricsCategory()));
|
||||
|
||||
0 /* value */);
|
||||
super.onRadioButtonConfirmed(selectedKey);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.app.Dialog;
|
||||
import android.app.admin.DeviceAdminInfo;
|
||||
import android.app.admin.DeviceAdminReceiver;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
@@ -489,7 +490,12 @@ public class DeviceAdminAdd extends Activity {
|
||||
void logSpecialPermissionChange(boolean allow, String packageName) {
|
||||
int logCategory = allow ? MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW :
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY;
|
||||
FeatureFactory.getFactory(this).getMetricsFeatureProvider().action(this, logCategory, packageName);
|
||||
FeatureFactory.getFactory(this).getMetricsFeatureProvider().action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
logCategory,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
packageName,
|
||||
0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,6 +33,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.AppInfoWithHeader;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
|
||||
public class PictureInPictureDetails extends AppInfoWithHeader
|
||||
implements OnPreferenceChangeListener {
|
||||
@@ -99,7 +100,7 @@ public class PictureInPictureDetails extends AppInfoWithHeader
|
||||
|
||||
/**
|
||||
* @return whether the app associated with the given {@param packageName} is allowed to enter
|
||||
* picture-in-picture.
|
||||
* picture-in-picture.
|
||||
*/
|
||||
static boolean getEnterPipStateForPackage(Context context, int uid, String packageName) {
|
||||
final AppOpsManager appOps = context.getSystemService(AppOpsManager.class);
|
||||
@@ -108,7 +109,7 @@ public class PictureInPictureDetails extends AppInfoWithHeader
|
||||
|
||||
/**
|
||||
* @return the summary for the current state of whether the app associated with the given
|
||||
* {@param packageName} is allowed to enter picture-in-picture.
|
||||
* {@param packageName} is allowed to enter picture-in-picture.
|
||||
*/
|
||||
public static int getPreferenceSummary(Context context, int uid, String packageName) {
|
||||
final boolean enabled = PictureInPictureDetails.getEnterPipStateForPackage(context, uid,
|
||||
@@ -122,7 +123,13 @@ public class PictureInPictureDetails extends AppInfoWithHeader
|
||||
int logCategory = newState
|
||||
? MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW
|
||||
: MetricsEvent.APP_PICTURE_IN_PICTURE_DENY;
|
||||
FeatureFactory.getFactory(getContext())
|
||||
.getMetricsFeatureProvider().action(getContext(), logCategory, packageName);
|
||||
final MetricsFeatureProvider metricsFeatureProvider =
|
||||
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
|
||||
metricsFeatureProvider.action(
|
||||
metricsFeatureProvider.getAttribution(getActivity()),
|
||||
logCategory,
|
||||
getMetricsCategory(),
|
||||
packageName,
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ import com.android.settingslib.applications.ApplicationsState;
|
||||
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||
import com.android.settingslib.applications.ApplicationsState.Callbacks;
|
||||
import com.android.settingslib.applications.ApplicationsState.Session;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settingslib.search.SearchIndexable;
|
||||
import com.android.settingslib.widget.FooterPreference;
|
||||
|
||||
@@ -126,8 +127,15 @@ public class PremiumSmsAccess extends EmptyTextSettings
|
||||
break;
|
||||
}
|
||||
if (category != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
|
||||
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(
|
||||
getContext(), category, packageName);
|
||||
// TODO(117860032): Category is wrong. It should be defined in SettingsEnums.
|
||||
final MetricsFeatureProvider metricsFeatureProvider =
|
||||
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
|
||||
metricsFeatureProvider.action(
|
||||
metricsFeatureProvider.getAttribution(getActivity()),
|
||||
category,
|
||||
getMetricsCategory(),
|
||||
packageName,
|
||||
smsState);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -214,7 +222,7 @@ public class PremiumSmsAccess extends EmptyTextSettings
|
||||
setIcon(mAppEntry.icon);
|
||||
}
|
||||
setEntries(R.array.security_settings_premium_sms_values);
|
||||
setEntryValues(new CharSequence[] {
|
||||
setEntryValues(new CharSequence[]{
|
||||
String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER),
|
||||
String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW),
|
||||
String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW),
|
||||
|
||||
@@ -29,6 +29,7 @@ import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
import com.android.settings.search.Indexable;
|
||||
import com.android.settings.utils.ManagedServiceSettings;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settingslib.search.SearchIndexable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -73,8 +74,14 @@ public class VrListenerSettings extends ManagedServiceSettings {
|
||||
void logSpecialPermissionChange(boolean enable, String packageName) {
|
||||
int logCategory = enable ? MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW
|
||||
: MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY;
|
||||
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(),
|
||||
logCategory, packageName);
|
||||
final MetricsFeatureProvider metricsFeatureProvider =
|
||||
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
|
||||
metricsFeatureProvider.action(
|
||||
metricsFeatureProvider.getAttribution(getActivity()),
|
||||
logCategory,
|
||||
getMetricsCategory(),
|
||||
packageName,
|
||||
0);
|
||||
}
|
||||
|
||||
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
|
||||
@@ -18,8 +18,8 @@ package com.android.settings.core.instrumentation;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.util.Pair;
|
||||
import android.util.StatsLog;
|
||||
import android.util.Pair;
|
||||
|
||||
import com.android.settingslib.core.instrumentation.LogWriter;
|
||||
|
||||
@@ -45,7 +45,7 @@ public class StatsLogWriter implements LogWriter {
|
||||
0 /* changedPreferenceIntValue */);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Override
|
||||
public void action(Context context, int action, Pair<Integer, Object>... taggedData) {
|
||||
action(SettingsEnums.PAGE_UNKNOWN /* attribution */,
|
||||
action,
|
||||
@@ -73,8 +73,7 @@ public class StatsLogWriter implements LogWriter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void action(Context context, int action, String pkg,
|
||||
Pair<Integer, Object>... taggedData) {
|
||||
public void action(Context context, int action, String pkg) {
|
||||
action(SettingsEnums.PAGE_UNKNOWN /* attribution */,
|
||||
action,
|
||||
SettingsEnums.PAGE_UNKNOWN /* pageId */,
|
||||
|
||||
@@ -19,12 +19,9 @@ package com.android.settings.dashboard.suggestions;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.service.settings.suggestions.Suggestion;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.android.settingslib.suggestions.SuggestionControllerMixinCompat;
|
||||
|
||||
/** Interface should be implemented if you have added new suggestions */
|
||||
public interface SuggestionFeatureProvider {
|
||||
|
||||
@@ -45,10 +42,4 @@ public interface SuggestionFeatureProvider {
|
||||
* Returns the {@link SharedPreferences} that holds metadata for suggestions.
|
||||
*/
|
||||
SharedPreferences getSharedPrefs(Context context);
|
||||
|
||||
/**
|
||||
* Dismisses a suggestion.
|
||||
*/
|
||||
void dismissSuggestion(Context context, SuggestionControllerMixinCompat suggestionMixin,
|
||||
Suggestion suggestion);
|
||||
}
|
||||
|
||||
@@ -20,12 +20,9 @@ import android.app.ActivityManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.service.settings.suggestions.Suggestion;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.Settings.NightDisplaySuggestionActivity;
|
||||
import com.android.settings.biometrics.fingerprint.FingerprintEnrollSuggestionActivity;
|
||||
import com.android.settings.biometrics.fingerprint.FingerprintSuggestionActivity;
|
||||
@@ -37,10 +34,6 @@ import com.android.settings.password.ScreenLockSuggestionActivity;
|
||||
import com.android.settings.wallpaper.WallpaperSuggestionActivity;
|
||||
import com.android.settings.wifi.calling.WifiCallingSuggestionActivity;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
import com.android.settingslib.suggestions.SuggestionControllerMixinCompat;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider {
|
||||
|
||||
@@ -95,16 +88,4 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
|
||||
mMetricsFeatureProvider = FeatureFactory.getFactory(appContext)
|
||||
.getMetricsFeatureProvider();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dismissSuggestion(Context context, SuggestionControllerMixinCompat mixin,
|
||||
Suggestion suggestion) {
|
||||
if (mixin == null || suggestion == null || context == null) {
|
||||
return;
|
||||
}
|
||||
mMetricsFeatureProvider.action(
|
||||
context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
|
||||
suggestion.getId());
|
||||
mixin.dismissSuggestion(suggestion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,16 +26,15 @@ import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.text.BidiFormatter;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Pair;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||
@@ -57,7 +56,7 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle
|
||||
private static final String KEY_BUILD_NUMBER = "build_number";
|
||||
|
||||
private final Activity mActivity;
|
||||
private final Fragment mFragment;
|
||||
private final InstrumentedPreferenceFragment mFragment;
|
||||
private final UserManager mUm;
|
||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
||||
|
||||
@@ -67,8 +66,8 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle
|
||||
private int mDevHitCountdown;
|
||||
private boolean mProcessingLastDevHit;
|
||||
|
||||
public BuildNumberPreferenceController(Context context, Activity activity, Fragment fragment,
|
||||
Lifecycle lifecycle) {
|
||||
public BuildNumberPreferenceController(Context context, Activity activity,
|
||||
InstrumentedPreferenceFragment fragment, Lifecycle lifecycle) {
|
||||
super(context);
|
||||
mActivity = activity;
|
||||
mFragment = fragment;
|
||||
@@ -145,7 +144,7 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle
|
||||
.setPackage(componentName.getPackageName())
|
||||
.setAction("com.android.settings.action.REQUEST_DEBUG_FEATURES");
|
||||
final ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(
|
||||
requestDebugFeatures, 0);
|
||||
requestDebugFeatures, 0);
|
||||
if (resolveInfo != null) {
|
||||
mContext.startActivity(requestDebugFeatures);
|
||||
return false;
|
||||
@@ -176,9 +175,11 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle
|
||||
enableDevelopmentSettings();
|
||||
}
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF,
|
||||
Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
|
||||
mProcessingLastDevHit ? 0 : 1));
|
||||
mMetricsFeatureProvider.getAttribution(mActivity),
|
||||
MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
|
||||
mFragment.getMetricsCategory(),
|
||||
null,
|
||||
mProcessingLastDevHit ? 0 : 1);
|
||||
} else if (mDevHitCountdown > 0
|
||||
&& mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER - 2)) {
|
||||
if (mDevHitToast != null) {
|
||||
@@ -191,10 +192,13 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle
|
||||
Toast.LENGTH_SHORT);
|
||||
mDevHitToast.show();
|
||||
}
|
||||
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF,
|
||||
Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
|
||||
0));
|
||||
mMetricsFeatureProvider.getAttribution(mActivity),
|
||||
MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
|
||||
mFragment.getMetricsCategory(),
|
||||
null,
|
||||
0);
|
||||
} else if (mDevHitCountdown < 0) {
|
||||
if (mDevHitToast != null) {
|
||||
mDevHitToast.cancel();
|
||||
@@ -203,9 +207,11 @@ public class BuildNumberPreferenceController extends AbstractPreferenceControlle
|
||||
Toast.LENGTH_LONG);
|
||||
mDevHitToast.show();
|
||||
mMetricsFeatureProvider.action(
|
||||
mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF,
|
||||
Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
|
||||
1));
|
||||
mMetricsFeatureProvider.getAttribution(mActivity),
|
||||
MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
|
||||
mFragment.getMetricsCategory(),
|
||||
null,
|
||||
1);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package com.android.settings.display;
|
||||
|
||||
import android.content.Context;
|
||||
import android.hardware.display.ColorDisplayManager;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
@@ -53,7 +54,8 @@ public class NightDisplayActivationPreferenceController extends TogglePreference
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
|
||||
: UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -18,6 +18,8 @@ package com.android.settings.display;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import android.hardware.display.ColorDisplayManager;
|
||||
|
||||
import androidx.preference.DropDownPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
@@ -39,7 +41,8 @@ public class NightDisplayAutoModePreferenceController extends BasePreferenceCont
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
|
||||
: UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,6 +20,8 @@ import android.content.Context;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import android.hardware.display.ColorDisplayManager;
|
||||
|
||||
import com.android.internal.app.ColorDisplayController;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
@@ -37,7 +39,8 @@ public class NightDisplayCustomEndTimePreferenceController extends BasePreferenc
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
|
||||
: UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,6 +20,8 @@ import android.content.Context;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import android.hardware.display.ColorDisplayManager;
|
||||
|
||||
import com.android.internal.app.ColorDisplayController;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
@@ -37,7 +39,8 @@ public class NightDisplayCustomStartTimePreferenceController extends BasePrefere
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
|
||||
: UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,7 +20,8 @@ import android.content.Context;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.android.internal.app.ColorDisplayController;
|
||||
import android.hardware.display.ColorDisplayManager;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settingslib.widget.FooterPreference;
|
||||
@@ -33,7 +34,8 @@ public class NightDisplayFooterPreferenceController extends BasePreferenceContro
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
|
||||
: UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package com.android.settings.display;
|
||||
|
||||
import android.content.Context;
|
||||
import android.hardware.display.ColorDisplayManager;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
@@ -37,7 +38,7 @@ public class NightDisplayIntensityPreferenceController extends SliderPreferenceC
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
if (!ColorDisplayController.isAvailable(mContext)) {
|
||||
if (!ColorDisplayManager.isNightDisplayAvailable(mContext)) {
|
||||
return UNSUPPORTED_ON_DEVICE;
|
||||
} else if (!mController.isActivated()) {
|
||||
return DISABLED_DEPENDENT_SETTING;
|
||||
@@ -54,7 +55,7 @@ public class NightDisplayIntensityPreferenceController extends SliderPreferenceC
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
final SeekBarPreference preference = (SeekBarPreference) screen.findPreference(
|
||||
getPreferenceKey());
|
||||
getPreferenceKey());
|
||||
preference.setContinuousUpdates(true);
|
||||
preference.setMax(getMaxSteps());
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ package com.android.settings.display;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import android.hardware.display.ColorDisplayManager;
|
||||
import com.android.internal.app.ColorDisplayController;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
@@ -42,7 +43,7 @@ public class NightDisplayPreferenceController extends AbstractPreferenceControll
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return ColorDisplayController.isAvailable(mContext);
|
||||
return ColorDisplayManager.isNightDisplayAvailable(mContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,6 +19,7 @@ package com.android.settings.display;
|
||||
import android.app.Dialog;
|
||||
import android.app.TimePickerDialog;
|
||||
import android.content.Context;
|
||||
import android.hardware.display.ColorDisplayManager;
|
||||
import android.os.Bundle;
|
||||
import android.provider.SearchIndexableResource;
|
||||
|
||||
@@ -178,7 +179,7 @@ public class NightDisplaySettings extends DashboardFragment
|
||||
return buildPreferenceControllers(context);
|
||||
}
|
||||
|
||||
private static List <AbstractPreferenceController> buildPreferenceControllers(Context context) {
|
||||
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
|
||||
final List<AbstractPreferenceController> controllers = new ArrayList<>(1);
|
||||
controllers.add(new NightDisplayFooterPreferenceController(context));
|
||||
return controllers;
|
||||
@@ -198,12 +199,12 @@ public class NightDisplaySettings extends DashboardFragment
|
||||
|
||||
@Override
|
||||
protected boolean isPageSearchEnabled(Context context) {
|
||||
return ColorDisplayController.isAvailable(context);
|
||||
return ColorDisplayManager.isNightDisplayAvailable(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AbstractPreferenceController> createPreferenceControllers(
|
||||
Context context) {
|
||||
Context context) {
|
||||
return buildPreferenceControllers(context);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.app.job.JobParameters;
|
||||
import android.app.job.JobScheduler;
|
||||
import android.app.job.JobService;
|
||||
import android.app.job.JobWorkItem;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.ComponentName;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
@@ -35,7 +36,6 @@ import android.os.StatsDimensionsValue;
|
||||
import android.os.UserManager;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.GuardedBy;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -146,20 +146,18 @@ public class AnomalyDetectionJobService extends JobService {
|
||||
final int uid = extractUidFromStatsDimensionsValue(intentDimsValue);
|
||||
final boolean autoFeatureOn = powerUsageFeatureProvider.isSmartBatterySupported()
|
||||
? Settings.Global.getInt(contentResolver,
|
||||
Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON
|
||||
Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON
|
||||
: Settings.Global.getInt(contentResolver,
|
||||
Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON) == ON;
|
||||
final String packageName = batteryUtils.getPackageName(uid);
|
||||
final long versionCode = batteryUtils.getAppLongVersionCode(packageName);
|
||||
|
||||
final String versionedPackage = packageName + "/" + versionCode;
|
||||
if (batteryUtils.shouldHideAnomaly(powerWhitelistBackend, uid, anomalyInfo)) {
|
||||
metricsFeatureProvider.action(context,
|
||||
metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
|
||||
packageName,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE,
|
||||
anomalyInfo.anomalyType),
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
|
||||
versionCode));
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
versionedPackage,
|
||||
anomalyInfo.anomalyType);
|
||||
} else {
|
||||
if (autoFeatureOn && anomalyInfo.autoRestriction) {
|
||||
// Auto restrict this app
|
||||
@@ -173,13 +171,11 @@ public class AnomalyDetectionJobService extends JobService {
|
||||
AnomalyDatabaseHelper.State.NEW,
|
||||
timeMs);
|
||||
}
|
||||
metricsFeatureProvider.action(context,
|
||||
metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
|
||||
packageName,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE,
|
||||
anomalyInfo.anomalyType),
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
|
||||
versionCode));
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
versionedPackage,
|
||||
anomalyInfo.anomalyType);
|
||||
}
|
||||
|
||||
} catch (NullPointerException | IndexOutOfBoundsException e) {
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
package com.android.settings.fuelgauge.batterytip.actions;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
@@ -64,15 +64,18 @@ public class RestrictAppAction extends BatteryTipAction {
|
||||
AppOpsManager.MODE_IGNORED);
|
||||
if (CollectionUtils.isEmpty(appInfo.anomalyTypes)) {
|
||||
// Only log context if there is no anomaly type
|
||||
mMetricsFeatureProvider.action(mContext,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey));
|
||||
mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP,
|
||||
metricsKey,
|
||||
packageName,
|
||||
0);
|
||||
} else {
|
||||
for (int type : appInfo.anomalyTypes) {
|
||||
mMetricsFeatureProvider.action(mContext,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey),
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, type));
|
||||
mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP,
|
||||
metricsKey,
|
||||
packageName,
|
||||
type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
package com.android.settings.fuelgauge.batterytip.actions;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
@@ -50,8 +50,11 @@ public class UnrestrictAppAction extends BatteryTipAction {
|
||||
// Clear force app standby, then app can run in the background
|
||||
mBatteryUtils.setForceAppStandby(appInfo.uid, appInfo.packageName,
|
||||
AppOpsManager.MODE_ALLOWED);
|
||||
mMetricsFeatureProvider.action(mContext,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, appInfo.packageName,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey));
|
||||
mMetricsFeatureProvider.action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP,
|
||||
metricsKey,
|
||||
appInfo.packageName,
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
|
||||
package com.android.settings.fuelgauge.batterytip.tips;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.icu.text.ListFormatter;
|
||||
import android.os.Parcel;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
@@ -126,12 +126,12 @@ public class RestrictAppTip extends BatteryTip {
|
||||
for (int i = 0, size = mRestrictAppList.size(); i < size; i++) {
|
||||
final AppInfo appInfo = mRestrictAppList.get(i);
|
||||
for (Integer anomalyType : appInfo.anomalyTypes) {
|
||||
metricsFeatureProvider.action(context,
|
||||
metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
appInfo.packageName,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, anomalyType));
|
||||
anomalyType);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import android.widget.BaseAdapter;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
import androidx.loader.content.Loader;
|
||||
|
||||
@@ -109,9 +110,12 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
|
||||
}
|
||||
}
|
||||
|
||||
//TODO(b/111822376): implement sorting mechanism.
|
||||
private void sortCards(List<ContextualCard> cards) {
|
||||
@VisibleForTesting
|
||||
List<ContextualCard> sortCards(List<ContextualCard> cards) {
|
||||
//take mContextualCards as the source and do the ranking based on the rule.
|
||||
return cards.stream()
|
||||
.sorted((c1, c2) -> Double.compare(c2.getRankingScore(), c1.getRankingScore()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -127,10 +131,9 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
|
||||
allCards.addAll(
|
||||
updateList.values().stream().flatMap(List::stream).collect(Collectors.toList()));
|
||||
|
||||
sortCards(allCards);
|
||||
//replace with the new data
|
||||
mContextualCards.clear();
|
||||
mContextualCards.addAll(allCards);
|
||||
mContextualCards.addAll(sortCards(allCards));
|
||||
|
||||
loadCardControllers();
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.homepage.contextualcards.conditional;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.settings.homepage.contextualcards.ContextualCard;
|
||||
|
||||
/**
|
||||
@@ -26,6 +28,9 @@ import com.android.settings.homepage.contextualcards.ContextualCard;
|
||||
*/
|
||||
public class ConditionalContextualCard extends ContextualCard {
|
||||
|
||||
@VisibleForTesting
|
||||
static final double UNSUPPORTED_RANKING_SCORE = -100.0;
|
||||
|
||||
private final long mConditionId;
|
||||
private final int mMetricsConstant;
|
||||
private final CharSequence mActionText;
|
||||
@@ -83,6 +88,7 @@ public class ConditionalContextualCard extends ContextualCard {
|
||||
}
|
||||
|
||||
public ConditionalContextualCard build() {
|
||||
setRankingScore(UNSUPPORTED_RANKING_SCORE);
|
||||
return new ConditionalContextualCard(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,12 +22,16 @@ import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME
|
||||
import static android.system.OsConstants.AF_INET;
|
||||
import static android.system.OsConstants.AF_INET6;
|
||||
|
||||
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
||||
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.net.NetworkUtils;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.provider.Settings;
|
||||
import android.system.Os;
|
||||
import android.text.Editable;
|
||||
@@ -43,6 +47,7 @@ import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.preference.PreferenceViewHolder;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
@@ -50,6 +55,8 @@ import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.utils.AnnotationSpan;
|
||||
import com.android.settingslib.CustomDialogPreferenceCompat;
|
||||
import com.android.settingslib.HelpUtils;
|
||||
import com.android.settingslib.RestrictedLockUtils;
|
||||
import com.android.settingslib.RestrictedLockUtilsInternal;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@@ -99,19 +106,23 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
|
||||
|
||||
public PrivateDnsModeDialogPreference(Context context) {
|
||||
super(context);
|
||||
initialize();
|
||||
}
|
||||
|
||||
public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
initialize();
|
||||
}
|
||||
|
||||
public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
initialize();
|
||||
}
|
||||
|
||||
public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr,
|
||||
int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
initialize();
|
||||
}
|
||||
|
||||
private final AnnotationSpan.LinkInfo mUrlLinkInfo = new AnnotationSpan.LinkInfo(
|
||||
@@ -129,6 +140,30 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
|
||||
}
|
||||
});
|
||||
|
||||
private void initialize() {
|
||||
// Add the "Restricted" icon resource so that if the preference is disabled by the
|
||||
// admin, an information button will be shown.
|
||||
setWidgetLayoutResource(R.layout.restricted_icon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
||||
super.onBindViewHolder(holder);
|
||||
if (isDisabledByAdmin()) {
|
||||
// If the preference is disabled by the admin, set the inner item as enabled so
|
||||
// it could act as a click target. The preference itself will have been disabled
|
||||
// by the controller.
|
||||
holder.itemView.setEnabled(true);
|
||||
}
|
||||
|
||||
final View restrictedIcon = holder.findViewById(R.id.restricted_icon);
|
||||
if (restrictedIcon != null) {
|
||||
// Show the "Restricted" icon if, and only if, the preference was disabled by
|
||||
// the admin.
|
||||
restrictedIcon.setVisibility(isDisabledByAdmin() ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onBindDialogView(View view) {
|
||||
final Context context = getContext();
|
||||
@@ -202,6 +237,28 @@ public class PrivateDnsModeDialogPreference extends CustomDialogPreferenceCompat
|
||||
updateDialogInfo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void performClick() {
|
||||
EnforcedAdmin enforcedAdmin = getEnforcedAdmin();
|
||||
|
||||
if (enforcedAdmin == null) {
|
||||
// If the restriction is not restricted by admin, continue as usual.
|
||||
super.performClick();
|
||||
} else {
|
||||
// Show a dialog explaining to the user why they cannot change the preference.
|
||||
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), enforcedAdmin);
|
||||
}
|
||||
}
|
||||
|
||||
private EnforcedAdmin getEnforcedAdmin() {
|
||||
return RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
|
||||
getContext(), UserManager.DISALLOW_CONFIG_PRIVATE_DNS, UserHandle.myUserId());
|
||||
}
|
||||
|
||||
private boolean isDisabledByAdmin() {
|
||||
return getEnforcedAdmin() != null;
|
||||
}
|
||||
|
||||
private Button getSaveButton() {
|
||||
final AlertDialog dialog = (AlertDialog) getDialog();
|
||||
if (dialog == null) {
|
||||
|
||||
@@ -143,7 +143,6 @@ public class PrivateDnsPreferenceController extends BasePreferenceController
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
super.updateState(preference);
|
||||
//TODO(b/112982691): Add policy transparency explaining why this setting is disabled.
|
||||
preference.setEnabled(!isManagedByAdmin());
|
||||
}
|
||||
|
||||
|
||||
@@ -50,6 +50,9 @@ public class BiometricFragment extends InstrumentedFragment {
|
||||
private Executor mClientExecutor;
|
||||
private AuthenticationCallback mClientCallback;
|
||||
|
||||
// Re-settable by the application.
|
||||
private int mUserId;
|
||||
|
||||
// Created/Initialized once and retained
|
||||
private final Handler mHandler = new Handler(Looper.getMainLooper());
|
||||
private PromptInfo mPromptInfo;
|
||||
@@ -96,6 +99,10 @@ public class BiometricFragment extends InstrumentedFragment {
|
||||
mClientCallback = callback;
|
||||
}
|
||||
|
||||
public void setUser(int userId) {
|
||||
mUserId = userId;
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
if (mCancellationSignal != null) {
|
||||
mCancellationSignal.cancel();
|
||||
@@ -126,8 +133,8 @@ public class BiometricFragment extends InstrumentedFragment {
|
||||
mCancellationSignal = new CancellationSignal();
|
||||
|
||||
// TODO: CC doesn't use crypto for now
|
||||
mBiometricPrompt.authenticate(mCancellationSignal, mClientExecutor,
|
||||
mAuthenticationCallback);
|
||||
mBiometricPrompt.authenticateUser(mCancellationSignal, mClientExecutor,
|
||||
mAuthenticationCallback, mUserId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,9 +20,9 @@ package com.android.settings.password;
|
||||
import android.app.Activity;
|
||||
import android.app.KeyguardManager;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.trust.TrustManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.hardware.biometrics.BiometricConstants;
|
||||
import android.hardware.biometrics.BiometricManager;
|
||||
import android.hardware.biometrics.BiometricPrompt;
|
||||
import android.hardware.biometrics.BiometricPrompt.AuthenticationCallback;
|
||||
@@ -84,13 +84,13 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
||||
private DevicePolicyManager mDevicePolicyManager;
|
||||
private LockPatternUtils mLockPatternUtils;
|
||||
private UserManager mUserManager;
|
||||
private TrustManager mTrustManager;
|
||||
private ChooseLockSettingsHelper mChooseLockSettingsHelper;
|
||||
private Handler mHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
private String mTitle;
|
||||
private String mDetails;
|
||||
private int mUserId;
|
||||
private int mEffectiveUserId;
|
||||
private int mCredentialMode;
|
||||
private boolean mGoingToBackground;
|
||||
|
||||
@@ -108,10 +108,16 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
||||
showConfirmCredentials();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
|
||||
mTrustManager.setDeviceLockedForUser(mUserId, false);
|
||||
|
||||
ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils, mUserManager,
|
||||
mUserId);
|
||||
ConfirmDeviceCredentialUtils.checkForPendingIntent(
|
||||
ConfirmDeviceCredentialActivity.this);
|
||||
|
||||
setResult(Activity.RESULT_OK);
|
||||
finish();
|
||||
}
|
||||
@@ -124,6 +130,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
||||
mBiometricManager = getSystemService(BiometricManager.class);
|
||||
mDevicePolicyManager = getSystemService(DevicePolicyManager.class);
|
||||
mUserManager = UserManager.get(this);
|
||||
mTrustManager = getSystemService(TrustManager.class);
|
||||
mLockPatternUtils = new LockPatternUtils(this);
|
||||
|
||||
Intent intent = getIntent();
|
||||
@@ -134,7 +141,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
||||
boolean frp = KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction());
|
||||
|
||||
mUserId = UserHandle.myUserId();
|
||||
mEffectiveUserId = mUserManager.getCredentialOwnerProfile(mUserId);
|
||||
final int effectiveUserId = mUserManager.getCredentialOwnerProfile(mUserId);
|
||||
if (isInternalActivity()) {
|
||||
try {
|
||||
mUserId = Utils.getUserIdFromBundle(this, intent.getExtras());
|
||||
@@ -162,21 +169,23 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
||||
} else if (isManagedProfile && isInternalActivity()
|
||||
&& !lockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) {
|
||||
mCredentialMode = CREDENTIAL_MANAGED;
|
||||
if (isBiometricAllowed()) {
|
||||
if (isBiometricAllowed(effectiveUserId)) {
|
||||
showBiometricPrompt();
|
||||
launchedBiometric = true;
|
||||
} else {
|
||||
showConfirmCredentials();
|
||||
launchedCDC = true;
|
||||
}
|
||||
} else {
|
||||
mCredentialMode = CREDENTIAL_NORMAL;
|
||||
if (isBiometricAllowed()) {
|
||||
if (isBiometricAllowed(effectiveUserId)) {
|
||||
// Don't need to check if biometrics / pin/pattern/pass are enrolled. It will go to
|
||||
// onAuthenticationError and do the right thing automatically.
|
||||
showBiometricPrompt();
|
||||
launchedBiometric = true;
|
||||
} else {
|
||||
showConfirmCredentials();
|
||||
launchedCDC = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,19 +226,20 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
||||
// credential. Otherwise, biometric can't unlock fbe/keystore through
|
||||
// verifyTiedProfileChallenge. In such case, we also wanna show the user message that
|
||||
// biometric is disabled due to device restart.
|
||||
private boolean isStrongAuthRequired() {
|
||||
return !mLockPatternUtils.isBiometricAllowedForUser(mEffectiveUserId)
|
||||
private boolean isStrongAuthRequired(int effectiveUserId) {
|
||||
return !mLockPatternUtils.isBiometricAllowedForUser(effectiveUserId)
|
||||
|| !mUserManager.isUserUnlocked(mUserId);
|
||||
}
|
||||
|
||||
private boolean isBiometricDisabledByAdmin() {
|
||||
private boolean isBiometricDisabledByAdmin(int effectiveUserId) {
|
||||
final int disabledFeatures =
|
||||
mDevicePolicyManager.getKeyguardDisabledFeatures(null, mEffectiveUserId);
|
||||
mDevicePolicyManager.getKeyguardDisabledFeatures(null, effectiveUserId);
|
||||
return (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_BIOMETRICS) != 0;
|
||||
}
|
||||
|
||||
private boolean isBiometricAllowed() {
|
||||
return !isStrongAuthRequired() && !isBiometricDisabledByAdmin();
|
||||
private boolean isBiometricAllowed(int effectiveUserId) {
|
||||
return !isStrongAuthRequired(effectiveUserId)
|
||||
&& !isBiometricDisabledByAdmin(effectiveUserId);
|
||||
}
|
||||
|
||||
private void showBiometricPrompt() {
|
||||
@@ -250,6 +260,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
|
||||
newFragment = true;
|
||||
}
|
||||
mBiometricFragment.setCallbacks(mExecutor, mAuthenticationCallback);
|
||||
mBiometricFragment.setUser(mUserId);
|
||||
|
||||
if (newFragment) {
|
||||
getSupportFragmentManager().beginTransaction()
|
||||
|
||||
@@ -18,17 +18,12 @@
|
||||
package com.android.settings.password;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityOptions;
|
||||
import android.app.Dialog;
|
||||
import android.app.IActivityManager;
|
||||
import android.app.KeyguardManager;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.trust.TrustManager;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentSender;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.PorterDuff;
|
||||
@@ -36,7 +31,6 @@ import android.graphics.drawable.ColorDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserManager;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
@@ -199,29 +193,6 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
|
||||
public void startEnterAnimation() {
|
||||
}
|
||||
|
||||
protected void checkForPendingIntent() {
|
||||
int taskId = getActivity().getIntent().getIntExtra(Intent.EXTRA_TASK_ID, -1);
|
||||
if (taskId != -1) {
|
||||
try {
|
||||
IActivityManager activityManager = ActivityManager.getService();
|
||||
final ActivityOptions options = ActivityOptions.makeBasic();
|
||||
activityManager.startActivityFromRecents(taskId, options.toBundle());
|
||||
return;
|
||||
} catch (RemoteException e) {
|
||||
// Do nothing.
|
||||
}
|
||||
}
|
||||
IntentSender intentSender = getActivity().getIntent()
|
||||
.getParcelableExtra(Intent.EXTRA_INTENT);
|
||||
if (intentSender != null) {
|
||||
try {
|
||||
getActivity().startIntentSenderForResult(intentSender, -1, null, 0, 0, 0);
|
||||
} catch (IntentSender.SendIntentException e) {
|
||||
/* ignore */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void setWorkChallengeBackground(View baseView, int userId) {
|
||||
View mainContent = getActivity().findViewById(com.android.settings.R.id.main_content);
|
||||
if (mainContent != null) {
|
||||
@@ -246,15 +217,6 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
|
||||
}
|
||||
}
|
||||
|
||||
protected void reportSuccessfulAttempt() {
|
||||
mLockPatternUtils.reportSuccessfulPasswordAttempt(mEffectiveUserId);
|
||||
if (mUserManager.isManagedProfile(mEffectiveUserId)) {
|
||||
// Keyguard is responsible to disable StrongAuth for primary user. Disable StrongAuth
|
||||
// for work challenge only here.
|
||||
mLockPatternUtils.userPresent(mEffectiveUserId);
|
||||
}
|
||||
}
|
||||
|
||||
protected void reportFailedAttempt() {
|
||||
updateErrorMessage(
|
||||
mLockPatternUtils.getCurrentFailedPasswordAttempts(mEffectiveUserId) + 1);
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (C) 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.settings.password;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityOptions;
|
||||
import android.app.IActivityManager;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentSender;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserManager;
|
||||
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
|
||||
/** Class containing methods shared between CDCA and CDCBA */
|
||||
public class ConfirmDeviceCredentialUtils {
|
||||
|
||||
public static void checkForPendingIntent(Activity activity) {
|
||||
// See Change-Id I52c203735fa9b53fd2f7df971824747eeb930f36 for context
|
||||
int taskId = activity.getIntent().getIntExtra(Intent.EXTRA_TASK_ID, -1);
|
||||
if (taskId != -1) {
|
||||
try {
|
||||
IActivityManager activityManager = ActivityManager.getService();
|
||||
final ActivityOptions options = ActivityOptions.makeBasic();
|
||||
activityManager.startActivityFromRecents(taskId, options.toBundle());
|
||||
return;
|
||||
} catch (RemoteException e) {
|
||||
// Do nothing.
|
||||
}
|
||||
}
|
||||
IntentSender intentSender = activity.getIntent().getParcelableExtra(Intent.EXTRA_INTENT);
|
||||
if (intentSender != null) {
|
||||
try {
|
||||
activity.startIntentSenderForResult(intentSender, -1, null, 0, 0, 0);
|
||||
} catch (IntentSender.SendIntentException e) {
|
||||
/* ignore */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void reportSuccessfulAttempt(LockPatternUtils utils, UserManager userManager,
|
||||
int userId) {
|
||||
utils.reportSuccessfulPasswordAttempt(userId);
|
||||
if (userManager.isManagedProfile(userId)) {
|
||||
// Keyguard is responsible to disable StrongAuth for primary user. Disable StrongAuth
|
||||
// for work challenge only here.
|
||||
utils.userPresent(userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -434,10 +434,11 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
|
||||
mPasswordEntryInputDisabler.setInputEnabled(true);
|
||||
if (matched) {
|
||||
if (newResult) {
|
||||
reportSuccessfulAttempt();
|
||||
ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils,
|
||||
mUserManager, mEffectiveUserId);
|
||||
}
|
||||
startDisappearAnimation(intent);
|
||||
checkForPendingIntent();
|
||||
ConfirmDeviceCredentialUtils.checkForPendingIntent(getActivity());
|
||||
} else {
|
||||
if (timeoutMs > 0) {
|
||||
refreshLockScreen();
|
||||
|
||||
@@ -487,10 +487,11 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
|
||||
mLockPatternView.setEnabled(true);
|
||||
if (matched) {
|
||||
if (newResult) {
|
||||
reportSuccessfulAttempt();
|
||||
ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils,
|
||||
mUserManager, mEffectiveUserId);
|
||||
}
|
||||
startDisappearAnimation(intent);
|
||||
checkForPendingIntent();
|
||||
ConfirmDeviceCredentialUtils.checkForPendingIntent(getActivity());
|
||||
} else {
|
||||
if (timeoutMs > 0) {
|
||||
refreshLockScreen();
|
||||
|
||||
@@ -17,24 +17,20 @@
|
||||
package com.android.settings.slices;
|
||||
|
||||
import static com.android.settings.bluetooth.BluetoothSliceBuilder.ACTION_BLUETOOTH_SLICE_CHANGED;
|
||||
import static com.android.settings.flashlight.FlashlightSliceBuilder
|
||||
.ACTION_FLASHLIGHT_SLICE_CHANGED;
|
||||
import static com.android.settings.network.telephony.Enhanced4gLteSliceHelper
|
||||
.ACTION_ENHANCED_4G_LTE_CHANGED;
|
||||
import static com.android.settings.flashlight.FlashlightSliceBuilder.ACTION_FLASHLIGHT_SLICE_CHANGED;
|
||||
import static com.android.settings.network.telephony.Enhanced4gLteSliceHelper.ACTION_ENHANCED_4G_LTE_CHANGED;
|
||||
import static com.android.settings.notification.ZenModeSliceBuilder.ACTION_ZEN_MODE_SLICE_CHANGED;
|
||||
import static com.android.settings.slices.SettingsSliceProvider.ACTION_COPY;
|
||||
import static com.android.settings.slices.SettingsSliceProvider.ACTION_SLIDER_CHANGED;
|
||||
import static com.android.settings.slices.SettingsSliceProvider.ACTION_TOGGLE_CHANGED;
|
||||
import static com.android.settings.slices.SettingsSliceProvider.ACTION_COPY;
|
||||
import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY;
|
||||
import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLATFORM_DEFINED;
|
||||
import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_CHANGED;
|
||||
import static com.android.settings.wifi.calling.WifiCallingSliceHelper
|
||||
.ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED;
|
||||
import static com.android.settings.wifi.calling.WifiCallingSliceHelper
|
||||
.ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY;
|
||||
import static com.android.settings.wifi.calling.WifiCallingSliceHelper
|
||||
.ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED;
|
||||
import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED;
|
||||
import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY;
|
||||
import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.app.slice.Slice;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ContentResolver;
|
||||
@@ -44,7 +40,6 @@ import android.net.Uri;
|
||||
import android.provider.SettingsSlicesContract;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.bluetooth.BluetoothSliceBuilder;
|
||||
@@ -216,12 +211,11 @@ public class SliceBroadcastReceiver extends BroadcastReceiver {
|
||||
* follows the pattern in SharedPreferenceLogger.
|
||||
*/
|
||||
private void logSliceValueChange(Context context, String sliceKey, int newValue) {
|
||||
final Pair<Integer, Object> namePair = Pair.create(
|
||||
MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceKey);
|
||||
final Pair<Integer, Object> valuePair = Pair.create(
|
||||
MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, newValue);
|
||||
FeatureFactory.getFactory(context).getMetricsFeatureProvider()
|
||||
.action(context, MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, namePair, valuePair);
|
||||
.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
sliceKey, newValue);
|
||||
}
|
||||
|
||||
private BasePreferenceController getPreferenceController(Context context, String key) {
|
||||
|
||||
@@ -22,6 +22,7 @@ import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLAT
|
||||
|
||||
import android.annotation.ColorInt;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -77,12 +78,12 @@ public class SliceBuilderUtils {
|
||||
public static Slice buildSlice(Context context, SliceData sliceData) {
|
||||
Log.d(TAG, "Creating slice for: " + sliceData.getPreferenceController());
|
||||
final BasePreferenceController controller = getPreferenceController(context, sliceData);
|
||||
final Pair<Integer, Object> sliceNamePair =
|
||||
Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceData.getKey());
|
||||
// Log Slice requests using the same schema as SharedPreferenceLogger (but with a different
|
||||
// action name).
|
||||
FeatureFactory.getFactory(context).getMetricsFeatureProvider()
|
||||
.action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair);
|
||||
.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
sliceData.getKey(),
|
||||
0);
|
||||
|
||||
if (!controller.isAvailable()) {
|
||||
// Cannot guarantee setting page is accessible, let the presenter handle error case.
|
||||
|
||||
@@ -19,6 +19,8 @@ package com.android.settings.wifi;
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
@@ -37,14 +39,16 @@ import java.util.List;
|
||||
public class NetworkRequestDialogFragment extends InstrumentedDialogFragment implements
|
||||
DialogInterface.OnClickListener {
|
||||
|
||||
/** Message sent to us to stop scanning wifi and pop up timeout dialog. */
|
||||
private static final int MESSAGE_STOP_SCAN_WIFI_LIST = 0;
|
||||
|
||||
/** Delayed time to stop scanning wifi. */
|
||||
private static final int DELAY_TIME_STOP_SCAN_MS = 30*1000;
|
||||
|
||||
private List<AccessPoint> mAccessPointList;
|
||||
|
||||
public static NetworkRequestDialogFragment newInstance(int uid, String packageName) {
|
||||
Bundle args = new Bundle();
|
||||
args.putInt("uid", uid);
|
||||
args.putString("packageName", packageName);
|
||||
public static NetworkRequestDialogFragment newInstance() {
|
||||
NetworkRequestDialogFragment dialogFragment = new NetworkRequestDialogFragment();
|
||||
dialogFragment.setArguments(args);
|
||||
return dialogFragment;
|
||||
}
|
||||
|
||||
@@ -84,6 +88,44 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
|
||||
mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
// TODO(b/117399926): Starts to scan current WiFi.
|
||||
|
||||
// Sets time-out to stop scanning.
|
||||
mHandler.sendEmptyMessageDelayed(MESSAGE_STOP_SCAN_WIFI_LIST, DELAY_TIME_STOP_SCAN_MS);
|
||||
}
|
||||
|
||||
private Handler mHandler = new Handler() {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case MESSAGE_STOP_SCAN_WIFI_LIST:
|
||||
removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
|
||||
stopScanningAndPopTimeoutDialog();
|
||||
break;
|
||||
default:
|
||||
// Do nothing.
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
protected void stopScanningAndPopTimeoutDialog() {
|
||||
dismiss();
|
||||
NetworkRequestTimeoutDialogFragment fragment = NetworkRequestTimeoutDialogFragment.newInstance();
|
||||
fragment.show(getActivity().getSupportFragmentManager(), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG;
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (C) 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.settings.wifi;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
|
||||
public class NetworkRequestTimeoutDialogFragment extends InstrumentedDialogFragment implements
|
||||
DialogInterface.OnClickListener {
|
||||
|
||||
public static NetworkRequestTimeoutDialogFragment newInstance() {
|
||||
NetworkRequestTimeoutDialogFragment fragment = new NetworkRequestTimeoutDialogFragment();
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
|
||||
.setMessage(R.string.network_connection_timeout_dialog_message)
|
||||
.setPositiveButton(R.string.network_connection_timeout_dialog_ok, this)
|
||||
.setNegativeButton(R.string.cancel, null);
|
||||
return builder.create();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
switch (which) {
|
||||
case DialogInterface.BUTTON_POSITIVE:
|
||||
startScanningDialog();
|
||||
break;
|
||||
case DialogInterface.BUTTON_NEGATIVE:
|
||||
default:
|
||||
// Do nothing.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected void startScanningDialog() {
|
||||
NetworkRequestDialogFragment fragment = NetworkRequestDialogFragment.newInstance();
|
||||
fragment.show(getActivity().getSupportFragmentManager(), null);
|
||||
}
|
||||
}
|
||||
@@ -18,12 +18,10 @@ package com.android.settings.applications;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.Context;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
@@ -54,12 +52,20 @@ public class UsageAccessDetailsTest {
|
||||
@Test
|
||||
public void logSpecialPermissionChange() {
|
||||
mFragment.logSpecialPermissionChange(true, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW,
|
||||
mFragment.getMetricsCategory(),
|
||||
"app",
|
||||
0);
|
||||
|
||||
mFragment.logSpecialPermissionChange(false, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY,
|
||||
mFragment.getMetricsCategory(),
|
||||
"app",
|
||||
0);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.when;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.Application;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
@@ -42,10 +43,9 @@ import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.UserManager;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.widget.ActionButtonPreference;
|
||||
@@ -377,12 +377,17 @@ public class AppButtonsPreferenceControllerTest {
|
||||
* The test fragment which implements
|
||||
* {@link ButtonActionDialogFragment.AppButtonsDialogListener}
|
||||
*/
|
||||
public static class TestFragment extends Fragment
|
||||
public static class TestFragment extends InstrumentedPreferenceFragment
|
||||
implements ButtonActionDialogFragment.AppButtonsDialogListener {
|
||||
|
||||
@Override
|
||||
public void handleDialogClick(int type) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return SettingsEnums.PAGE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,12 +19,10 @@ package com.android.settings.applications.appinfo;
|
||||
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Matchers.nullable;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager.LayoutParams;
|
||||
|
||||
@@ -75,12 +73,14 @@ public class DrawOverlayDetailsTest {
|
||||
when(mFragment.getContext()).thenReturn(RuntimeEnvironment.application);
|
||||
|
||||
mFragment.logSpecialPermissionChange(true, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW,
|
||||
mFragment.getMetricsCategory(), "app", 0);
|
||||
|
||||
mFragment.logSpecialPermissionChange(false, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY,
|
||||
mFragment.getMetricsCategory(), "app", 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -17,15 +17,14 @@
|
||||
package com.android.settings.applications.defaultapps;
|
||||
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.os.UserManager;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
@@ -89,10 +88,12 @@ public class DefaultAppPickerFragmentTest {
|
||||
mFragment.onAttach((Context) mActivity);
|
||||
mFragment.onRadioButtonConfirmed("test_pkg");
|
||||
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP),
|
||||
eq("test_pkg"),
|
||||
any(Pair.class));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP,
|
||||
mFragment.getMetricsCategory(),
|
||||
"test_pkg",
|
||||
0);
|
||||
}
|
||||
|
||||
public static class TestFragment extends DefaultAppPickerFragment {
|
||||
|
||||
@@ -16,10 +16,8 @@
|
||||
|
||||
package com.android.settings.applications.specialaccess.deviceadmin;
|
||||
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.doNothing;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.never;
|
||||
@@ -29,7 +27,7 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.app.admin.DeviceAdminInfo;
|
||||
import android.content.Context;
|
||||
import android.app.settings.SettingsEnums;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.fuelgauge.BatteryUtils;
|
||||
@@ -73,12 +71,20 @@ public class DeviceAdminAddTest {
|
||||
@Test
|
||||
public void logSpecialPermissionChange() {
|
||||
mDeviceAdminAdd.logSpecialPermissionChange(true, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
"app",
|
||||
0);
|
||||
|
||||
mDeviceAdminAdd.logSpecialPermissionChange(false, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
"app",
|
||||
0);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -18,11 +18,9 @@ package com.android.settings.applications.specialaccess.pictureinpicture;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.Context;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.pm.ActivityInfo;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
@@ -75,12 +73,20 @@ public class PictureInPictureDetailsTest {
|
||||
@Test
|
||||
public void logSpecialPermissionChange() {
|
||||
mFragment.logSpecialPermissionChange(true, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW,
|
||||
mFragment.getMetricsCategory(),
|
||||
"app",
|
||||
0);
|
||||
|
||||
mFragment.logSpecialPermissionChange(false, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_DENY), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_DENY,
|
||||
mFragment.getMetricsCategory(),
|
||||
"app",
|
||||
0);
|
||||
}
|
||||
|
||||
private boolean checkPackageHasPictureInPictureActivities(String packageName,
|
||||
|
||||
@@ -16,11 +16,9 @@
|
||||
|
||||
package com.android.settings.applications.specialaccess.premiumsms;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.Context;
|
||||
import android.app.settings.SettingsEnums;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.internal.telephony.SmsUsageMonitor;
|
||||
@@ -51,18 +49,29 @@ public class PremiumSmsAccessTest {
|
||||
public void logSpecialPermissionChange() {
|
||||
mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER,
|
||||
"app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK,
|
||||
mFragment.getMetricsCategory(),
|
||||
"app",
|
||||
SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER);
|
||||
|
||||
mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW,
|
||||
"app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY), eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY,
|
||||
mFragment.getMetricsCategory(),
|
||||
"app",
|
||||
SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW);
|
||||
|
||||
mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW,
|
||||
"app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW),
|
||||
eq("app"));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW,
|
||||
mFragment.getMetricsCategory(),
|
||||
"app",
|
||||
SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,11 +16,7 @@
|
||||
|
||||
package com.android.settings.applications.specialaccess.vrlistener;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.Context;
|
||||
import android.app.settings.SettingsEnums;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
@@ -47,11 +43,19 @@ public class VrListenerSettingsTest {
|
||||
@Test
|
||||
public void logSpecialPermissionChange() {
|
||||
mFragment.logSpecialPermissionChange(true, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW), eq("app"));
|
||||
mFeatureFactory.metricsFeatureProvider.action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
"app",
|
||||
0);
|
||||
|
||||
mFragment.logSpecialPermissionChange(false, "app");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
|
||||
eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY), eq("app"));
|
||||
mFeatureFactory.metricsFeatureProvider.action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
"app",
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,10 +18,6 @@ package com.android.settings.dashboard.suggestions;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
@@ -31,13 +27,10 @@ import android.content.pm.PackageManager;
|
||||
import android.hardware.fingerprint.FingerprintManager;
|
||||
import android.service.settings.suggestions.Suggestion;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowSecureSettings;
|
||||
import com.android.settingslib.drawer.CategoryKey;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
import com.android.settingslib.suggestions.SuggestionControllerMixinCompat;
|
||||
|
||||
import org.junit.After;
|
||||
@@ -49,9 +42,6 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(shadows = ShadowSecureSettings.class)
|
||||
public class SuggestionFeatureProviderImplTest {
|
||||
@@ -111,36 +101,8 @@ public class SuggestionFeatureProviderImplTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isSuggestionV2Enabled_isNotLowMemoryDevice_shouldReturnTrue() {
|
||||
public void isSuggestionEnabled_isNotLowMemoryDevice_shouldReturnTrue() {
|
||||
when(mActivityManager.isLowRamDevice()).thenReturn(false);
|
||||
assertThat(mProvider.isSuggestionEnabled(mContext)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dismissSuggestion_noControllerOrSuggestion_noop() {
|
||||
mProvider.dismissSuggestion(mContext, null, null);
|
||||
mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, null);
|
||||
mProvider.dismissSuggestion(mContext, null, new Suggestion.Builder("id").build());
|
||||
|
||||
verifyZeroInteractions(mFactory.metricsFeatureProvider);
|
||||
verifyZeroInteractions(mSuggestionControllerMixin);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dismissSuggestion_noContext_shouldDoNothing() {
|
||||
mProvider.dismissSuggestion(null, mSuggestionControllerMixin, mSuggestion);
|
||||
|
||||
verifyZeroInteractions(mFactory.metricsFeatureProvider);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dismissSuggestion_shouldLogAndDismiss() {
|
||||
mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, mSuggestion);
|
||||
|
||||
verify(mFactory.metricsFeatureProvider).action(
|
||||
eq(mContext),
|
||||
eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION),
|
||||
anyString());
|
||||
verify(mSuggestionControllerMixin).dismissSuggestion(mSuggestion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,12 +33,12 @@ import android.os.UserManager;
|
||||
import android.provider.Settings;
|
||||
import android.text.BidiFormatter;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||
@@ -64,7 +64,7 @@ public class BuildNumberPreferenceControllerTest {
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private Activity mActivity;
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private Fragment mFragment;
|
||||
private InstrumentedPreferenceFragment mFragment;
|
||||
@Mock(answer = RETURNS_DEEP_STUBS)
|
||||
private PreferenceScreen mScreen;
|
||||
|
||||
|
||||
@@ -3,17 +3,14 @@ package com.android.settings.display;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.ComponentName;
|
||||
import android.provider.Settings.Secure;
|
||||
|
||||
import com.android.internal.app.ColorDisplayController;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Settings.NightDisplaySuggestionActivity;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
@@ -25,16 +22,8 @@ import org.robolectric.annotation.Config;
|
||||
})
|
||||
public class NightDisplayPreferenceControllerTest {
|
||||
|
||||
private NightDisplayPreferenceController mPreferenceController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mPreferenceController = new NightDisplayPreferenceController(RuntimeEnvironment.application);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
mPreferenceController = null;
|
||||
SettingsShadowResources.reset();
|
||||
}
|
||||
|
||||
@@ -43,9 +32,7 @@ public class NightDisplayPreferenceControllerTest {
|
||||
final Application context = RuntimeEnvironment.application;
|
||||
Secure.putInt(context.getContentResolver(),
|
||||
Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_DISABLED);
|
||||
final ComponentName componentName =
|
||||
new ComponentName(context, NightDisplaySuggestionActivity.class);
|
||||
assertThat(mPreferenceController.isSuggestionComplete(context)).isFalse();
|
||||
assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -53,9 +40,7 @@ public class NightDisplayPreferenceControllerTest {
|
||||
final Application context = RuntimeEnvironment.application;
|
||||
Secure.putInt(context.getContentResolver(),
|
||||
Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_CUSTOM);
|
||||
final ComponentName componentName =
|
||||
new ComponentName(context, NightDisplaySuggestionActivity.class);
|
||||
assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue();
|
||||
assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -63,9 +48,7 @@ public class NightDisplayPreferenceControllerTest {
|
||||
final Application context = RuntimeEnvironment.application;
|
||||
Secure.putInt(context.getContentResolver(),
|
||||
Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_TWILIGHT);
|
||||
final ComponentName componentName =
|
||||
new ComponentName(context, NightDisplaySuggestionActivity.class);
|
||||
assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue();
|
||||
assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -74,9 +57,6 @@ public class NightDisplayPreferenceControllerTest {
|
||||
Secure.putInt(context.getContentResolver(),
|
||||
Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_DISABLED);
|
||||
SettingsShadowResources.overrideResource(R.bool.config_night_light_suggestion_enabled, false);
|
||||
|
||||
final ComponentName componentName =
|
||||
new ComponentName(context, NightDisplaySuggestionActivity.class);
|
||||
assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue();
|
||||
assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,13 +43,13 @@ import android.app.job.JobInfo;
|
||||
import android.app.job.JobParameters;
|
||||
import android.app.job.JobScheduler;
|
||||
import android.app.job.JobWorkItem;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Process;
|
||||
import android.os.StatsDimensionsValue;
|
||||
import android.os.UserManager;
|
||||
import android.util.Pair;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
@@ -174,11 +174,11 @@ public class AnomalyDetectionJobServiceTest {
|
||||
|
||||
verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
|
||||
anyInt(), anyLong());
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
|
||||
SYSTEM_PACKAGE,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE),
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE));
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
SYSTEM_PACKAGE + "/" + VERSION_CODE,
|
||||
ANOMALY_TYPE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -229,11 +229,11 @@ public class AnomalyDetectionJobServiceTest {
|
||||
|
||||
verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
|
||||
eq(AnomalyDatabaseHelper.State.AUTO_HANDLED), anyLong());
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
|
||||
SYSTEM_PACKAGE,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE),
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE));
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
SYSTEM_PACKAGE + "/" + VERSION_CODE,
|
||||
ANOMALY_TYPE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -254,11 +254,11 @@ public class AnomalyDetectionJobServiceTest {
|
||||
|
||||
verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
|
||||
eq(AnomalyDatabaseHelper.State.NEW), anyLong());
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
|
||||
SYSTEM_PACKAGE,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE),
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE));
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
SYSTEM_PACKAGE + "/" + VERSION_CODE,
|
||||
ANOMALY_TYPE);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.android.settings.fuelgauge.batterytip.actions;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.util.Pair;
|
||||
import android.app.settings.SettingsEnums;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.fuelgauge.BatteryUtils;
|
||||
@@ -91,16 +91,13 @@ public class RestrictAppActionTest {
|
||||
.setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_IGNORED);
|
||||
verify(mBatteryUtils)
|
||||
.setForceAppStandby(UID_2, PACKAGE_NAME_2, AppOpsManager.MODE_IGNORED);
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_1, Pair.create(
|
||||
MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY),
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY),
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_BT));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_1, 0);
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2,
|
||||
ANOMALY_WAKEUP);
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2,
|
||||
ANOMALY_BT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.android.settings.fuelgauge.batterytip.actions;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.util.Pair;
|
||||
import android.app.settings.SettingsEnums;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.fuelgauge.BatteryUtils;
|
||||
@@ -75,8 +75,11 @@ public class UnrestrictAppActionTest {
|
||||
|
||||
verify(mBatteryUtils)
|
||||
.setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_ALLOWED);
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, PACKAGE_NAME_1, Pair.create(
|
||||
MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY));
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP,
|
||||
METRICS_KEY,
|
||||
PACKAGE_NAME_1,
|
||||
0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ package com.android.settings.fuelgauge.batterytip.tips;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
@@ -26,11 +25,11 @@ import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Parcel;
|
||||
import android.util.Pair;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
@@ -99,7 +98,8 @@ public class RestrictAppTipTest {
|
||||
mUsageAppList.add(mAppInfo);
|
||||
mNewBatteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, mUsageAppList);
|
||||
mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList);
|
||||
mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>());
|
||||
mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE,
|
||||
new ArrayList<>());
|
||||
}
|
||||
|
||||
@After
|
||||
@@ -142,7 +142,7 @@ public class RestrictAppTipTest {
|
||||
@Test
|
||||
public void getSummary_stateNew_showRestrictSummary() {
|
||||
assertThat(mNewBatteryTip.getSummary(mContext))
|
||||
.isEqualTo("app has high background battery usage");
|
||||
.isEqualTo("app has high background battery usage");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -226,14 +226,16 @@ public class RestrictAppTipTest {
|
||||
|
||||
verify(mMetricsFeatureProvider).action(mContext,
|
||||
MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.NEW);
|
||||
verify(mMetricsFeatureProvider).action(mContext,
|
||||
verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
PACKAGE_NAME,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP));
|
||||
verify(mMetricsFeatureProvider).action(mContext,
|
||||
ANOMALY_WAKEUP);
|
||||
verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
PACKAGE_NAME,
|
||||
Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKELOCK));
|
||||
ANOMALY_WAKELOCK);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -242,7 +244,8 @@ public class RestrictAppTipTest {
|
||||
|
||||
verify(mMetricsFeatureProvider).action(mContext,
|
||||
MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.HANDLED);
|
||||
verify(mMetricsFeatureProvider, never()).action(any(), anyInt(), anyString(), any());
|
||||
verify(mMetricsFeatureProvider, never()).action(
|
||||
anyInt(), anyInt(), anyInt(), anyString(), anyInt());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.shadows.ShadowContentResolver;
|
||||
import org.robolectric.shadows.ShadowLog;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (C) 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.settings.homepage.contextualcards;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
public class ContextualCardManagerTest {
|
||||
|
||||
private Context mContext;
|
||||
private ContextualCardManager mManager;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
final ContextualCardsFragment fragment = new ContextualCardsFragment();
|
||||
mManager = new ContextualCardManager(mContext, fragment.getSettingsLifecycle());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sortCards_hasConditionalAndSliceCards_conditionalShouldAlwaysBeTheLast() {
|
||||
final String sliceUri = "content://com.android.settings.slices/action/flashlight";
|
||||
final List<ContextualCard> cards = new ArrayList<>();
|
||||
cards.add(new ConditionalContextualCard.Builder().build());
|
||||
cards.add(buildContextualCard(sliceUri));
|
||||
|
||||
final List<ContextualCard> sortedCards = mManager.sortCards(cards);
|
||||
|
||||
assertThat(sortedCards.get(cards.size() - 1).getCardType())
|
||||
.isEqualTo(ContextualCard.CardType.CONDITIONAL);
|
||||
}
|
||||
|
||||
private ContextualCard buildContextualCard(String sliceUri) {
|
||||
return new ContextualCard.Builder()
|
||||
.setName("test_name")
|
||||
.setSliceUri(Uri.parse(sliceUri))
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -14,10 +14,14 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.homepage.contextualcards;
|
||||
package com.android.settings.homepage.contextualcards.conditional;
|
||||
|
||||
import static com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard
|
||||
.UNSUPPORTED_RANKING_SCORE;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import com.android.settings.homepage.contextualcards.ContextualCard;
|
||||
import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
|
||||
@@ -39,4 +43,10 @@ public class ConditionalContextualCardTest {
|
||||
assertThat(new ConditionalContextualCard.Builder().build().getCardType())
|
||||
.isEqualTo(ContextualCard.CardType.CONDITIONAL);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getRankingScore_shouldAlwaysBeUnsupportedScore() {
|
||||
assertThat(new ConditionalContextualCard.Builder().build().getRankingScore())
|
||||
.isEqualTo(UNSUPPORTED_RANKING_SCORE);
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.app.slice.Slice;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.ContentValues;
|
||||
@@ -37,7 +38,6 @@ import android.database.sqlite.SQLiteDatabase;
|
||||
import android.net.Uri;
|
||||
import android.provider.Settings;
|
||||
import android.provider.SettingsSlicesContract;
|
||||
import android.util.Pair;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
@@ -54,7 +54,6 @@ import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@@ -72,8 +71,6 @@ public class SliceBroadcastReceiverTest {
|
||||
private SliceBroadcastReceiver mReceiver;
|
||||
private SearchFeatureProvider mSearchFeatureProvider;
|
||||
private FakeFeatureFactory mFakeFeatureFactory;
|
||||
private ArgumentCaptor<Pair<Integer, Object>> mLoggingNameArgumentCatpor;
|
||||
private ArgumentCaptor<Pair<Integer, Object>> mLoggingValueArgumentCatpor;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -88,8 +85,6 @@ public class SliceBroadcastReceiverTest {
|
||||
CustomSliceManager manager = new CustomSliceManager(mContext);
|
||||
when(mFakeFeatureFactory.slicesFeatureProvider.getCustomSliceManager(any()))
|
||||
.thenReturn(manager);
|
||||
mLoggingNameArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
|
||||
mLoggingValueArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
|
||||
}
|
||||
|
||||
@After
|
||||
@@ -123,20 +118,12 @@ public class SliceBroadcastReceiverTest {
|
||||
|
||||
assertThat(fakeToggleController.isChecked()).isFalse();
|
||||
verify(mFakeFeatureFactory.metricsFeatureProvider)
|
||||
.action(eq(mContext),
|
||||
eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED),
|
||||
mLoggingNameArgumentCatpor.capture(),
|
||||
mLoggingValueArgumentCatpor.capture());
|
||||
|
||||
final Pair<Integer, Object> namePair = mLoggingNameArgumentCatpor.getValue();
|
||||
final Pair<Integer, Object> valuePair = mLoggingValueArgumentCatpor.getValue();
|
||||
assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
|
||||
assertThat(namePair.second).isEqualTo(fakeToggleController.getPreferenceKey());
|
||||
|
||||
.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
fakeToggleController.getPreferenceKey(),
|
||||
0);
|
||||
verify(resolver).notifyChange(uri, null);
|
||||
assertThat(valuePair.first)
|
||||
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE);
|
||||
assertThat(valuePair.second).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -229,20 +216,13 @@ public class SliceBroadcastReceiverTest {
|
||||
|
||||
assertThat(fakeSliderController.getSliderPosition()).isEqualTo(position);
|
||||
verify(mFakeFeatureFactory.metricsFeatureProvider)
|
||||
.action(eq(mContext),
|
||||
eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED),
|
||||
mLoggingNameArgumentCatpor.capture(),
|
||||
mLoggingValueArgumentCatpor.capture());
|
||||
|
||||
final Pair<Integer, Object> namePair = mLoggingNameArgumentCatpor.getValue();
|
||||
final Pair<Integer, Object> valuePair = mLoggingValueArgumentCatpor.getValue();
|
||||
assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
|
||||
assertThat(namePair.second).isEqualTo(key);
|
||||
.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
key,
|
||||
position);
|
||||
|
||||
verify(resolver).notifyChange(uri, null);
|
||||
assertThat(valuePair.first)
|
||||
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE);
|
||||
assertThat(valuePair.second).isEqualTo(position);
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
|
||||
@@ -18,11 +18,11 @@ package com.android.settings.slices;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -52,7 +52,6 @@ import com.android.settings.testutils.SliceTester;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@@ -77,14 +76,11 @@ public class SliceBuilderUtilsTest {
|
||||
|
||||
private Context mContext;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
private ArgumentCaptor<Pair<Integer, Object>> mLoggingArgumentCatpor;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
mLoggingArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
|
||||
|
||||
// Set-up specs for SliceMetadata.
|
||||
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
||||
}
|
||||
@@ -103,14 +99,11 @@ public class SliceBuilderUtilsTest {
|
||||
|
||||
final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData);
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
|
||||
mLoggingArgumentCatpor.capture());
|
||||
final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
|
||||
|
||||
assertThat(capturedLoggingPair.first)
|
||||
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
|
||||
assertThat(capturedLoggingPair.second)
|
||||
.isEqualTo(dummyData.getKey());
|
||||
.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
dummyData.getKey(),
|
||||
0);
|
||||
SliceTester.testSettingsToggleSlice(mContext, slice, dummyData);
|
||||
}
|
||||
|
||||
@@ -120,14 +113,11 @@ public class SliceBuilderUtilsTest {
|
||||
|
||||
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
|
||||
mLoggingArgumentCatpor.capture());
|
||||
final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
|
||||
|
||||
assertThat(capturedLoggingPair.first)
|
||||
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
|
||||
assertThat(capturedLoggingPair.second)
|
||||
.isEqualTo(data.getKey());
|
||||
.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
data.getKey(),
|
||||
0);
|
||||
SliceTester.testSettingsSliderSlice(mContext, slice, data);
|
||||
}
|
||||
|
||||
@@ -137,14 +127,11 @@ public class SliceBuilderUtilsTest {
|
||||
|
||||
final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData);
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
|
||||
mLoggingArgumentCatpor.capture());
|
||||
final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
|
||||
|
||||
assertThat(capturedLoggingPair.first)
|
||||
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
|
||||
assertThat(capturedLoggingPair.second)
|
||||
.isEqualTo(dummyData.getKey());
|
||||
.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
dummyData.getKey(),
|
||||
0);
|
||||
SliceTester.testSettingsCopyableSlice(mContext, slice, dummyData);
|
||||
}
|
||||
|
||||
@@ -390,14 +377,12 @@ public class SliceBuilderUtilsTest {
|
||||
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
|
||||
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
|
||||
mLoggingArgumentCatpor.capture());
|
||||
final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
|
||||
.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
data.getKey(),
|
||||
0);
|
||||
|
||||
assertThat(capturedLoggingPair.first)
|
||||
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
|
||||
assertThat(capturedLoggingPair.second)
|
||||
.isEqualTo(data.getKey());
|
||||
SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
|
||||
}
|
||||
|
||||
@@ -412,16 +397,11 @@ public class SliceBuilderUtilsTest {
|
||||
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
|
||||
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
|
||||
mLoggingArgumentCatpor.capture());
|
||||
|
||||
final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
|
||||
|
||||
assertThat(capturedLoggingPair.first)
|
||||
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
|
||||
assertThat(capturedLoggingPair.second)
|
||||
.isEqualTo(data.getKey());
|
||||
assertThat(slice).isNull();
|
||||
.action(SettingsEnums.PAGE_UNKNOWN,
|
||||
MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
|
||||
SettingsEnums.PAGE_UNKNOWN,
|
||||
data.getKey(),
|
||||
0);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -18,8 +18,6 @@ package com.android.settings.wifi;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.DialogInterface;
|
||||
import android.widget.Button;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -33,6 +31,7 @@ import org.junit.runner.RunWith;
|
||||
import org.robolectric.Robolectric;
|
||||
import org.robolectric.annotation.Config;
|
||||
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
||||
import org.robolectric.shadows.ShadowLooper;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class})
|
||||
@@ -44,7 +43,7 @@ public class NetworkRequestDialogFragmentTest {
|
||||
@Before
|
||||
public void setUp() {
|
||||
mActivity = Robolectric.setupActivity(FragmentActivity.class);
|
||||
networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance(-1, null));
|
||||
networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -67,4 +66,26 @@ public class NetworkRequestDialogFragmentTest {
|
||||
positiveButton.performClick();
|
||||
assertThat(alertDialog.isShowing()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onResumeAndWaitTimeout_shouldCallTimeoutDialog() {
|
||||
FakeNetworkRequestDialogFragment fakeFragment = new FakeNetworkRequestDialogFragment();
|
||||
FakeNetworkRequestDialogFragment spyFakeFragment = spy(fakeFragment);
|
||||
spyFakeFragment.show(mActivity.getSupportFragmentManager(), null);
|
||||
|
||||
assertThat(fakeFragment.bCalledStopAndPop).isFalse();
|
||||
|
||||
ShadowLooper.getShadowMainLooper().runToEndOfTasks();
|
||||
|
||||
assertThat(fakeFragment.bCalledStopAndPop).isTrue();
|
||||
}
|
||||
|
||||
class FakeNetworkRequestDialogFragment extends NetworkRequestDialogFragment {
|
||||
boolean bCalledStopAndPop = false;
|
||||
|
||||
@Override
|
||||
public void stopScanningAndPopTimeoutDialog() {
|
||||
bCalledStopAndPop = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (C) 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.settings.wifi;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.internal.verification.VerificationModeFactory.times;
|
||||
|
||||
import android.content.DialogInterface;
|
||||
import android.widget.Button;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
|
||||
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.Robolectric;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class})
|
||||
public class NetworkRequestTimeoutDialogFragmentTest {
|
||||
|
||||
private FragmentActivity mActivity;
|
||||
private NetworkRequestTimeoutDialogFragment mFragment;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mActivity = Robolectric.setupActivity(FragmentActivity.class);
|
||||
mFragment = spy(NetworkRequestTimeoutDialogFragment.newInstance());
|
||||
mFragment.show(mActivity.getSupportFragmentManager(), null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void display_shouldShowTheDialog() {
|
||||
AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
|
||||
assertThat(alertDialog).isNotNull();
|
||||
assertThat(alertDialog.isShowing()).isTrue();
|
||||
|
||||
ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
|
||||
assertThat(RuntimeEnvironment.application
|
||||
.getString(R.string.network_connection_timeout_dialog_message))
|
||||
.isEqualTo(shadowAlertDialog.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void clickPositiveButton_shouldCallStartScanningDialog() {
|
||||
AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(alertDialog.isShowing()).isTrue();
|
||||
|
||||
Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
|
||||
assertThat(positiveButton).isNotNull();
|
||||
|
||||
positiveButton.performClick();
|
||||
verify(mFragment, times(1)).startScanningDialog();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void clickNegativeButton_shouldCloseTheDialog() {
|
||||
AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
|
||||
assertThat(alertDialog.isShowing()).isTrue();
|
||||
|
||||
Button negativeButton = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
|
||||
assertThat(negativeButton).isNotNull();
|
||||
|
||||
negativeButton.performClick();
|
||||
assertThat(alertDialog.isShowing()).isFalse();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user