/* * Copyright (C) 2016 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.gesture; import android.content.Context; import android.content.Intent; import android.provider.Settings.Secure; import android.support.test.filters.MediumTest; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiSelector; import android.support.test.uiautomator.UiScrollable; import android.test.InstrumentationTestCase; import android.util.Log; import android.widget.RelativeLayout; import android.widget.Switch; import com.android.settings.R; import java.io.BufferedReader; import java.io.InputStreamReader; import org.junit.Test; /** * Test for Gesture preferences. */ @MediumTest public class GestureSettingsTest extends InstrumentationTestCase { private static final String TAG = "GestureSettingsTest"; private UiDevice mDevice; private Context mTargetContext; private String mTargetPackage; @Override protected void setUp() throws Exception { super.setUp(); mDevice = UiDevice.getInstance(getInstrumentation()); mTargetContext = getInstrumentation().getTargetContext(); mTargetPackage = mTargetContext.getPackageName(); } @Test public void testAmbientDisplaySwitchPreference() throws Exception { launchSettings(); UiObject dozeSwitch = getDozeSwitch(); assertNotNull(dozeSwitch); assertTrue(dozeSwitch.exists()); assertToggleStateMatchesSettingValue(dozeSwitch, Secure.DOZE_ENABLED, 1, 1); } @Test public void testGestureSettingsExists() throws Exception { launchMoves(); UiObject titleObj = mDevice.findObject(new UiSelector().text( mTargetContext.getResources().getString(R.string.gesture_preference_title))); assertNotNull(titleObj); assertTrue(titleObj.exists()); } @Test public void testCameraDoubleTapToggle() throws Exception { assertSwitchToggle(mTargetContext.getResources().getString( R.string.double_tap_power_for_camera_title), Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0, 0); } @Test public void testCameraDoubleTwistToggle() throws Exception { assertSwitchToggle(mTargetContext.getResources().getString( R.string.double_twist_for_camera_mode_title), Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 1, 1); } @Test public void testFingerprintSwipeToggle() throws Exception { assertSwitchToggle(mTargetContext.getResources().getString( R.string.fingerprint_swipe_for_notifications_title), Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0, 1); } @Test public void testDozeDoubleTapToggle() throws Exception { assertSwitchToggle(mTargetContext.getResources().getString( R.string.ambient_display_title), Secure.DOZE_PULSE_ON_DOUBLE_TAP, 1, 1); } @Test public void testDozePickupToggle() throws Exception { assertSwitchToggle(mTargetContext.getResources().getString( R.string.ambient_display_pickup_title), Secure.DOZE_PULSE_ON_PICK_UP, 1, 1); } private void launchSettings() { Intent settingsIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER) .setPackage(mTargetPackage) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getInstrumentation().getContext().startActivity(settingsIntent); } private void launchMoves() throws Exception { launchSettings(); UiScrollable settings = new UiScrollable( new UiSelector().packageName(mTargetPackage).scrollable(true)); String titleMoves = mTargetContext.getResources().getString(R.string.gesture_preference_title); settings.scrollTextIntoView(titleMoves); mDevice.findObject(new UiSelector().text(titleMoves)).click(); } private void navigateToMovesSetting(String title) throws Exception { launchMoves(); UiScrollable moves = new UiScrollable( new UiSelector().packageName(mTargetPackage).scrollable(true)); moves.scrollTextIntoView(title); } private UiScrollable navigateToAmbientDisplay() throws Exception { UiScrollable settings = new UiScrollable( new UiSelector().packageName(mTargetPackage).scrollable(true)); String titleDisplay = mTargetContext.getResources().getString(R.string.display_settings_title); settings.scrollTextIntoView(titleDisplay); mDevice.findObject(new UiSelector().text(titleDisplay)).click(); settings.scrollTextIntoView(mTargetContext.getResources().getString(R.string.doze_title)); return settings; } private UiObject getGestureSwitch(String title) throws Exception { UiObject titleView = mDevice.findObject(new UiSelector().text(title)); UiObject gestureSwitch = titleView.getFromParent(new UiSelector().className(Switch.class.getName())); assertNotNull(gestureSwitch); assertTrue(gestureSwitch.exists()); return gestureSwitch; } private UiObject getDozeSwitch() throws Exception { UiScrollable settings = navigateToAmbientDisplay(); UiObject dozeSwitch = null; UiSelector relativeLayoutSelector = new UiSelector().className(RelativeLayout.class.getName()); String titleDoze = mTargetContext.getResources().getString(R.string.doze_title); for (int i = 0; i <= settings.getChildCount(relativeLayoutSelector); i++) { UiObject relativeLayout = settings.getChild(relativeLayoutSelector.instance(i)); if (relativeLayout.getChildCount() != 2) { continue; } UiObject obj1 = relativeLayout.getChild(new UiSelector().index(0)); if (obj1.getText() == titleDoze) { return relativeLayout.getFromParent( new UiSelector().className(Switch.class.getName())); } } return null; } private void assertSwitchToggle(String title, String key, int defaultVal, int enabledVal) throws Exception { navigateToMovesSetting(title); assertToggleStateMatchesSettingValue(getGestureSwitch(title), key, defaultVal, enabledVal); } private void assertToggleStateMatchesSettingValue ( UiObject testSwitch, String key, int defaultVal, int enabledVal) throws Exception { // check initial state int currentValue = Secure.getInt(mTargetContext.getContentResolver(), key, defaultVal); boolean enabled = currentValue == enabledVal; assertEquals(enabled, testSwitch.isChecked()); // toggle the preference testSwitch.click(); assertEquals(!enabled, testSwitch.isChecked()); int newValue = currentValue == 1 ? 0 : 1; assertEquals(newValue, Secure.getInt(mTargetContext.getContentResolver(), key, defaultVal)); } }