Move code from SuggestionChecks to FeatureProvider

This is step one to deprecate SuggestionChecks. Moving logic into
SuggestionFeatureProvider allows potential logic override and improves
testability.

Also moved isSuggestionComplete tests to corresponding activity/pref
controller test.

Bug: 65065268
Test: robotests
Change-Id: I2071d30fc58bb84acad2083ca03cfcf7d41f10cb
This commit is contained in:
Fan Zhang
2017-09-28 17:17:44 -07:00
parent b963125159
commit 31f699c281
23 changed files with 497 additions and 411 deletions

View File

@@ -1688,14 +1688,12 @@
android:value="true" /> android:value="true" />
</activity> </activity>
<activity android:name=".Settings$ScreenLockSuggestionActivity" <activity android:name=".password.ScreenLockSuggestionActivity"
android:icon="@drawable/ic_settings_security"> android:icon="@drawable/ic_settings_security">
<intent-filter android:priority="1"> <intent-filter android:priority="1">
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="com.android.settings.suggested.category.LOCK_SCREEN" /> <category android:name="com.android.settings.suggested.category.LOCK_SCREEN" />
</intent-filter> </intent-filter>
<meta-data android:name="com.android.settings.dismiss"
android:value="0,30" />
<meta-data android:name="com.android.settings.title" <meta-data android:name="com.android.settings.title"
android:resource="@string/suggested_lock_settings_title" /> android:resource="@string/suggested_lock_settings_title" />
<meta-data android:name="com.android.settings.summary" <meta-data android:name="com.android.settings.summary"
@@ -1703,7 +1701,7 @@
<meta-data android:name="com.android.settings.icon_tintable" android:value="true" /> <meta-data android:name="com.android.settings.icon_tintable" android:value="true" />
</activity> </activity>
<activity android:name=".Settings$FingerprintEnrollSuggestionActivity" <activity android:name=".fingerprint.FingerprintEnrollSuggestionActivity"
android:icon="@drawable/ic_suggestion_fingerprint"> android:icon="@drawable/ic_suggestion_fingerprint">
<intent-filter android:priority="2"> <intent-filter android:priority="2">
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@@ -2908,7 +2906,7 @@
android:value="true" /> android:value="true" />
</activity> </activity>
<activity android:name="Settings$WifiCallingSuggestionActivity" <activity android:name=".wifi.WifiCallingSuggestionActivity"
android:label="@string/wifi_calling_settings_title" android:label="@string/wifi_calling_settings_title"
android:icon="@drawable/ic_settings_wireless" android:icon="@drawable/ic_settings_wireless"
android:taskAffinity=""> android:taskAffinity="">

View File

@@ -21,8 +21,6 @@ import android.util.FeatureFlagUtils;
import com.android.settings.applications.AppOpsSummary; import com.android.settings.applications.AppOpsSummary;
import com.android.settings.enterprise.EnterprisePrivacySettings; import com.android.settings.enterprise.EnterprisePrivacySettings;
import com.android.settings.fingerprint.FingerprintEnrollIntroduction;
import com.android.settings.password.ChooseLockGeneric;
/** /**
* Top-level Settings activity * Top-level Settings activity
@@ -157,12 +155,6 @@ public class Settings extends SettingsActivity {
public static class ManageExternalSourcesActivity extends SettingsActivity { public static class ManageExternalSourcesActivity extends SettingsActivity {
/* empty */ } /* empty */ }
public static class ManageAppExternalSourcesActivity extends SettingsActivity { /* empty */ } public static class ManageAppExternalSourcesActivity extends SettingsActivity { /* empty */ }
public static class WifiCallingSuggestionActivity extends SettingsActivity { /* empty */ }
public static class FingerprintEnrollSuggestionActivity extends FingerprintEnrollIntroduction {
/* empty */
}
public static class ScreenLockSuggestionActivity extends ChooseLockGeneric { /* empty */ }
public static class DoubleTapPowerSuggestionActivity extends SettingsActivity { /* empty */ } public static class DoubleTapPowerSuggestionActivity extends SettingsActivity { /* empty */ }
public static class DoubleTwistSuggestionActivity extends SettingsActivity { /* empty */ } public static class DoubleTwistSuggestionActivity extends SettingsActivity { /* empty */ }
public static class AmbientDisplaySuggestionActivity extends SettingsActivity { /* empty */ } public static class AmbientDisplaySuggestionActivity extends SettingsActivity { /* empty */ }

View File

