Merge "Add missing 'pin' screen lock option" into oc-dr1-dev
diff --git a/src/com/android/settings/password/ChooseLockTypeDialogFragment.java b/src/com/android/settings/password/ChooseLockTypeDialogFragment.java
index ba69e64..13dc996 100644
--- a/src/com/android/settings/password/ChooseLockTypeDialogFragment.java
+++ b/src/com/android/settings/password/ChooseLockTypeDialogFragment.java
@@ -46,15 +46,13 @@
         implements OnClickListener {
 
     private static final String ARG_USER_ID = "userId";
-    private static final String ARG_EXCLUDE_LOCK = "excludeLock";
 
     private ScreenLockAdapter mAdapter;
     private ChooseLockGenericController mController;
 
-    public static ChooseLockTypeDialogFragment newInstance(int userId, String excludeLock) {
+    public static ChooseLockTypeDialogFragment newInstance(int userId) {
         Bundle args = new Bundle();
         args.putInt(ARG_USER_ID, userId);
-        args.putString(ARG_EXCLUDE_LOCK, excludeLock);
         ChooseLockTypeDialogFragment fragment = new ChooseLockTypeDialogFragment();
         fragment.setArguments(args);
         return fragment;
@@ -96,10 +94,6 @@
                 mController.getVisibleScreenLockTypes(
                         DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,
                         false /* includeDisabled */);
-        String excludeLockName = getArguments().getString(ARG_EXCLUDE_LOCK);
-        if (excludeLockName != null) {
-            locks.remove(ScreenLockType.valueOf(excludeLockName));
-        }
         mAdapter = new ScreenLockAdapter(context, locks, mController);
         builder.setAdapter(mAdapter, this);
         builder.setTitle(R.string.setup_lock_settings_options_dialog_title);
diff --git a/src/com/android/settings/password/SetupChooseLockPassword.java b/src/com/android/settings/password/SetupChooseLockPassword.java
index bd935a2..b8ded5e 100644
--- a/src/com/android/settings/password/SetupChooseLockPassword.java
+++ b/src/com/android/settings/password/SetupChooseLockPassword.java
@@ -114,9 +114,7 @@
         }
 
         private void launchChooseLockGeneric() {
-            ScreenLockType currentLock = mIsAlphaMode
-                    ? ScreenLockType.PASSWORD : ScreenLockType.PIN;
-            ChooseLockTypeDialogFragment.newInstance(mUserId, currentLock.toString())
+            ChooseLockTypeDialogFragment.newInstance(mUserId)
                     .show(getChildFragmentManager(), null);
         }
 
@@ -130,6 +128,12 @@
 
         @Override
         public void onLockTypeSelected(ScreenLockType lock) {
+            ScreenLockType currentLockType = mIsAlphaMode ?
+                    ScreenLockType.PASSWORD : ScreenLockType.PIN;
+            if (currentLockType.equals(lock)) {
+                // ignore same lock type.
+                return;
+            }
             Intent activityIntent = getActivity().getIntent();
             Intent intent = new Intent(getContext(), SetupChooseLockGeneric.class);
 
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
new file mode 100644
index 0000000..0a0734f
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockTypeDialogFragmentTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2017 Google Inc.
+ *
+ * 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.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.app.AlertDialog;
+import android.app.Fragment;
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.password.ChooseLockTypeDialogFragment.OnLockTypeSelectedListener;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowEventLogWriter;
+import com.android.settings.testutils.shadow.ShadowUserManager;
+import com.android.settings.testutils.shadow.ShadowUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.util.FragmentTestUtil;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(
+        manifest = TestConfig.MANIFEST_PATH,
+        sdk = TestConfig.SDK_VERSION,
+        shadows = {
+                ShadowEventLogWriter.class,
+                ShadowUserManager.class,
+                ShadowUtils.class
+        })
+public class ChooseLockTypeDialogFragmentTest {
+    private Context mContext;
+    private TestFragment mFragment;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mFragment = new TestFragment();
+        FragmentTestUtil.startFragment(mFragment);
+    }
+
+    @Test
+    public void testThatDialog_IsShown() {
+        AlertDialog latestDialog = startLockFragment();
+        assertNotNull(latestDialog);
+        ShadowDialog shadowDialog = Shadows.shadowOf(latestDialog);
+        // verify that we are looking at the expected dialog.
+        assertEquals(shadowDialog.getTitle(),
+                mContext.getString(R.string.setup_lock_settings_options_dialog_title));
+    }
+
+    @Test
+    public void testThat_OnClickListener_IsCalled() {
+        mFragment.mDelegate = mock(OnLockTypeSelectedListener.class);
+        AlertDialog lockDialog = startLockFragment();
+        ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(lockDialog);
+        shadowAlertDialog.clickOnItem(0);
+        verify(mFragment.mDelegate, times(1)).onLockTypeSelected(any(ScreenLockType.class));
+    }
+
+    @Test
+    public void testThat_OnClickListener_IsNotCalledWhenCancelled() {
+        mFragment.mDelegate = mock(OnLockTypeSelectedListener.class);
+        AlertDialog lockDialog = startLockFragment();
+        lockDialog.dismiss();
+        verify(mFragment.mDelegate, never()).onLockTypeSelected(any(ScreenLockType.class));
+    }
+
+
+    private AlertDialog startLockFragment() {
+        ChooseLockTypeDialogFragment chooseLockTypeDialogFragment =
+                ChooseLockTypeDialogFragment.newInstance(1234);
+        chooseLockTypeDialogFragment.show(mFragment.getChildFragmentManager(), null);
+        return ShadowAlertDialog.getLatestAlertDialog();
+    }
+
+
+    public static class TestFragment extends Fragment
+            implements OnLockTypeSelectedListener{
+        OnLockTypeSelectedListener mDelegate;
+        @Override
+        public void onLockTypeSelected(ScreenLockType lock) {
+            if (mDelegate != null) {
+                mDelegate.onLockTypeSelected(lock);
+            }
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
index f7526db..5f4c16a 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPasswordTest.java
@@ -21,16 +21,17 @@
 import static org.robolectric.RuntimeEnvironment.application;
 import static org.robolectric.Shadows.shadowOf;
 
+import android.app.AlertDialog;
 import android.content.Intent;
 import android.os.Bundle;
 import android.widget.Button;
 
 import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
 import com.android.settings.password.ChooseLockPassword.IntentBuilder;
 import com.android.settings.password.SetupChooseLockPassword.SetupChooseLockPasswordFragment;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
 import com.android.settings.testutils.shadow.ShadowEventLogWriter;
@@ -39,9 +40,11 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowActivity;
 import org.robolectric.shadows.ShadowActivity.IntentForResult;
+import org.robolectric.shadows.ShadowAlertDialog;
 import org.robolectric.shadows.ShadowDialog;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -69,23 +72,23 @@
 
     @Test
     public void createActivity_withShowOptionsButtonExtra_shouldShowButton() {
-        Intent intent = SetupChooseLockPassword.modifyIntentForSetup(
-                application,
-                new IntentBuilder(application).build());
-        intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
-        SetupChooseLockPassword activity =
-                Robolectric.buildActivity(SetupChooseLockPassword.class, intent).setup().get();
-
+        SetupChooseLockPassword activity = createSetupChooseLockPassword();
         Button optionsButton = activity.findViewById(R.id.screen_lock_options);
         assertThat(optionsButton).isNotNull();
-
-        ShadowActivity shadowActivity = shadowOf(activity);
         optionsButton.performClick();
-
         assertThat(ShadowDialog.getLatestDialog()).isNotNull();
     }
 
     @Test
+    public void allSecurityOptions_shouldBeShown_When_OptionsButtonIsClicked() {
+        SetupChooseLockPassword activity = createSetupChooseLockPassword();
+        activity.findViewById(R.id.screen_lock_options).performClick();
+        AlertDialog latestAlertDialog = ShadowAlertDialog.getLatestAlertDialog();
+        int count = Shadows.shadowOf(latestAlertDialog).getAdapter().getCount();
+        assertThat(count).named("List items shown").isEqualTo(3);
+    }
+
+    @Test
     public void createActivity_clickDifferentOption_extrasShouldBePropagated() {
         Bundle bundle = new Bundle();
         bundle.putString("foo", "bar");
@@ -111,4 +114,12 @@
         assertThat(chooseLockIntent.intent.getStringExtra("foo")).named("Foo extra")
                 .isEqualTo("bar");
     }
+
+    private SetupChooseLockPassword createSetupChooseLockPassword() {
+        Intent intent = SetupChooseLockPassword.modifyIntentForSetup(
+                application,
+                new IntentBuilder(application).build());
+        intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
+        return Robolectric.buildActivity(SetupChooseLockPassword.class, intent).setup().get();
+    }
 }