diff --git a/Android.mk b/Android.mk index e37e9fbff1a..81932a40f9a 100644 --- a/Android.mk +++ b/Android.mk @@ -19,6 +19,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_USE_AAPT2 := true LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_SRC_FILES += $(call all-java-files-under, ../Horns/src) LOCAL_STATIC_ANDROID_LIBRARIES := \ android-slices-builders \ @@ -32,6 +33,7 @@ LOCAL_STATIC_ANDROID_LIBRARIES := \ android-support-v7-preference \ android-support-v7-recyclerview \ android-support-v14-preference \ + android-support-design LOCAL_JAVA_LIBRARIES := \ bouncycastle \ @@ -45,14 +47,33 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ jsr305 \ settings-logtags \ +LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \ + frameworks/support/v7/preference/res \ + frameworks/support/v14/preference/res \ + frameworks/support/v7/appcompat/res \ + frameworks/support/v7/recyclerview/res \ + frameworks/support/design/res \ + packages/apps/Horns/res + LOCAL_PROGUARD_FLAG_FILES := proguard.flags +LOCAL_AAPT_FLAGS := --auto-add-overlay \ + --extra-packages android.support.v7.preference \ + --extra-packages android.support.v14.preference \ + --extra-packages android.support.v17.preference \ + --extra-packages android.support.v7.appcompat \ + --extra-packages android.support.v7.recyclerview \ + --extra-packages android.support.design \ + --extra-packages com.stag.settings + ifneq ($(INCREMENTAL_BUILDS),) LOCAL_PROGUARD_ENABLED := disabled LOCAL_JACK_ENABLED := incremental LOCAL_JACK_FLAGS := --multi-dex native endif +LOCAL_DEX_PREOPT := false + include frameworks/opt/setupwizard/library/common-gingerbread.mk include frameworks/base/packages/SettingsLib/common.mk diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 27132165b91..06f3effaf27 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3147,7 +3147,7 @@ android:icon="@drawable/ic_homepage_system_dashboard" android:taskAffinity="com.android.settings" android:parentActivityName="Settings"> - + - + @@ -3327,6 +3327,34 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md new file mode 100644 index 00000000000..46d52dd4caa --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# android_packages_apps_Settings +added stagOS logo in Settings DMS diff --git a/proguard.flags b/proguard.flags index 43a038b78a7..e2b678dd7b2 100644 --- a/proguard.flags +++ b/proguard.flags @@ -13,6 +13,8 @@ *; } +-keep class com.stag.settings.** + # We want to keep methods in Activity that could be used in the XML attribute onClick. -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); diff --git a/res/drawable/ic_homepage_stag.xml b/res/drawable/ic_homepage_stag.xml new file mode 100644 index 00000000000..9269af6cb60 --- /dev/null +++ b/res/drawable/ic_homepage_stag.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drawable/stagoslogo.png b/res/drawable/stagoslogo.png new file mode 100644 index 00000000000..2b69436fa48 Binary files /dev/null and b/res/drawable/stagoslogo.png differ diff --git a/res/layout/dialog_firmware_version.xml b/res/layout/dialog_firmware_version.xml index 874d7af0063..df2200fe2e4 100644 --- a/res/layout/dialog_firmware_version.xml +++ b/res/layout/dialog_firmware_version.xml @@ -1,91 +1,21 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values/colors.xml b/res/values/colors.xml index e5f7c276ae9..2132abe9f70 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -125,6 +125,7 @@ #757575 #26459C #1A73E8 + #00bcd4 @*android:color/material_red_A700 diff --git a/res/values/stag_strings.xml b/res/values/stag_strings.xml new file mode 100644 index 00000000000..27023d3bb96 --- /dev/null +++ b/res/values/stag_strings.xml @@ -0,0 +1,18 @@ + + + + + Horns + Where the Stag grows + + diff --git a/res/xml/system_dashboard_fragment.xml b/res/xml/system_dashboard_fragment.xml index 1ca86ab1ebf..9d446c8c496 100644 --- a/res/xml/system_dashboard_fragment.xml +++ b/res/xml/system_dashboard_fragment.xml @@ -21,14 +21,6 @@ android:title="@string/header_category_system" settings:initialExpandedChildrenCount="4"> - - - \ No newline at end of file + diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java index 0ad882df9a2..72f4aa32cad 100644 --- a/src/com/android/settings/DeviceAdminAdd.java +++ b/src/com/android/settings/DeviceAdminAdd.java @@ -59,6 +59,7 @@ import android.widget.TextView; import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.overlay.FeatureFactory; import com.android.settings.users.UserDialogs; import com.android.settingslib.RestrictedLockUtils; @@ -425,6 +426,9 @@ void addAndFinish() { mDPM.setActiveAdmin(mDeviceAdmin.getComponent(), mRefreshing); EventLog.writeEvent(EventLogTags.EXP_DET_DEVICE_ADMIN_ACTIVATED_BY_USER, mDeviceAdmin.getActivityInfo().applicationInfo.uid); + + unrestrictAppIfPossible(BatteryUtils.getInstance(this)); + setResult(Activity.RESULT_OK); } catch (RuntimeException e) { // Something bad happened... could be that it was @@ -446,6 +450,15 @@ void addAndFinish() { finish(); } + void unrestrictAppIfPossible(BatteryUtils batteryUtils) { + // Unrestrict admin app if it is already been restricted + final String packageName = mDeviceAdmin.getComponent().getPackageName(); + final int uid = batteryUtils.getPackageUid(packageName); + if (batteryUtils.isForceAppStandbyEnabled(uid, packageName)) { + batteryUtils.setForceAppStandby(uid, packageName, AppOpsManager.MODE_ALLOWED); + } + } + void continueRemoveAction(CharSequence msg) { if (!mWaitingForRemoveMsg) { return; diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 0ad964b65b3..3593b9333f5 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -164,5 +164,6 @@ public static class AppAndNotificationDashboardActivity extends SettingsActivity public static class StorageDashboardActivity extends SettingsActivity {} public static class AccountDashboardActivity extends SettingsActivity {} public static class SystemDashboardActivity extends SettingsActivity {} + public static class StagSettingsActivity extends SettingsActivity {} } diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 971ae040661..29cd77ade61 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -291,8 +291,10 @@ protected void onCreate(Bundle savedState) { launchSettingFragment(initialFragmentName, isSubSettings, intent); } + final boolean deviceProvisioned = Utils.isDeviceProvisioned(this); if (mIsShowingDashboard) { - findViewById(R.id.search_bar).setVisibility(View.VISIBLE); + findViewById(R.id.search_bar).setVisibility( + deviceProvisioned ? View.VISIBLE : View.INVISIBLE); findViewById(R.id.action_bar).setVisibility(View.GONE); final Toolbar toolbar = findViewById(R.id.search_action_bar); FeatureFactory.getFactory(this).getSearchFeatureProvider() @@ -311,7 +313,6 @@ protected void onCreate(Bundle savedState) { ActionBar actionBar = getActionBar(); if (actionBar != null) { - boolean deviceProvisioned = Utils.isDeviceProvisioned(this); actionBar.setDisplayHomeAsUpEnabled(deviceProvisioned); actionBar.setHomeButtonEnabled(deviceProvisioned); actionBar.setDisplayShowTitleEnabled(!mIsShowingDashboard); diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index a8cb61cd848..7e9c6ccf423 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -137,6 +137,8 @@ import com.android.settings.wifi.calling.WifiCallingSettings; import com.android.settings.wifi.p2p.WifiP2pSettings; +import com.stag.settings.StagSettings; + public class SettingsGateway { /** @@ -261,6 +263,7 @@ public class SettingsGateway { DirectoryAccessDetails.class.getName(), ToggleBackupSettingFragment.class.getName(), PreviouslyConnectedDeviceDashboardFragment.class.getName(), + StagSettings.class.getName() }; public static final String[] SETTINGS_FOR_RESTRICTED = { @@ -299,5 +302,6 @@ public class SettingsGateway { Settings.DeviceInfoSettingsActivity.class.getName(), Settings.EnterprisePrivacySettingsActivity.class.getName(), Settings.MyDeviceInfoActivity.class.getName(), + Settings.StagSettingsActivity.class.getName(), }; } diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java index cd478fc43ad..57eed14c220 100644 --- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java +++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java @@ -40,6 +40,8 @@ import com.android.settings.system.SystemDashboardFragment; import com.android.settingslib.drawer.CategoryKey; +import com.stag.settings.StagSettings; + import java.util.Map; /** @@ -101,6 +103,8 @@ public class DashboardFragmentRegistry { CategoryKey.CATEGORY_GESTURES); PARENT_TO_CATEGORY_KEY_MAP.put(NightDisplaySettings.class.getName(), CategoryKey.CATEGORY_NIGHT_DISPLAY); + PARENT_TO_CATEGORY_KEY_MAP.put(StagSettings.class.getName(), + CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT); CATEGORY_KEY_TO_PARENT_MAP = new ArrayMap<>(PARENT_TO_CATEGORY_KEY_MAP.size()); diff --git a/src/com/android/settings/notification/VisibilityPreferenceController.java b/src/com/android/settings/notification/VisibilityPreferenceController.java index dac90ef7be7..8dc802ccdd0 100644 --- a/src/com/android/settings/notification/VisibilityPreferenceController.java +++ b/src/com/android/settings/notification/VisibilityPreferenceController.java @@ -147,8 +147,10 @@ private int getGlobalVisibility() { } private boolean getLockscreenNotificationsEnabled() { - return Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0; + final UserInfo parentUser = mUm.getProfileParent(UserHandle.myUserId()); + final int primaryUserId = parentUser != null ? parentUser.id : UserHandle.myUserId(); + return Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, primaryUserId) != 0; } private boolean getLockscreenAllowPrivateNotifications() { diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 62978b3089b..1a8afd02cc1 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -164,6 +164,11 @@ public int getMetricsCategory() { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + final Activity activity = getActivity(); + if (!Utils.isDeviceProvisioned(activity) && !canRunBeforeDeviceProvisioned()) { + activity.finish(); + return; + } String chooseLockAction = getActivity().getIntent().getAction(); mFingerprintManager = Utils.getFingerprintManagerOrNull(getActivity()); @@ -249,6 +254,10 @@ public void onCreate(Bundle savedInstanceState) { addHeaderView(); } + protected boolean canRunBeforeDeviceProvisioned() { + return false; + } + protected void addHeaderView() { if (mForFingerprint) { setHeaderView(R.layout.choose_lock_generic_fingerprint_header); diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java index 179bd797cb7..885f9dfb420 100644 --- a/src/com/android/settings/password/SetupChooseLockGeneric.java +++ b/src/com/android/settings/password/SetupChooseLockGeneric.java @@ -129,6 +129,11 @@ public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup pare return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); } + @Override + protected boolean canRunBeforeDeviceProvisioned() { + return true; + } + /*** * Disables preferences that are less secure than required quality and shows only secure * screen lock options here. diff --git a/src/com/android/settings/search/DeviceIndexFeatureProvider.java b/src/com/android/settings/search/DeviceIndexFeatureProvider.java index c4d3abfcaa8..e6b3e937b85 100644 --- a/src/com/android/settings/search/DeviceIndexFeatureProvider.java +++ b/src/com/android/settings/search/DeviceIndexFeatureProvider.java @@ -21,7 +21,10 @@ import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; import android.net.Uri; +import android.os.Binder; import android.os.Build; import android.provider.Settings; import android.text.TextUtils; @@ -36,7 +39,6 @@ public interface DeviceIndexFeatureProvider { - String TAG = "DeviceIndex"; String INDEX_VERSION = "settings:index_version"; @@ -57,7 +59,7 @@ void index(Context context, CharSequence title, Uri sliceUri, Uri launchUri, default void updateIndex(Context context, boolean force) { if (!isIndexingEnabled()) { - Log.w(TAG, "Skipping: device index is not enabled"); + Log.i(TAG, "Skipping: device index is not enabled"); return; } @@ -66,7 +68,29 @@ default void updateIndex(Context context, boolean force) { return; } + final ComponentName jobComponent = new ComponentName(context.getPackageName(), + DeviceIndexUpdateJobService.class.getName()); + + try { + final int callerUid = Binder.getCallingUid(); + final ServiceInfo si = context.getPackageManager().getServiceInfo(jobComponent, + PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE); + if (si == null) { + Log.w(TAG, "Skipping: No such service " + jobComponent); + return; + } + if (si.applicationInfo.uid != callerUid) { + Log.w(TAG, "Skipping: Uid cannot schedule DeviceIndexUpdate: " + callerUid); + return; + } + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Skipping: error finding DeviceIndexUpdateJobService from packageManager"); + return; + } + if (!force && skipIndex(context)) { + Log.i(TAG, "Skipping: already indexed."); // No need to update. return; } @@ -74,8 +98,6 @@ default void updateIndex(Context context, boolean force) { // Prevent scheduling multiple jobs setIndexState(context); - final ComponentName jobComponent = new ComponentName(context.getPackageName(), - DeviceIndexUpdateJobService.class.getName()); final int jobId = context.getResources().getInteger(R.integer.device_index_update); // Schedule a job so that we know it'll be able to complete, but try to run as // soon as possible. diff --git a/src/com/android/settings/search/actionbar/SearchMenuController.java b/src/com/android/settings/search/actionbar/SearchMenuController.java index 1729ccdb39a..131f7884fc7 100644 --- a/src/com/android/settings/search/actionbar/SearchMenuController.java +++ b/src/com/android/settings/search/actionbar/SearchMenuController.java @@ -25,6 +25,7 @@ import android.view.MenuItem; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.SearchFeatureProvider; import com.android.settingslib.core.lifecycle.LifecycleObserver; @@ -52,6 +53,9 @@ private SearchMenuController(@NonNull Fragment host) { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + if (!Utils.isDeviceProvisioned(mHost.getContext())) { + return; + } if (menu == null) { return; } diff --git a/tests/robotests/src/com/android/settings/DeviceAdminAddTest.java b/tests/robotests/src/com/android/settings/DeviceAdminAddTest.java index 1a4ce89fbcd..1602f15263a 100644 --- a/tests/robotests/src/com/android/settings/DeviceAdminAddTest.java +++ b/tests/robotests/src/com/android/settings/DeviceAdminAddTest.java @@ -18,23 +18,37 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.app.AppOpsManager; +import android.app.admin.DeviceAdminInfo; import android.content.Context; import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; 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.Robolectric; @RunWith(SettingsRobolectricTestRunner.class) public class DeviceAdminAddTest { + private static final int UID = 12345; + private static final String PACKAGE_NAME = "com.android.test.device.admin"; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private DeviceAdminInfo mDeviceAdmin; + @Mock + private BatteryUtils mBatteryUtils; private FakeFeatureFactory mFeatureFactory; private DeviceAdminAdd mDeviceAdminAdd; @@ -44,6 +58,10 @@ public void setUp() { mFeatureFactory = FakeFeatureFactory.setupForTest(); mDeviceAdminAdd = Robolectric.buildActivity(DeviceAdminAdd.class).get(); + + doReturn(UID).when(mBatteryUtils).getPackageUid(PACKAGE_NAME); + when(mDeviceAdmin.getComponent().getPackageName()).thenReturn(PACKAGE_NAME); + mDeviceAdminAdd.mDeviceAdmin = mDeviceAdmin; } @Test @@ -56,4 +74,23 @@ public void logSpecialPermissionChange() { verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class), eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY), eq("app")); } + + @Test + public void unrestrictAppIfPossible_appRestricted_unrestrictApp() { + doReturn(true).when(mBatteryUtils).isForceAppStandbyEnabled(UID, PACKAGE_NAME); + + mDeviceAdminAdd.unrestrictAppIfPossible(mBatteryUtils); + + verify(mBatteryUtils).setForceAppStandby(UID, PACKAGE_NAME, AppOpsManager.MODE_ALLOWED); + } + + @Test + public void unrestrictAppIfPossible_appUnrestricted_doNothing() { + doReturn(false).when(mBatteryUtils).isForceAppStandbyEnabled(UID, PACKAGE_NAME); + + mDeviceAdminAdd.unrestrictAppIfPossible(mBatteryUtils); + + verify(mBatteryUtils, never()).setForceAppStandby(UID, PACKAGE_NAME, + AppOpsManager.MODE_ALLOWED); + } } diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java index 2096629a63d..54b01eab76a 100644 --- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java @@ -16,6 +16,7 @@ package com.android.settings; +import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.doReturn; @@ -27,17 +28,25 @@ import android.app.ActivityManager; import android.app.FragmentManager; import android.app.FragmentTransaction; +import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.os.Bundle; +import android.provider.Settings.Global; +import android.view.View; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; @RunWith(SettingsRobolectricTestRunner.class) public class SettingsActivityTest { @@ -49,15 +58,46 @@ public class SettingsActivityTest { @Mock private Bitmap mBitmap; private SettingsActivity mActivity; + private Context mContext; @Before public void setUp() { MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; mActivity = spy(new SettingsActivity()); doReturn(mBitmap).when(mActivity).getBitmapFromXmlResource(anyInt()); } + @Test + @Config(shadows = { + SettingsShadowResourcesImpl.class, + SettingsShadowResources.SettingsShadowTheme.class, + }) + public void onCreate_deviceNotProvisioned_shouldDisableSearch() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + final Intent intent = new Intent(mContext, Settings.class); + final SettingsActivity activity = + Robolectric.buildActivity(SettingsActivity.class, intent).create(Bundle.EMPTY).get(); + + assertThat(activity.findViewById(R.id.search_bar).getVisibility()) + .isEqualTo(View.INVISIBLE); + } + + @Test + @Config(shadows = { + SettingsShadowResourcesImpl.class, + SettingsShadowResources.SettingsShadowTheme.class, + }) + public void onCreate_deviceProvisioned_shouldEnableSearch() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); + final Intent intent = new Intent(mContext, Settings.class); + final SettingsActivity activity = + Robolectric.buildActivity(SettingsActivity.class, intent).create(Bundle.EMPTY).get(); + + assertThat(activity.findViewById(R.id.search_bar).getVisibility()).isEqualTo(View.VISIBLE); + } + @Test public void launchSettingFragment_nullExtraShowFragment_shouldNotCrash() { when(mActivity.getFragmentManager()).thenReturn(mFragmentManager); diff --git a/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java index e37c852277f..fbc251206dc 100644 --- a/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java @@ -208,6 +208,31 @@ public void testUpdateState_noLockScreenNotificationsGlobally() { .contains(String.valueOf(VISIBILITY_PRIVATE))); } + @Test + public void testUpdateState_noLockScreenNotificationsGloballyInProfile() { + final int primaryUserId = 2; + final UserInfo primaryUserInfo = new UserInfo(primaryUserId, "user 2", 0); + when(mUm.getProfileParent(anyInt())).thenReturn(primaryUserInfo); + + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, primaryUserId); + + NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); + NotificationChannel channel = mock(NotificationChannel.class); + mController.onResume(appRow, channel, null, null); + + RestrictedListPreference pref = mock(RestrictedListPreference.class); + mController.updateState(pref); + + ArgumentCaptor argumentCaptor = + ArgumentCaptor.forClass(CharSequence[].class); + verify(pref, times(1)).setEntryValues(argumentCaptor.capture()); + assertFalse(toStringList(argumentCaptor.getValue()) + .contains(String.valueOf(VISIBILITY_NO_OVERRIDE))); + assertFalse(toStringList(argumentCaptor.getValue()) + .contains(String.valueOf(VISIBILITY_PRIVATE))); + } + @Test public void testUpdateState_noPrivateLockScreenNotificationsGlobally() { Settings.Secure.putInt(mContext.getContentResolver(), diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java new file mode 100644 index 00000000000..7a14896a8bb --- /dev/null +++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java @@ -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 static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.provider.Settings.Global; + +import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResources; + +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +public class ChooseLockGenericTest { + + @After + public void tearDown() { + Global.putInt(RuntimeEnvironment.application.getContentResolver(), + Global.DEVICE_PROVISIONED, 1); + } + + @Test + @Config(shadows = SettingsShadowResources.SettingsShadowTheme.class) + public void onCreate_deviceNotProvisioned_shouldFinishActivity() { + final Context context = RuntimeEnvironment.application; + Global.putInt(context.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + final Activity activity = mock(Activity.class); + when(activity.getContentResolver()).thenReturn(context.getContentResolver()); + when(activity.getTheme()).thenReturn(context.getTheme()); + + final ChooseLockGenericFragment fragment = spy(new ChooseLockGenericFragment()); + when(fragment.getActivity()).thenReturn(activity); + when(fragment.getArguments()).thenReturn(Bundle.EMPTY); + + fragment.onCreate(Bundle.EMPTY); + verify(activity).finish(); + } + +} diff --git a/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java b/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java index ebba3f310ce..b49ef1d0683 100644 --- a/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java +++ b/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java @@ -15,7 +15,6 @@ package com.android.settings.search; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -23,27 +22,42 @@ import android.app.Activity; import android.app.job.JobScheduler; +import android.os.Binder; import android.provider.Settings; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; +import org.robolectric.shadows.ShadowBinder; @RunWith(SettingsRobolectricTestRunner.class) public class DeviceIndexFeatureProviderTest { + @Mock + private JobScheduler mJobScheduler; private DeviceIndexFeatureProvider mProvider; private Activity mActivity; @Before public void setUp() { + MockitoAnnotations.initMocks(this); + ShadowBinder.reset(); FakeFeatureFactory.setupForTest(); mActivity = spy(Robolectric.buildActivity(Activity.class).create().visible().get()); mProvider = spy(new DeviceIndexFeatureProviderImpl()); + when(mActivity.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler); + } + + @After + public void tearDown() { + ShadowBinder.reset(); } @Test @@ -51,7 +65,7 @@ public void updateIndex_disabled_shouldDoNothing() { when(mProvider.isIndexingEnabled()).thenReturn(false); mProvider.updateIndex(mActivity, false); - verify(mProvider, never()).index(any(), any(), any(), any(), any()); + verify(mJobScheduler, never()).schedule(any()); } @Test @@ -62,19 +76,17 @@ public void updateIndex_enabled_unprovisioned_shouldDoNothing() { mProvider.updateIndex(mActivity, false); - verify(mProvider, never()).index(any(), any(), any(), any(), any()); + verify(mJobScheduler, never()).schedule(any()); } @Test public void updateIndex_enabled_provisioned_shouldIndex() { Settings.Global.putInt(mActivity.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); - JobScheduler jobScheduler = mock(JobScheduler.class); when(mProvider.isIndexingEnabled()).thenReturn(true); - when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler); mProvider.updateIndex(mActivity, false); - verify(jobScheduler).schedule(any()); + verify(mJobScheduler).schedule(any()); } @Test @@ -87,12 +99,22 @@ public void updateIndex_enabled_provisioned_newBuild_shouldIndex() { Settings.Global.putString(mActivity.getContentResolver(), DeviceIndexFeatureProvider.LANGUAGE.toString(), DeviceIndexFeatureProvider.INDEX_LANGUAGE); - JobScheduler jobScheduler = mock(JobScheduler.class); when(mProvider.isIndexingEnabled()).thenReturn(true); - when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler); mProvider.updateIndex(mActivity, false); - verify(jobScheduler).schedule(any()); + verify(mJobScheduler).schedule(any()); + } + + @Test + public void updateIndex_enabled_provisioned_differentUid_shouldNotIndex() { + Settings.Global.putInt(mActivity.getContentResolver(), + Settings.Global.DEVICE_PROVISIONED, 1); + when(mProvider.isIndexingEnabled()).thenReturn(true); + + ShadowBinder.setCallingUid(Binder.getCallingUid() + 2000); + + mProvider.updateIndex(mActivity, false); + verify(mJobScheduler, never()).schedule(any()); } @Test @@ -102,12 +124,11 @@ public void updateIndex_enabled_provisioned_newIndex_shouldIndex() { DeviceIndexFeatureProvider.setIndexState(mActivity); Settings.Global.putString(mActivity.getContentResolver(), DeviceIndexFeatureProvider.INDEX_LANGUAGE, "new language"); - JobScheduler jobScheduler = mock(JobScheduler.class); + when(mProvider.isIndexingEnabled()).thenReturn(true); - when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler); mProvider.updateIndex(mActivity, false); - verify(jobScheduler).schedule(any()); + verify(mJobScheduler).schedule(any()); } @Test @@ -120,11 +141,8 @@ public void updateIndex_enabled_provisioned_sameBuild_sameLang_shouldNotIndex() // Same build and same language DeviceIndexFeatureProvider.setIndexState(mActivity); - final JobScheduler jobScheduler = mock(JobScheduler.class); - when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler); - mProvider.updateIndex(mActivity, false); - verify(jobScheduler, never()).schedule(any()); + verify(mJobScheduler, never()).schedule(any()); } } diff --git a/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java b/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java index 7ff4accb178..9900df292bc 100644 --- a/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java +++ b/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java @@ -17,11 +17,14 @@ package com.android.settings.search.actionbar; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; +import android.content.Context; import android.os.Bundle; +import android.provider.Settings.Global; import android.view.Menu; import android.view.MenuItem; @@ -35,6 +38,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) public class SearchMenuControllerTest { @@ -43,12 +47,16 @@ public class SearchMenuControllerTest { private Menu mMenu; private TestPreferenceFragment mPreferenceHost; private ObservableFragment mHost; + private Context mContext; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mHost = new ObservableFragment(); + mContext = RuntimeEnvironment.application; + mHost = spy(new ObservableFragment()); + when(mHost.getContext()).thenReturn(mContext); mPreferenceHost = new TestPreferenceFragment(); + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); when(mMenu.add(Menu.NONE, Menu.NONE, 0 /* order */, R.string.search_menu)) .thenReturn(mock(MenuItem.class)); @@ -81,9 +89,23 @@ public void init_doNotNeedSearchIcon_shouldNotAddMenu() { verifyZeroInteractions(mMenu); } + @Test + public void init_deviceNotProvisioned_shouldNotAddMenu() { + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 0); + SearchMenuController.init(mHost); + mHost.getLifecycle().onCreateOptionsMenu(mMenu, null /* inflater */); + + verifyZeroInteractions(mMenu); + } + private static class TestPreferenceFragment extends ObservablePreferenceFragment { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { } + + @Override + public Context getContext() { + return RuntimeEnvironment.application; + } } }