@@ -54,7 +54,7 @@ public interface SuggestionFeatureProvider {
boolean isSmartSuggestionEnabled(Context context); boolean isSmartSuggestionEnabled(Context context);
/** Return true if the suggestion has already been completed and does not need to be shown */ /** Return true if the suggestion has already been completed and does not need to be shown */
boolean isSuggestionCompleted(Context context, @NonNull ComponentName suggestion); boolean isSuggestionComplete(Context context, @NonNull ComponentName suggestion);
/** /**
* Returns the {@link SharedPreferences} that holds metadata for suggestions. * Returns the {@link SharedPreferences} that holds metadata for suggestions.

View File

@@ -39,13 +39,18 @@ import com.android.settings.Settings.DoubleTwistSuggestionActivity;
import com.android.settings.Settings.NightDisplaySuggestionActivity; import com.android.settings.Settings.NightDisplaySuggestionActivity;
import com.android.settings.Settings.SwipeToNotificationSuggestionActivity; import com.android.settings.Settings.SwipeToNotificationSuggestionActivity;
import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.fingerprint.FingerprintEnrollSuggestionActivity;
import com.android.settings.fingerprint.FingerprintSuggestionActivity;
import com.android.settings.gestures.DoubleTapPowerPreferenceController; import com.android.settings.gestures.DoubleTapPowerPreferenceController;
import com.android.settings.gestures.DoubleTapScreenPreferenceController; import com.android.settings.gestures.DoubleTapScreenPreferenceController;
import com.android.settings.gestures.DoubleTwistPreferenceController; import com.android.settings.gestures.DoubleTwistPreferenceController;
import com.android.settings.gestures.PickupGesturePreferenceController; import com.android.settings.gestures.PickupGesturePreferenceController;
import com.android.settings.gestures.SwipeToNotificationPreferenceController; import com.android.settings.gestures.SwipeToNotificationPreferenceController;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ScreenLockSuggestionActivity;
import com.android.settings.support.NewDeviceIntroSuggestionActivity; import com.android.settings.support.NewDeviceIntroSuggestionActivity;
import com.android.settings.wallpaper.WallpaperSuggestionActivity;
import com.android.settings.wifi.WifiCallingSuggestionActivity;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import com.android.settingslib.suggestions.SuggestionParser; import com.android.settingslib.suggestions.SuggestionParser;
@@ -96,12 +101,21 @@ public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider
} }
@Override @Override
public boolean isSuggestionCompleted(Context context, @NonNull ComponentName component) { public boolean isSuggestionComplete(Context context, @NonNull ComponentName component) {
final String className = component.getClassName(); final String className = component.getClassName();
if (className.equals(NightDisplaySuggestionActivity.class.getName())) { if (className.equals(WallpaperSuggestionActivity.class.getName())) {
return WallpaperSuggestionActivity.isSuggestionComplete(context);
} else if (className.equals(FingerprintSuggestionActivity.class.getName())) {
return FingerprintSuggestionActivity.isSuggestionComplete(context);
} else if (className.equals(FingerprintEnrollSuggestionActivity.class.getName())) {
return FingerprintEnrollSuggestionActivity.isSuggestionComplete(context);
} else if (className.equals(ScreenLockSuggestionActivity.class.getName())) {
return ScreenLockSuggestionActivity.isSuggestionComplete(context);
} else if (className.equals(WifiCallingSuggestionActivity.class.getName())) {
return WifiCallingSuggestionActivity.isSuggestionComplete(context);
} else if (className.equals(NightDisplaySuggestionActivity.class.getName())) {
return hasUsedNightDisplay(context); return hasUsedNightDisplay(context);
} } else if (className.equals(NewDeviceIntroSuggestionActivity.class.getName())) {
if (className.equals(NewDeviceIntroSuggestionActivity.class.getName())) {
return NewDeviceIntroSuggestionActivity.isSuggestionComplete(context); return NewDeviceIntroSuggestionActivity.isSuggestionComplete(context);
} else if (className.equals(DoubleTapPowerSuggestionActivity.class.getName())) { } else if (className.equals(DoubleTapPowerSuggestionActivity.class.getName())) {
return DoubleTapPowerPreferenceController return DoubleTapPowerPreferenceController

View File

@@ -16,23 +16,10 @@
package com.android.settings.dashboard.suggestions; package com.android.settings.dashboard.suggestions;
import android.app.KeyguardManager;
import android.app.WallpaperManager;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.hardware.fingerprint.FingerprintManager;
import android.support.annotation.VisibleForTesting;
import com.android.ims.ImsManager;
import com.android.settings.Settings.FingerprintEnrollSuggestionActivity;
import com.android.settings.Settings.ScreenLockSuggestionActivity;
import com.android.settings.Settings.WifiCallingSuggestionActivity;
import com.android.settings.Utils;
import com.android.settings.fingerprint.FingerprintSuggestionActivity;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wallpaper.WallpaperSuggestionActivity;
import com.android.settings.wrapper.WallpaperManagerWrapper;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
/** /**
@@ -43,69 +30,17 @@ public class SuggestionsChecks {
private static final String TAG = "SuggestionsChecks"; private static final String TAG = "SuggestionsChecks";
private final Context mContext; private final Context mContext;
private final WallpaperManagerWrapper mWallpaperManager;
public SuggestionsChecks(Context context) { public SuggestionsChecks(Context context) {
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mWallpaperManager = new WallpaperManagerWrapper(mContext);
} }
public boolean isSuggestionComplete(Tile suggestion) { public boolean isSuggestionComplete(Tile suggestion) {
ComponentName component = suggestion.intent.getComponent(); ComponentName component = suggestion.intent.getComponent();
String className = component.getClassName();
if (className.equals(WallpaperSuggestionActivity.class.getName())) {
return hasWallpaperSet();
} else if (className.equals(WifiCallingSuggestionActivity.class.getName())) {
return isWifiCallingUnavailableOrEnabled();
} else if (className.equals(FingerprintSuggestionActivity.class.getName())) {
return !Utils.hasFingerprintHardware(mContext) || !isFingerprintEnabled()
|| isNotSingleFingerprintEnrolled();
} else if (className.equals(ScreenLockSuggestionActivity.class.getName())) {
return isDeviceSecured();
} else if (className.equals(FingerprintEnrollSuggestionActivity.class.getName())) {
final FingerprintManager manager = Utils.getFingerprintManagerOrNull(mContext);
if (manager == null || !isFingerprintEnabled()
|| !Utils.hasFingerprintHardware(mContext)) {
return true;
}
return manager.hasEnrolledFingerprints();
}
final SuggestionFeatureProvider provider = final SuggestionFeatureProvider provider =
FeatureFactory.getFactory(mContext).getSuggestionFeatureProvider(mContext); FeatureFactory.getFactory(mContext).getSuggestionFeatureProvider(mContext);
return provider.isSuggestionCompleted(mContext, component); return provider.isSuggestionComplete(mContext, component);
} }
private boolean isDeviceSecured() {
KeyguardManager km = mContext.getSystemService(KeyguardManager.class);
return km.isKeyguardSecure();
}
private boolean isNotSingleFingerprintEnrolled() {
FingerprintManager manager = Utils.getFingerprintManagerOrNull(mContext);
return manager == null || manager.getEnrolledFingerprints().size() != 1;
}
public boolean isWifiCallingUnavailableOrEnabled() {
if (!ImsManager.isWfcEnabledByPlatform(mContext) ||
!ImsManager.isWfcProvisionedOnDevice(mContext)) {
return true;
}
return ImsManager.isWfcEnabledByUser(mContext)
&& ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext);
}
@VisibleForTesting
boolean hasWallpaperSet() {
return mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM) > 0;
}
private boolean isFingerprintEnabled() {
DevicePolicyManager dpManager =
(DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
final int dpmFlags = dpManager.getKeyguardDisabledFeatures(null, /* admin */
mContext.getUserId());
return (dpmFlags & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) == 0;
}
} }

View File

