blob: 8e391f31525d45c9ba85bee4df707f05412ec43a [file] [log] [blame]
/*
* 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.ui;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.Direction;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.Until;
import android.system.helpers.SettingsHelper;
import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.MediumTest;
public class LocationSettingsTests extends InstrumentationTestCase {
private static final String SETTINGS_PACKAGE = "com.android.settings";
private static final int TIMEOUT = 2000;
private UiDevice mDevice;
@Override
public void setUp() throws Exception {
super.setUp();
mDevice = UiDevice.getInstance(getInstrumentation());
try {
mDevice.setOrientationNatural();
} catch (RemoteException e) {
throw new RuntimeException("failed to freeze device orientaion", e);
}
}
@Override
protected void tearDown() throws Exception {
mDevice.pressBack();
mDevice.pressHome();
super.tearDown();
}
@MediumTest
public void testLoadingLocationSettings () throws Exception {
// Load Security
SettingsHelper.launchSettingsPage(getInstrumentation().getContext(),
Settings.ACTION_SECURITY_SETTINGS);
SettingsHelper helper = new SettingsHelper();
helper.scrollVert(true);
// Tap on location
UiObject2 settingsPanel = mDevice.wait(Until.findObject
(By.res(SETTINGS_PACKAGE, "main_content")), TIMEOUT);
int count = 0;
UiObject2 locationTitle = null;
while(count < 6 && locationTitle == null) {
locationTitle = mDevice.wait(Until.findObject(By.text("Location")), TIMEOUT);
if (locationTitle == null) {
settingsPanel.scroll(Direction.DOWN, 1.0f);
}
count++;
}
// Verify location settings loads.
locationTitle.click();
Thread.sleep(TIMEOUT);
assertNotNull("Location screen has not loaded correctly",
mDevice.wait(Until.findObject(By.text("Location services")), TIMEOUT));
}
@Presubmit
@MediumTest
public void testLocationSettingOn() throws Exception {
verifyLocationSettingsOnOrOff(true);
}
@MediumTest
public void testLocationSettingOff() throws Exception {
verifyLocationSettingsOnOrOff(false);
}
@MediumTest
public void testLocationDeviceOnlyMode() throws Exception {
// Changing the value from default before testing the toggle to Device only mode
Settings.Secure.putInt(getInstrumentation().getContext().getContentResolver(),
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_ON);
dismissAlertDialogs();
Thread.sleep(TIMEOUT);
verifyLocationSettingsMode(Settings.Secure.LOCATION_MODE_SENSORS_ONLY);
}
@MediumTest
public void testLocationBatterySavingMode() throws Exception {
Settings.Secure.putInt(getInstrumentation().getContext().getContentResolver(),
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_SENSORS_ONLY);
Thread.sleep(TIMEOUT);
verifyLocationSettingsMode(Settings.Secure.LOCATION_MODE_BATTERY_SAVING);
}
@MediumTest
public void testLocationHighAccuracyMode() throws Exception {
Settings.Secure.putInt(getInstrumentation().getContext().getContentResolver(),
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_SENSORS_ONLY);
Thread.sleep(TIMEOUT);
verifyLocationSettingsMode(Settings.Secure.LOCATION_MODE_ON);
}
@MediumTest
public void testLocationSettingsElements() throws Exception {
String[] textElements = {"Location", "Mode", "Recent location requests",
"Location services"};
SettingsHelper.launchSettingsPage(getInstrumentation().getContext(),
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
Thread.sleep(TIMEOUT);
for (String element : textElements) {
assertNotNull(element + " item not found under Location Settings",
mDevice.wait(Until.findObject(By.text(element)), TIMEOUT));
}
}
@MediumTest
public void testLocationSettingsOverflowMenuElements() throws Exception {
SettingsHelper.launchSettingsPage(getInstrumentation().getContext(),
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
// Verify help & feedback
assertNotNull("Help & feedback item not found under Location Settings",
mDevice.wait(Until.findObject(By.desc("Help & feedback")), TIMEOUT));
// Verify scanning
assertNotNull("Scanning item not found under Location Settings",
mDevice.wait(Until.findObject(By.text("Scanning")), TIMEOUT));
}
private void verifyLocationSettingsMode(int mode) throws Exception {
int modeIntValue = 1;
String textMode = "Device only";
if (mode == Settings.Secure.LOCATION_MODE_ON) {
modeIntValue = 3;
textMode = "High accuracy";
}
else if (mode == Settings.Secure.LOCATION_MODE_BATTERY_SAVING) {
modeIntValue = 2;
textMode = "Battery saving";
}
// Load location settings
SettingsHelper.launchSettingsPage(getInstrumentation().getContext(),
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
// Tap on mode
dismissAlertDialogs();
// Load location settings
mDevice.wait(Until.findObject(By.text("Mode")), TIMEOUT).click();
Thread.sleep(TIMEOUT);
assertNotNull("Location mode screen not loaded", mDevice.wait(Until.findObject
(By.text("Location mode")), TIMEOUT));
// Choose said mode
mDevice.wait(Until.findObject(By.text(textMode)), TIMEOUT).click();
Thread.sleep(TIMEOUT);
dismissAlertDialogs();
mDevice.wait(Until.findObject(By.desc("Navigate up")), TIMEOUT).click();
Thread.sleep(TIMEOUT);
if (mode == Settings.Secure.LOCATION_MODE_ON ||
mode == Settings.Secure.LOCATION_MODE_BATTERY_SAVING) {
dismissAlertDialogs();
}
// get setting and verify value
// Verify change of mode
int locationSettingMode =
Settings.Secure.getInt(getInstrumentation().getContext().getContentResolver(),
Settings.Secure.LOCATION_MODE);
assertEquals(mode + " value not set correctly for location.", modeIntValue,
locationSettingMode);
}
private void verifyLocationSettingsOnOrOff(boolean verifyOn) throws Exception {
// Set location flag
if (verifyOn) {
Settings.Secure.putInt(getInstrumentation().getContext().getContentResolver(),
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
}
else {
Settings.Secure.putInt(getInstrumentation().getContext().getContentResolver(),
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_ON);
}
dismissAlertDialogs();
// Load location settings
SettingsHelper.launchSettingsPage(getInstrumentation().getContext(),
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
dismissAlertDialogs();
// Toggle UI
mDevice.wait(Until.findObject(By.res(SETTINGS_PACKAGE, "switch_widget")), TIMEOUT).click();
dismissAlertDialogs();
Thread.sleep(TIMEOUT);
// Verify change in setting
int locationEnabled = Settings.Secure.getInt(getInstrumentation()
.getContext().getContentResolver(),
Settings.Secure.LOCATION_MODE);
if (verifyOn) {
assertFalse("Location not enabled correctly", locationEnabled == 0);
}
else {
assertEquals("Location not disabled correctly", 0, locationEnabled);
}
}
// This method dismisses both alert dialogs that might popup and
// interfere with the test. Since the order in which the dialog
// shows up changes in no specific known way, we're checking for
// both dialogs in any order for a robust test. Bug b/36233151
// filed against Location team for specifications. This is a
// workaround in the meantime to ensure coverage.
private void dismissAlertDialogs() throws Exception {
for (int count = 0; count < 2; count++) {
UiObject2 agreeDialog = mDevice.wait(Until.findObject
(By.text("Improve location accuracy?")), TIMEOUT);
UiObject2 previousChoiceYesButton = mDevice.wait(Until.findObject
(By.text("YES")), TIMEOUT);
if (agreeDialog != null) {
mDevice.wait(Until.findObject
(By.text("AGREE")), TIMEOUT).click();
Thread.sleep(TIMEOUT);
assertNull("Improve location dialog not dismissed",
mDevice.wait(Until.findObject
(By.text("Improve location accuracy?")), TIMEOUT));
}
if (previousChoiceYesButton != null) {
previousChoiceYesButton.click();
// Short sleep to wait for the new screen
Thread.sleep(TIMEOUT);
}
}
}
}