@@ -0,0 +1,33 @@
/*
* Copyright (C) 2017 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.fingerprint;
import android.content.Context;
import com.android.settings.Utils;
public class FingerprintEnrollSuggestionActivity extends FingerprintEnrollIntroduction {
public static boolean isSuggestionComplete(Context context) {
if (!Utils.hasFingerprintHardware(context)
|| !FingerprintSuggestionActivity.isFingerprintEnabled(context)
|| !Utils.hasFingerprintHardware(context)) {
return true;
}
return Utils.getFingerprintManagerOrNull(context).hasEnrolledFingerprints();
}
}

View File

@@ -16,9 +16,13 @@
package com.android.settings.fingerprint; package com.android.settings.fingerprint;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.hardware.fingerprint.FingerprintManager;
import android.widget.Button; import android.widget.Button;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils;
public class FingerprintSuggestionActivity extends SetupFingerprintEnrollIntroduction { public class FingerprintSuggestionActivity extends SetupFingerprintEnrollIntroduction {
@@ -36,4 +40,23 @@ public class FingerprintSuggestionActivity extends SetupFingerprintEnrollIntrodu
setResult(RESULT_CANCELED); setResult(RESULT_CANCELED);
super.finish(); super.finish();
} }
public static boolean isSuggestionComplete(Context context) {
return !Utils.hasFingerprintHardware(context)
|| !isFingerprintEnabled(context)
|| isNotSingleFingerprintEnrolled(context);
}
private static boolean isNotSingleFingerprintEnrolled(Context context) {
final FingerprintManager manager = Utils.getFingerprintManagerOrNull(context);
return manager == null || manager.getEnrolledFingerprints().size() != 1;
}
static boolean isFingerprintEnabled(Context context) {
final DevicePolicyManager dpManager =
(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
final int dpmFlags = dpManager.getKeyguardDisabledFeatures(null, /* admin */
context.getUserId());
return (dpmFlags & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) == 0;
}
} }

View File

@@ -16,10 +16,13 @@
package com.android.settings.gestures; package com.android.settings.gestures;
import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.provider.Settings; import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import com.android.settings.R; import com.android.settings.R;
@@ -28,12 +31,12 @@ import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.search.ResultPayload; import com.android.settings.search.ResultPayload;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED;
public class DoubleTapPowerPreferenceController extends GesturePreferenceController { public class DoubleTapPowerPreferenceController extends GesturePreferenceController {
private final int ON = 0; @VisibleForTesting
private final int OFF = 1; static final int ON = 0;
@VisibleForTesting
static final int OFF = 1;
private static final String PREF_KEY_VIDEO = "gesture_double_tap_power_video"; private static final String PREF_KEY_VIDEO = "gesture_double_tap_power_video";
private final String mDoubleTapPowerKey; private final String mDoubleTapPowerKey;
@@ -81,7 +84,7 @@ public class DoubleTapPowerPreferenceController extends GesturePreferenceControl
protected boolean isSwitchPrefEnabled() { protected boolean isSwitchPrefEnabled() {
final int cameraDisabled = Settings.Secure.getInt(mContext.getContentResolver(), final int cameraDisabled = Settings.Secure.getInt(mContext.getContentResolver(),
SECURE_KEY, ON); SECURE_KEY, ON);
return cameraDisabled == 0; return cameraDisabled == ON;
} }
@Override @Override

View File

@@ -16,6 +16,8 @@
package com.android.settings.gestures; package com.android.settings.gestures;
import static android.provider.Settings.Secure.DOZE_PULSE_ON_PICK_UP;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -30,8 +32,6 @@ import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.search.ResultPayload; import com.android.settings.search.ResultPayload;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import static android.provider.Settings.Secure.DOZE_PULSE_ON_PICK_UP;
public class PickupGesturePreferenceController extends GesturePreferenceController { public class PickupGesturePreferenceController extends GesturePreferenceController {
private final int ON = 1; private final int ON = 1;
@@ -56,8 +56,8 @@ public class PickupGesturePreferenceController extends GesturePreferenceControll
public static boolean isSuggestionComplete(Context context, SharedPreferences prefs) { public static boolean isSuggestionComplete(Context context, SharedPreferences prefs) {
AmbientDisplayConfiguration ambientConfig = new AmbientDisplayConfiguration(context); AmbientDisplayConfiguration ambientConfig = new AmbientDisplayConfiguration(context);
return !ambientConfig.pulseOnPickupAvailable() return prefs.getBoolean(PickupGestureSettings.PREF_KEY_SUGGESTION_COMPLETE, false)
|| prefs.getBoolean(PickupGestureSettings.PREF_KEY_SUGGESTION_COMPLETE, false); || !ambientConfig.pulseOnPickupAvailable();
} }
@Override @Override

View File

@@ -16,6 +16,8 @@
package com.android.settings.gestures; package com.android.settings.gestures;
import static android.provider.Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.provider.Settings; import android.provider.Settings;
@@ -24,8 +26,6 @@ import android.support.v7.preference.Preference;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import static android.provider.Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED;
public class SwipeToNotificationPreferenceController extends GesturePreferenceController { public class SwipeToNotificationPreferenceController extends GesturePreferenceController {
private static final int ON = 1; private static final int ON = 1;
@@ -49,7 +49,8 @@ public class SwipeToNotificationPreferenceController extends GesturePreferenceCo
} }
private static boolean isGestureAvailable(Context context) { private static boolean isGestureAvailable(Context context) {
return Utils.hasFingerprintHardware(context) && context.getResources() return Utils.hasFingerprintHardware(context)
&& context.getResources()
.getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys); .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys);
} }

View File

@@ -0,0 +1,28 @@
/*
* Copyright (C) 2017 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.KeyguardManager;
import android.content.Context;
public class ScreenLockSuggestionActivity extends ChooseLockGeneric {
public static boolean isSuggestionComplete(Context context) {
KeyguardManager km = context.getSystemService(KeyguardManager.class);
return km.isKeyguardSecure();
}
}

View File

@@ -17,6 +17,8 @@
package com.android.settings.wallpaper; package com.android.settings.wallpaper;
import android.app.Activity; import android.app.Activity;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
@@ -25,6 +27,7 @@ import android.support.annotation.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.wrapper.WallpaperManagerWrapper;
public class WallpaperSuggestionActivity extends Activity { public class WallpaperSuggestionActivity extends Activity {
@@ -53,4 +56,10 @@ public class WallpaperSuggestionActivity extends Activity {
MetricsProto.MetricsEvent.DASHBOARD_SUMMARY); MetricsProto.MetricsEvent.DASHBOARD_SUMMARY);
} }
@VisibleForTesting
public static boolean isSuggestionComplete(Context context) {
final WallpaperManagerWrapper manager = new WallpaperManagerWrapper(context);
return manager.getWallpaperId(WallpaperManager.FLAG_SYSTEM) > 0;
}
} }

View File

@@ -0,0 +1,34 @@
/*
* Copyright (C) 2017 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.content.Context;
import com.android.ims.ImsManager;
import com.android.settings.SettingsActivity;
public class WifiCallingSuggestionActivity extends SettingsActivity {
public static boolean isSuggestionComplete(Context context) {
if (!ImsManager.isWfcEnabledByPlatform(context) ||
!ImsManager.isWfcProvisionedOnDevice(context)) {
return true;
}
return ImsManager.isWfcEnabledByUser(context)
&& ImsManager.isNonTtyOrTtyOnVolteEnabled(context);
}
}

View File

@@ -24,7 +24,11 @@ import android.content.Context;
*/ */
public class AmbientDisplayConfiguration { public class AmbientDisplayConfiguration {
public AmbientDisplayConfiguration(Context context) {} private final Context mContext;
public AmbientDisplayConfiguration(Context context) {
mContext = context;
}
public boolean pulseOnPickupAvailable() { public boolean pulseOnPickupAvailable() {
return false; return false;

View File

@@ -19,7 +19,6 @@ package com.android.settings.dashboard.suggestions;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
@@ -31,7 +30,6 @@ import android.app.ActivityManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.provider.Settings.Secure; import android.provider.Settings.Secure;
@@ -41,18 +39,8 @@ import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.Settings.AmbientDisplayPickupSuggestionActivity;
import com.android.settings.Settings.AmbientDisplaySuggestionActivity;
import com.android.settings.Settings.DoubleTapPowerSuggestionActivity;
import com.android.settings.Settings.DoubleTwistSuggestionActivity;
import com.android.settings.Settings.NightDisplaySuggestionActivity; import com.android.settings.Settings.NightDisplaySuggestionActivity;
import com.android.settings.Settings.SwipeToNotificationSuggestionActivity;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.gestures.DoubleTapPowerSettings;
import com.android.settings.gestures.DoubleTapScreenSettings;
import com.android.settings.gestures.PickupGestureSettings;
import com.android.settings.gestures.SwipeToNotificationSettings;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
@@ -78,19 +66,13 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config( @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
manifest = TestConfig.MANIFEST_PATH, ShadowSecureSettings.class,
sdk = TestConfig.SDK_VERSION,
shadows = {ShadowSecureSettings.class,
SettingsShadowResources.class, SettingsShadowResources.class,
SettingsShadowSystemProperties.class SettingsShadowSystemProperties.class
} })
)
public class SuggestionFeatureProviderImplTest { public class SuggestionFeatureProviderImplTest {
private static final String DOUBLE_TWIST_SENSOR_NAME = "double_twist_sensor_name";
private static final String DOUBLE_TWIST_SENSOR_VENDOR = "double_twist_sensor_vendor";
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext; private Context mContext;
@Mock @Mock
@@ -105,8 +87,6 @@ public class SuggestionFeatureProviderImplTest {
private PackageManager mPackageManager; private PackageManager mPackageManager;
@Mock @Mock
private FingerprintManager mFingerprintManager; private FingerprintManager mFingerprintManager;
@Mock
private SharedPreferences mSharedPreferences;
@Captor @Captor
private ArgumentCaptor<Pair> mTaggedDataCaptor = ArgumentCaptor.forClass(Pair.class); private ArgumentCaptor<Pair> mTaggedDataCaptor = ArgumentCaptor.forClass(Pair.class);
@@ -134,6 +114,7 @@ public class SuggestionFeatureProviderImplTest {
@After @After
public void tearDown() { public void tearDown() {
SettingsShadowResources.reset();
SettingsShadowSystemProperties.clear(); SettingsShadowSystemProperties.clear();
} }
@@ -143,158 +124,6 @@ public class SuggestionFeatureProviderImplTest {
.isEqualTo("com.android.settings.intelligence"); .isEqualTo("com.android.settings.intelligence");
} }
@Test
public void isSuggestionCompleted_doubleTapPower_trueWhenNotAvailable() {
SettingsShadowResources.overrideResource(
com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, false);
assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
new ComponentName(RuntimeEnvironment.application,
DoubleTapPowerSuggestionActivity.class))).isTrue();
}
@Test
public void isSuggestionCompleted_doubleTapPower_falseWhenNotVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true);
// No stored value in shared preferences if not visited yet.
assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
new ComponentName(RuntimeEnvironment.application,
DoubleTapPowerSuggestionActivity.class))).isFalse();
}
@Test
public void isSuggestionCompleted_doubleTapPower_trueWhenVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true);
mProvider.getSharedPrefs(RuntimeEnvironment.application).edit().putBoolean(
DoubleTapPowerSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit();
assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
new ComponentName(RuntimeEnvironment.application,
DoubleTapPowerSuggestionActivity.class))).isTrue();
}
@Test
public void isSuggestionCompleted_doubleTwist_trueWhenNotAvailable() {
SettingsShadowResources.overrideResource(
R.string.gesture_double_twist_sensor_name, "nonexistant name");
SettingsShadowResources.overrideResource(
R.string.gesture_double_twist_sensor_vendor, "nonexistant vendor");
assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
new ComponentName(RuntimeEnvironment.application,
DoubleTwistSuggestionActivity.class))).isTrue();
}
@Test
public void isSuggestionCompleted_ambientDisplay_falseWhenNotVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeComponent, "foo");
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeDoubleTapSensorType, "bar");
// No stored value in shared preferences if not visited yet.
assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
new ComponentName(RuntimeEnvironment.application,
AmbientDisplaySuggestionActivity.class))).isFalse();
}
@Test
public void isSuggestionCompleted_ambientDisplay_trueWhenVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeComponent, "foo");
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeDoubleTapSensorType, "bar");
mProvider.getSharedPrefs(RuntimeEnvironment.application).edit().putBoolean(
DoubleTapScreenSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit();
assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
new ComponentName(RuntimeEnvironment.application,
AmbientDisplaySuggestionActivity.class))).isTrue();
}
@Test
public void isSuggestionCompleted_ambientDisplayPickup_falseWhenNotVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeComponent, "foo");
SettingsShadowResources.overrideResource(
com.android.internal.R.bool.config_dozePulsePickup, true);
// No stored value in shared preferences if not visited yet.
assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
new ComponentName(RuntimeEnvironment.application,
AmbientDisplaySuggestionActivity.class))).isFalse();
}
@Test
public void isSuggestionCompleted_ambientDisplayPickup_trueWhenVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeComponent, "foo");
SettingsShadowResources.overrideResource(
com.android.internal.R.bool.config_dozePulsePickup, true);
mProvider.getSharedPrefs(RuntimeEnvironment.application).edit().putBoolean(
PickupGestureSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit();
assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
new ComponentName(RuntimeEnvironment.application,
AmbientDisplayPickupSuggestionActivity.class))).isTrue();
}
@Test
public void isSuggestionCompleted_swipeToNotification_trueWhenNotHardwareNotAvailable() {
stubFingerprintSupported(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
when(mContext.getResources().
getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
.thenReturn(true);
assertThat(mProvider.isSuggestionCompleted(mContext,
new ComponentName(mContext, SwipeToNotificationSuggestionActivity.class))).isTrue();
}
@Test
public void isSuggestionCompleted_swipeToNotification_trueWhenNotAvailable() {
stubFingerprintSupported(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mContext.getResources().
getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
.thenReturn(false);
assertThat(mProvider.isSuggestionCompleted(mContext,
new ComponentName(mContext, SwipeToNotificationSuggestionActivity.class))).isTrue();
}
@Test
public void isSuggestionCompleted_swipeToNotification_falseWhenNotVisited() {
stubFingerprintSupported(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mContext.getResources().
getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
.thenReturn(true);
// No stored value in shared preferences if not visited yet.
assertThat(mProvider.isSuggestionCompleted(mContext,
new ComponentName(mContext,
SwipeToNotificationSuggestionActivity.class))).isFalse();
}
@Test
public void isSuggestionCompleted_swipeToNotification_trueWhenVisited() {
stubFingerprintSupported(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mContext.getResources().
getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
.thenReturn(true);
when(mContext.getSharedPreferences(anyString(), anyInt())).thenReturn(mSharedPreferences);
when(mSharedPreferences.getBoolean(
SwipeToNotificationSettings.PREF_KEY_SUGGESTION_COMPLETE, false)).thenReturn(true);
assertThat(mProvider.isSuggestionCompleted(mContext,
new ComponentName(mContext, SwipeToNotificationSuggestionActivity.class))).isTrue();
}
@Test @Test
public void isSuggestionEnabled_isLowMemoryDevice_shouldReturnFalse() { public void isSuggestionEnabled_isLowMemoryDevice_shouldReturnFalse() {
when(mActivityManager.isLowRamDevice()).thenReturn(true); when(mActivityManager.isLowRamDevice()).thenReturn(true);
@@ -325,7 +154,6 @@ public class SuggestionFeatureProviderImplTest {
assertThat(mProvider.isSuggestionV2Enabled(mContext)).isFalse(); assertThat(mProvider.isSuggestionV2Enabled(mContext)).isFalse();
} }
@Test @Test
public void dismissSuggestion_noParserOrSuggestion_noop() { public void dismissSuggestion_noParserOrSuggestion_noop() {
mProvider.dismissSuggestion(mContext, null, (Tile) null); mProvider.dismissSuggestion(mContext, null, (Tile) null);
@@ -423,11 +251,6 @@ public class SuggestionFeatureProviderImplTest {
PackageManager.DONT_KILL_APP); PackageManager.DONT_KILL_APP);
} }
private void stubFingerprintSupported(boolean enabled) {
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
.thenReturn(enabled);
}
@Test @Test
public void filterExclusiveSuggestions_shouldOnlyKeepFirst3() { public void filterExclusiveSuggestions_shouldOnlyKeepFirst3() {
final List<Tile> suggestions = new ArrayList<>(); final List<Tile> suggestions = new ArrayList<>();
@@ -463,7 +286,7 @@ public class SuggestionFeatureProviderImplTest {
LocalDateTime.now().toString()); LocalDateTime.now().toString());
final ComponentName componentName = final ComponentName componentName =
new ComponentName(mContext, NightDisplaySuggestionActivity.class); new ComponentName(mContext, NightDisplaySuggestionActivity.class);
assertThat(mProvider.isSuggestionCompleted(mContext, componentName)).isTrue(); assertThat(mProvider.isSuggestionComplete(mContext, componentName)).isTrue();
} }
@Test @Test
@@ -471,7 +294,7 @@ public class SuggestionFeatureProviderImplTest {
Secure.putInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, 1); Secure.putInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, 1);
final ComponentName componentName = final ComponentName componentName =
new ComponentName(mContext, NightDisplaySuggestionActivity.class); new ComponentName(mContext, NightDisplaySuggestionActivity.class);
assertThat(mProvider.isSuggestionCompleted(mContext, componentName)).isTrue(); assertThat(mProvider.isSuggestionComplete(mContext, componentName)).isTrue();
} }
@Test @Test
@@ -481,13 +304,13 @@ public class SuggestionFeatureProviderImplTest {
Secure.putInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, 1); Secure.putInt(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, 1);
final ComponentName componentName = final ComponentName componentName =
new ComponentName(mContext, NightDisplaySuggestionActivity.class); new ComponentName(mContext, NightDisplaySuggestionActivity.class);
assertThat(mProvider.isSuggestionCompleted(mContext, componentName)).isTrue(); assertThat(mProvider.isSuggestionComplete(mContext, componentName)).isTrue();
} }
@Test @Test
public void nightDisplaySuggestion_isNotCompleted_byDefault() { public void nightDisplaySuggestion_isNotCompleted_byDefault() {
final ComponentName componentName = final ComponentName componentName =
new ComponentName(mContext, NightDisplaySuggestionActivity.class); new ComponentName(mContext, NightDisplaySuggestionActivity.class);
assertThat(mProvider.isSuggestionCompleted(mContext, componentName)).isFalse(); assertThat(mProvider.isSuggestionComplete(mContext, componentName)).isFalse();
} }
} }

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.settings.dashboard.suggestions; package com.android.settings.fingerprint;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
@@ -22,19 +22,13 @@ import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.WallpaperManager;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import com.android.settings.Settings;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.wrapper.WallpaperManagerWrapper;
import com.android.settingslib.drawer.Tile;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -42,12 +36,10 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SuggestionsChecksTest { public class FingerprintEnrollSuggestionActivityTest {
@Mock @Mock
private Context mContext; private Context mContext;
@@ -57,16 +49,10 @@ public class SuggestionsChecksTest {
private FingerprintManager mFingerprintManager; private FingerprintManager mFingerprintManager;
@Mock @Mock
private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager;
@Mock
private WallpaperManagerWrapper mWallpaperManager;
private SuggestionsChecks mSuggestionsChecks;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mContext.getApplicationContext()).thenReturn(mContext);
mSuggestionsChecks = new SuggestionsChecks(mContext);
when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getSystemService(eq(Context.DEVICE_POLICY_SERVICE))) when(mContext.getSystemService(eq(Context.DEVICE_POLICY_SERVICE)))
.thenReturn(mDevicePolicyManager); .thenReturn(mDevicePolicyManager);
@@ -80,8 +66,8 @@ public class SuggestionsChecksTest {
stubFingerprintSupported(true); stubFingerprintSupported(true);
when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(true); when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true); when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
Tile tile = createFingerprintTile();
assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isTrue(); assertThat(FingerprintEnrollSuggestionActivity.isSuggestionComplete(mContext)).isTrue();
} }
@Test @Test
@@ -89,8 +75,8 @@ public class SuggestionsChecksTest {
stubFingerprintSupported(true); stubFingerprintSupported(true);
when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false); when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true); when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
Tile tile = createFingerprintTile();
assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isFalse(); assertThat(FingerprintEnrollSuggestionActivity.isSuggestionComplete(mContext)).isFalse();
} }
@Test @Test
@@ -98,15 +84,15 @@ public class SuggestionsChecksTest {
stubFingerprintSupported(true); stubFingerprintSupported(true);
when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false); when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
when(mFingerprintManager.isHardwareDetected()).thenReturn(false); when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
Tile tile = createFingerprintTile();
assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isTrue(); assertThat(FingerprintEnrollSuggestionActivity.isSuggestionComplete(mContext)).isTrue();
} }
@Test @Test
public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintNotSupported() { public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintNotSupported() {
stubFingerprintSupported(false); stubFingerprintSupported(false);
Tile tile = createFingerprintTile();
assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isTrue(); assertThat(FingerprintEnrollSuggestionActivity.isSuggestionComplete(mContext)).isTrue();
} }
@Test @Test
@@ -117,40 +103,11 @@ public class SuggestionsChecksTest {
when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(), anyInt())) when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(), anyInt()))
.thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT); .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
Tile tile = createFingerprintTile(); assertThat(FingerprintEnrollSuggestionActivity.isSuggestionComplete(mContext)).isTrue();
assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isTrue();
} }
private void stubFingerprintSupported(boolean enabled) { private void stubFingerprintSupported(boolean enabled) {
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
.thenReturn(enabled); .thenReturn(enabled);
} }
private Tile createFingerprintTile() {
final Tile tile = new Tile();
tile.intent = new Intent();
tile.intent.setComponent(new ComponentName(mContext,
Settings.FingerprintEnrollSuggestionActivity.class));
return tile;
}
@Test
public void hasWallpaperSet_no_shouldReturnFalse() {
ReflectionHelpers.setField(mSuggestionsChecks, "mWallpaperManager", mWallpaperManager);
when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM))
.thenReturn(0);
assertThat(mSuggestionsChecks.hasWallpaperSet())
.isFalse();
}
@Test
public void hasWallpaperSet_yes_shouldReturnTrue() {
ReflectionHelpers.setField(mSuggestionsChecks, "mWallpaperManager", mWallpaperManager);
when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM))
.thenReturn(100);
assertThat(mSuggestionsChecks.hasWallpaperSet())
.isTrue();
}
} }

View File

@@ -16,18 +16,29 @@
package com.android.settings.gestures; package com.android.settings.gestures;
import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED;
import static com.android.settings.gestures.DoubleTapPowerPreferenceController.OFF;
import static com.android.settings.gestures.DoubleTapPowerPreferenceController.ON;
import static com.android.settings.gestures.DoubleTapPowerPreferenceController.isSuggestionComplete;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings; import android.provider.Settings;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.TestConfig;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
import com.android.settings.search.InlinePayload; import com.android.settings.search.InlinePayload;
import com.android.settings.search.InlineSwitchPayload; import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.search.ResultPayload; import com.android.settings.search.ResultPayload;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
import com.android.settings.testutils.shadow.ShadowSecureSettings; import com.android.settings.testutils.shadow.ShadowSecureSettings;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -36,20 +47,15 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
SettingsShadowResources.class
})
public class DoubleTapPowerPreferenceControllerTest { public class DoubleTapPowerPreferenceControllerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext; private Context mContext;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceScreen mScreen;
private DoubleTapPowerPreferenceController mController; private DoubleTapPowerPreferenceController mController;
private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power"; private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power";
@@ -59,6 +65,11 @@ public class DoubleTapPowerPreferenceControllerTest {
mController = new DoubleTapPowerPreferenceController(mContext, null, KEY_DOUBLE_TAP_POWER); mController = new DoubleTapPowerPreferenceController(mContext, null, KEY_DOUBLE_TAP_POWER);
} }
@After
public void tearDown() {
SettingsShadowResources.reset();
}
@Test @Test
public void isAvailable_configIsTrue_shouldReturnTrue() { public void isAvailable_configIsTrue_shouldReturnTrue() {
when(mContext.getResources(). when(mContext.getResources().
@@ -80,9 +91,9 @@ public class DoubleTapPowerPreferenceControllerTest {
@Test @Test
public void testSwitchEnabled_configIsNotSet_shouldReturnTrue() { public void testSwitchEnabled_configIsNotSet_shouldReturnTrue() {
// Set the setting to be enabled. // Set the setting to be enabled.
final Context context = ShadowApplication.getInstance().getApplicationContext(); final Context context = RuntimeEnvironment.application;
Settings.System.putInt(context.getContentResolver(), Settings.System.putInt(context.getContentResolver(),
CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0); CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, ON);
mController = new DoubleTapPowerPreferenceController(context, null, KEY_DOUBLE_TAP_POWER); mController = new DoubleTapPowerPreferenceController(context, null, KEY_DOUBLE_TAP_POWER);
assertThat(mController.isSwitchPrefEnabled()).isTrue(); assertThat(mController.isSwitchPrefEnabled()).isTrue();
@@ -91,9 +102,9 @@ public class DoubleTapPowerPreferenceControllerTest {
@Test @Test
public void testSwitchEnabled_configIsSet_shouldReturnFalse() { public void testSwitchEnabled_configIsSet_shouldReturnFalse() {
// Set the setting to be disabled. // Set the setting to be disabled.
final Context context = ShadowApplication.getInstance().getApplicationContext(); final Context context = RuntimeEnvironment.application;
Settings.System.putInt(context.getContentResolver(), Settings.System.putInt(context.getContentResolver(),
CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 1); CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, OFF);
mController = new DoubleTapPowerPreferenceController(context, null, KEY_DOUBLE_TAP_POWER); mController = new DoubleTapPowerPreferenceController(context, null, KEY_DOUBLE_TAP_POWER);
assertThat(mController.isSwitchPrefEnabled()).isFalse(); assertThat(mController.isSwitchPrefEnabled()).isFalse();
@@ -138,4 +149,43 @@ public class DoubleTapPowerPreferenceControllerTest {
newValue = 1 - newValue; // DoubleTapPower is a non-standard switch newValue = 1 - newValue; // DoubleTapPower is a non-standard switch
assertThat(newValue).isEqualTo(currentValue); assertThat(newValue).isEqualTo(currentValue);
} }
@Test
public void isSuggestionCompleted_doubleTapPower_trueWhenNotAvailable() {
SettingsShadowResources.overrideResource(
com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, false);
assertThat(
isSuggestionComplete(RuntimeEnvironment.application, null/* prefs */))
.isTrue();
}
@Test
public void isSuggestionCompleted_doubleTapPower_falseWhenNotVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true);
// No stored value in shared preferences if not visited yet.
final Context context = RuntimeEnvironment.application;
final SharedPreferences prefs = new SuggestionFeatureProviderImpl(context)
.getSharedPrefs(context);
assertThat(
isSuggestionComplete(RuntimeEnvironment.application, prefs))
.isFalse();
}
@Test
public void isSuggestionCompleted_doubleTapPower_trueWhenVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled, true);
// No stored value in shared preferences if not visited yet.
final Context context = RuntimeEnvironment.application;
final SharedPreferences prefs = new SuggestionFeatureProviderImpl(context)
.getSharedPrefs(context);
prefs.edit().putBoolean(
DoubleTapPowerSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit();
assertThat(
isSuggestionComplete(RuntimeEnvironment.application, prefs))
.isTrue();
}
} }

View File

@@ -16,18 +16,26 @@
package com.android.settings.gestures; package com.android.settings.gestures;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.when;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings; import android.provider.Settings;
import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.settings.TestConfig;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
import com.android.settings.search.InlinePayload; import com.android.settings.search.InlinePayload;
import com.android.settings.search.InlineSwitchPayload; import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.search.ResultPayload; import com.android.settings.search.ResultPayload;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowSecureSettings; import com.android.settings.testutils.shadow.ShadowSecureSettings;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -37,12 +45,10 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
SettingsShadowResources.class
})
public class DoubleTapScreenPreferenceControllerTest { public class DoubleTapScreenPreferenceControllerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -60,6 +66,11 @@ public class DoubleTapScreenPreferenceControllerTest {
mContext, null, mAmbientDisplayConfiguration, 0, KEY_DOUBLE_TAP_SCREEN); mContext, null, mAmbientDisplayConfiguration, 0, KEY_DOUBLE_TAP_SCREEN);
} }
@After
public void tearDown() {
SettingsShadowResources.reset();
}
@Test @Test
public void isAvailable_configIsTrue_shouldReturnTrue() { public void isAvailable_configIsTrue_shouldReturnTrue() {
when(mAmbientDisplayConfiguration.pulseOnDoubleTapAvailable()).thenReturn(true); when(mAmbientDisplayConfiguration.pulseOnDoubleTapAvailable()).thenReturn(true);
@@ -125,4 +136,36 @@ public class DoubleTapScreenPreferenceControllerTest {
assertThat(newValue).isEqualTo(currentValue); assertThat(newValue).isEqualTo(currentValue);
} }
@Test
public void isSuggestionCompleted_ambientDisplay_falseWhenNotVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeComponent, "foo");
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeDoubleTapSensorType, "bar");
// No stored value in shared preferences if not visited yet.
final Context context = RuntimeEnvironment.application;
final SharedPreferences prefs = new SuggestionFeatureProviderImpl(context)
.getSharedPrefs(context);
assertThat(DoubleTapScreenPreferenceController.isSuggestionComplete(context, prefs))
.isFalse();
}
@Test
public void isSuggestionCompleted_ambientDisplay_trueWhenVisited() {
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeComponent, "foo");
SettingsShadowResources.overrideResource(
com.android.internal.R.string.config_dozeDoubleTapSensorType, "bar");
final Context context = RuntimeEnvironment.application;
final SharedPreferences prefs = new SuggestionFeatureProviderImpl(context)
.getSharedPrefs(context);
prefs.edit().putBoolean(
DoubleTapScreenSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit();
assertThat(DoubleTapScreenPreferenceController.isSuggestionComplete(context, prefs))
.isTrue();
}
} }

View File

@@ -16,38 +16,44 @@
package com.android.settings.gestures; package com.android.settings.gestures;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.UserManager;
import android.provider.Settings;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import java.util.ArrayList;
import java.util.List;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.UserManager;
import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
import com.android.settings.testutils.shadow.ShadowDoubleTwistPreferenceController; import com.android.settings.testutils.shadow.ShadowDoubleTwistPreferenceController;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import java.util.ArrayList;
import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
SettingsShadowResources.class
})
public class DoubleTwistPreferenceControllerTest { public class DoubleTwistPreferenceControllerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -64,6 +70,11 @@ public class DoubleTwistPreferenceControllerTest {
mController = new DoubleTwistPreferenceController(mContext, null, KEY_DOUBLE_TWIST); mController = new DoubleTwistPreferenceController(mContext, null, KEY_DOUBLE_TWIST);
} }
@After
public void tearDown() {
SettingsShadowResources.reset();
}
@Test @Test
public void isAvailable_hasSensor_shouldReturnTrue() { public void isAvailable_hasSensor_shouldReturnTrue() {
// Mock sensors // Mock sensors
@@ -96,6 +107,18 @@ public class DoubleTwistPreferenceControllerTest {
assertThat(mController.isAvailable()).isFalse(); assertThat(mController.isAvailable()).isFalse();
} }
@Test
public void isSuggestionCompleted_doubleTwist_trueWhenNotAvailable() {
SettingsShadowResources.overrideResource(
R.string.gesture_double_twist_sensor_name, "nonexistant name");
SettingsShadowResources.overrideResource(
R.string.gesture_double_twist_sensor_vendor, "nonexistant vendor");
assertThat(DoubleTwistPreferenceController.isSuggestionComplete(
RuntimeEnvironment.application, null /* prefs */))
.isTrue();
}
@Test @Test
@Config(shadows = { @Config(shadows = {
ShadowDoubleTwistPreferenceController.class, ShadowDoubleTwistPreferenceController.class,

View File

@@ -16,18 +16,26 @@
package com.android.settings.gestures; package com.android.settings.gestures;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.when;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings; import android.provider.Settings;
import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.settings.TestConfig;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
import com.android.settings.search.InlinePayload; import com.android.settings.search.InlinePayload;
import com.android.settings.search.InlineSwitchPayload; import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.search.ResultPayload; import com.android.settings.search.ResultPayload;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowSecureSettings; import com.android.settings.testutils.shadow.ShadowSecureSettings;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -37,12 +45,10 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
SettingsShadowResources.class
})
public class PickupGesturePreferenceControllerTest { public class PickupGesturePreferenceControllerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -61,6 +67,12 @@ public class PickupGesturePreferenceControllerTest {
mContext, null, mAmbientDisplayConfiguration, 0, KEY_PICK_UP); mContext, null, mAmbientDisplayConfiguration, 0, KEY_PICK_UP);
} }
@After
public void tearDown() {
SettingsShadowResources.reset();
ShadowSecureSettings.clear();
}
@Test @Test
public void isAvailable_configIsTrue_shouldReturnTrue() { public void isAvailable_configIsTrue_shouldReturnTrue() {
when(mAmbientDisplayConfiguration.pulseOnPickupAvailable()).thenReturn(true); when(mAmbientDisplayConfiguration.pulseOnPickupAvailable()).thenReturn(true);
@@ -140,4 +152,20 @@ public class PickupGesturePreferenceControllerTest {
assertThat(newValue).isEqualTo(currentValue); assertThat(newValue).isEqualTo(currentValue);
} }
@Test
public void isSuggestionCompleted_ambientDisplayPickup_trueWhenVisited() {
when(mContext.getResources().getBoolean(anyInt()))
.thenReturn(true);
when(mContext.getResources().getString(anyInt()))
.thenReturn("foo");
final Context context = RuntimeEnvironment.application;
final SharedPreferences prefs = new SuggestionFeatureProviderImpl(context)
.getSharedPrefs(context);
prefs.edit().putBoolean(
PickupGestureSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit();
assertThat(PickupGesturePreferenceController.isSuggestionComplete(mContext, prefs))
.isTrue();
}
} }

View File

@@ -16,13 +16,19 @@
package com.android.settings.gestures; package com.android.settings.gestures;
import static android.provider.Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.provider.Settings; import android.provider.Settings;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -30,17 +36,10 @@ import org.junit.runner.RunWith;
import org.mockito.Answers; import org.mockito.Answers;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowApplication;
import static android.provider.Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SwipeToNotificationPreferenceControllerTest { public class SwipeToNotificationPreferenceControllerTest {
@@ -122,6 +121,54 @@ public class SwipeToNotificationPreferenceControllerTest {
assertThat(mController.isSwitchPrefEnabled()).isFalse(); assertThat(mController.isSwitchPrefEnabled()).isFalse();
} }
@Test
public void isSuggestionCompleted_configDisabled_shouldReturnTrue() {
stubFingerprintSupported(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mContext.getResources().
getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
.thenReturn(false);
assertThat(SwipeToNotificationPreferenceController.isSuggestionComplete(
mContext, null /* prefs */))
.isTrue();
}
@Test
public void isSuggestionCompleted_notVisited_shouldReturnFalse() {
stubFingerprintSupported(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mContext.getResources().
getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
.thenReturn(true);
// No stored value in shared preferences if not visited yet.
final Context context = RuntimeEnvironment.application;
final SharedPreferences prefs = new SuggestionFeatureProviderImpl(context)
.getSharedPrefs(context);
assertThat(SwipeToNotificationPreferenceController.isSuggestionComplete(mContext, prefs))
.isFalse();
}
@Test
public void isSuggestionCompleted_visited_shouldReturnTrue() {
stubFingerprintSupported(true);
when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mContext.getResources().
getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
.thenReturn(true);
// No stored value in shared preferences if not visited yet.
final Context context = RuntimeEnvironment.application;
final SharedPreferences prefs = new SuggestionFeatureProviderImpl(context)
.getSharedPrefs(context);
prefs.edit()
.putBoolean(SwipeToNotificationSettings.PREF_KEY_SUGGESTION_COMPLETE, true)
.commit();
assertThat(SwipeToNotificationPreferenceController.isSuggestionComplete(mContext, prefs))
.isTrue();
}
private void stubFingerprintSupported(boolean enabled) { private void stubFingerprintSupported(boolean enabled) {
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
.thenReturn(enabled); .thenReturn(enabled);

View File

@@ -68,7 +68,7 @@ public class SettingsSuggestionsTest {
@Test @Test
public void wifiCallingSuggestion_isValid() { public void wifiCallingSuggestion_isValid() {
assertSuggestionEquals("Settings$WifiCallingSuggestionActivity", assertSuggestionEquals("com.android.settings.wifi.WifiCallingSuggestionActivity",
CATEGORY_FIRST_IMPRESSION, CATEGORY_FIRST_IMPRESSION,
R.string.wifi_calling_suggestion_title, R.string.wifi_calling_suggestion_summary); R.string.wifi_calling_suggestion_title, R.string.wifi_calling_suggestion_summary);
} }

View File

@@ -16,13 +16,18 @@
package com.android.settings.wallpaper; package com.android.settings.wallpaper;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.SubSettings; import com.android.settings.SubSettings;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.wrapper.WallpaperManagerWrapper;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -32,14 +37,15 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.android.controller.ActivityController; import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowActivity; import org.robolectric.shadows.ShadowActivity;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
shadows = {
WallpaperSuggestionActivityTest.ShadowWallpaperManagerWrapper.class
})
public class WallpaperSuggestionActivityTest { public class WallpaperSuggestionActivityTest {
@Mock @Mock
@@ -62,4 +68,39 @@ public class WallpaperSuggestionActivityTest {
assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName()); assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
} }
@Test
public void hasWallpaperSet_no_shouldReturnFalse() {
ShadowWallpaperManagerWrapper.setWallpaperId(0);
assertThat(WallpaperSuggestionActivity.isSuggestionComplete(mContext))
.isFalse();
}
@Test
public void hasWallpaperSet_yes_shouldReturnTrue() {
ShadowWallpaperManagerWrapper.setWallpaperId(100);
assertThat(WallpaperSuggestionActivity.isSuggestionComplete(mContext))
.isTrue();
}
@Implements(WallpaperManagerWrapper.class)
public static class ShadowWallpaperManagerWrapper {
private static int sWallpaperId;
public static void setWallpaperId(int id) {
sWallpaperId = id;
}
public static void reset() {
sWallpaperId = 0;
}
@Implementation
public int getWallpaperId(int which) {
return sWallpaperId;
}
}
} }