Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9a058d26 authored by Neil Fuller's avatar Neil Fuller
Browse files

Move "API" constants to API classes

Shell commands are a form of API even if they cannot be accessed from
host test code. Put them on the android.app classes accordingly (but hidden).

Bug: 172934905
Test: build / treehugger only
Change-Id: I083d75f391206273d585c6d1155af70dab25940d
parent cd101fa5
Loading
Loading
Loading
Loading
+123 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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 android.app.time;

/**
 * Constants related to the LocationTimeZoneManager service that are used by shell commands and
 * tests.
 *
 * @hide
 */
public final class LocationTimeZoneManager {

    /**
     * The name of the primary location time zone provider, used for shell commands.
     */
    public static final String PRIMARY_PROVIDER_NAME = "primary";

    /**
     * The name of the secondary location time zone provider, used for shell commands.
     */
    public static final String SECONDARY_PROVIDER_NAME = "secondary";

    /**
     * The name of the service for shell commands
     */
    public static final String SHELL_COMMAND_SERVICE_NAME = "location_time_zone_manager";

    /**
     * Shell command that starts the service (after stop).
     */
    public static final String SHELL_COMMAND_START = "start";

    /**
     * Shell command that stops the service.
     */
    public static final String SHELL_COMMAND_STOP = "stop";

    /**
     * Shell command that sends test commands to a provider
     */
    public static final String SHELL_COMMAND_SEND_PROVIDER_TEST_COMMAND =
            "send_provider_test_command";

    /**
     * Simulated provider test command that simulates the bind succeeding.
     */
    public static final String SIMULATED_PROVIDER_TEST_COMMAND_ON_BIND = "on_bind";

    /**
     * Simulated provider test command that simulates the provider unbinding.
     */
    public static final String SIMULATED_PROVIDER_TEST_COMMAND_ON_UNBIND = "on_unbind";

    /**
     * Simulated provider test command that simulates the provider entering the "permanent failure"
     * state.
     */
    public static final String SIMULATED_PROVIDER_TEST_COMMAND_PERM_FAILURE = "perm_fail";

    /**
     * Simulated provider test command that simulates the provider entering the "success" (time
     * zone(s) detected) state.
     */
    public static final String SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS = "success";

    /**
     * Argument for {@link #SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS} to specify TZDB time zone IDs.
     */
    public static final String SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS_ARG_KEY_TZ = "tz";

    /**
     * Simulated provider test command that simulates the provider entering the "uncertain"
     * state.
     */
    public static final String SIMULATED_PROVIDER_TEST_COMMAND_UNCERTAIN = "uncertain";

    private static final String SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_PREFIX =
            "persist.sys.geotz.";

    /**
     * The name of the system property that can be used to set the primary provider into test mode
     * (value = {@link #SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_SIMULATED}) or disabled (value = {@link
     * #SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_DISABLED}).
     */
    public static final String SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_PRIMARY =
            SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_PREFIX + PRIMARY_PROVIDER_NAME;

    /**
     * The name of the system property that can be used to set the secondary provider into test mode
     * (value = {@link #SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_SIMULATED}) or disabled (value = {@link
     * #SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_DISABLED}).
     */
    public static final String SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_SECONDARY =
            SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_PREFIX + SECONDARY_PROVIDER_NAME;

    /**
     * The value of the provider mode system property to put a provider into test mode.
     */
    public static final String SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_SIMULATED = "simulated";

    /**
     * The value of the provider mode system property to put a provider into disabled mode.
     */
    public static final String SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_DISABLED = "disabled";

    private LocationTimeZoneManager() {
        // No need to instantiate.
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -29,6 +29,13 @@ import android.content.Context;
@SystemService(Context.TIME_ZONE_DETECTOR_SERVICE)
public interface TimeZoneDetector {

    /** @hide */
    String SHELL_COMMAND_SUGGEST_GEO_LOCATION_TIME_ZONE = "suggest_geo_location_time_zone";
    /** @hide */
    String SHELL_COMMAND_SUGGEST_MANUAL_TIME_ZONE = "suggest_manual_time_zone";
    /** @hide */
    String SHELL_COMMAND_SUGGEST_TELEPHONY_TIME_ZONE = "suggest_telephony_time_zone";

    /**
     * A shared utility method to create a {@link ManualTimeZoneSuggestion}.
     *
+27 −11
Original line number Diff line number Diff line
@@ -16,6 +16,13 @@

package com.android.server.location.timezone;

import static android.app.time.LocationTimeZoneManager.PRIMARY_PROVIDER_NAME;
import static android.app.time.LocationTimeZoneManager.SECONDARY_PROVIDER_NAME;
import static android.app.time.LocationTimeZoneManager.SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_PRIMARY;
import static android.app.time.LocationTimeZoneManager.SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_SECONDARY;
import static android.app.time.LocationTimeZoneManager.SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_DISABLED;
import static android.app.time.LocationTimeZoneManager.SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_SIMULATED;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -119,13 +126,6 @@ public class LocationTimeZoneManagerService extends Binder {

    static final String TAG = "LocationTZDetector";

    static final String PRIMARY_PROVIDER_NAME = "primary";
    static final String SECONDARY_PROVIDER_NAME = "secondary";

    static final String PROVIDER_MODE_OVERRIDE_SYSTEM_PROPERTY_PREFIX = "persist.sys.geotz.";
    static final String PROVIDER_MODE_SIMULATED = "simulated";
    static final String PROVIDER_MODE_DISABLED = "disabled";

    private static final long BLOCKING_OP_WAIT_DURATION_MILLIS = Duration.ofSeconds(20).toMillis();

    private static final String ATTRIBUTION_TAG = "LocationTimeZoneService";
@@ -269,13 +269,15 @@ public class LocationTimeZoneManagerService extends Binder {

    /** Used for bug triage and in tests to simulate provider events. */
    private static boolean isInSimulationMode(String providerName) {
        return isProviderModeSetInSystemProperties(providerName, PROVIDER_MODE_SIMULATED);
        return isProviderModeSetInSystemProperties(providerName,
                SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_SIMULATED);
    }

    /** Used for bug triage, tests and experiments to remove a provider. */
    private boolean isDisabled(String providerName) {
        return !isProviderEnabledInConfig(providerName)
                || isProviderModeSetInSystemProperties(providerName, PROVIDER_MODE_DISABLED);
                || isProviderModeSetInSystemProperties(
                        providerName, SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_DISABLED);
    }

    private boolean isProviderEnabledInConfig(String providerName) {
@@ -299,8 +301,22 @@ public class LocationTimeZoneManagerService extends Binder {

    private static boolean isProviderModeSetInSystemProperties(
            @NonNull String providerName, @NonNull String mode) {
        String systemPropertyProviderMode = SystemProperties.get(
                PROVIDER_MODE_OVERRIDE_SYSTEM_PROPERTY_PREFIX + providerName, null);
        String systemPropertyKey;
        switch (providerName) {
            case PRIMARY_PROVIDER_NAME: {
                systemPropertyKey = SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_PRIMARY;
                break;
            }
            case SECONDARY_PROVIDER_NAME: {
                systemPropertyKey = SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_SECONDARY;
                break;
            }
            default: {
                throw new IllegalArgumentException(providerName);
            }
        }

        String systemPropertyProviderMode = SystemProperties.get(systemPropertyKey, null);
        return Objects.equals(systemPropertyProviderMode, mode);
    }

+21 −17
Original line number Diff line number Diff line
@@ -15,8 +15,15 @@
 */
package com.android.server.location.timezone;

import static com.android.server.location.timezone.LocationTimeZoneManagerService.PRIMARY_PROVIDER_NAME;
import static com.android.server.location.timezone.LocationTimeZoneManagerService.SECONDARY_PROVIDER_NAME;
import static android.app.time.LocationTimeZoneManager.PRIMARY_PROVIDER_NAME;
import static android.app.time.LocationTimeZoneManager.SECONDARY_PROVIDER_NAME;
import static android.app.time.LocationTimeZoneManager.SHELL_COMMAND_SEND_PROVIDER_TEST_COMMAND;
import static android.app.time.LocationTimeZoneManager.SHELL_COMMAND_START;
import static android.app.time.LocationTimeZoneManager.SHELL_COMMAND_STOP;
import static android.app.time.LocationTimeZoneManager.SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_PRIMARY;
import static android.app.time.LocationTimeZoneManager.SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_SECONDARY;
import static android.app.time.LocationTimeZoneManager.SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_DISABLED;
import static android.app.time.LocationTimeZoneManager.SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_SIMULATED;

import android.annotation.NonNull;
import android.os.Bundle;
@@ -32,10 +39,6 @@ class LocationTimeZoneManagerShellCommand extends ShellCommand {
    private static final List<String> VALID_PROVIDER_NAMES =
            Arrays.asList(PRIMARY_PROVIDER_NAME, SECONDARY_PROVIDER_NAME);

    private static final String CMD_START = "start";
    private static final String CMD_STOP = "stop";
    private static final String CMD_SEND_PROVIDER_TEST_COMMAND = "send_provider_test_command";

    private final LocationTimeZoneManagerService mService;

    LocationTimeZoneManagerShellCommand(LocationTimeZoneManagerService service) {
@@ -49,13 +52,13 @@ class LocationTimeZoneManagerShellCommand extends ShellCommand {
        }

        switch (cmd) {
            case CMD_START: {
            case SHELL_COMMAND_START: {
                return runStart();
            }
            case CMD_STOP: {
            case SHELL_COMMAND_STOP: {
                return runStop();
            }
            case CMD_SEND_PROVIDER_TEST_COMMAND: {
            case SHELL_COMMAND_SEND_PROVIDER_TEST_COMMAND: {
                return runSendProviderTestCommand();
            }
            default: {
@@ -70,15 +73,15 @@ class LocationTimeZoneManagerShellCommand extends ShellCommand {
        pw.println("Location Time Zone Manager (location_time_zone_manager) commands:");
        pw.println("  help");
        pw.println("    Print this help text.");
        pw.printf("  %s\n", CMD_START);
        pw.printf("  %s\n", SHELL_COMMAND_START);
        pw.println("    Starts the location_time_zone_manager, creating time zone providers.");
        pw.printf("  %s\n", CMD_STOP);
        pw.printf("  %s\n", SHELL_COMMAND_STOP);
        pw.println("    Stops the location_time_zone_manager, destroying time zone providers.");
        pw.printf("  %s <provider name> <test command>\n",
                CMD_SEND_PROVIDER_TEST_COMMAND);
                SHELL_COMMAND_SEND_PROVIDER_TEST_COMMAND);
        pw.println("    Passes a test command to the named provider.");
        pw.println();
        pw.printf("%s details:\n", CMD_SEND_PROVIDER_TEST_COMMAND);
        pw.printf("%s details:\n", SHELL_COMMAND_SEND_PROVIDER_TEST_COMMAND);
        pw.println();
        pw.printf("<provider name> = One of %s\n", VALID_PROVIDER_NAMES);
        pw.println();
@@ -86,13 +89,14 @@ class LocationTimeZoneManagerShellCommand extends ShellCommand {
        pw.println();
        TestCommand.printShellCommandEncodingHelp(pw);
        pw.println();
        pw.printf("Provider modes can be modified by setting the \"%s<provider name>\" system"
        pw.printf("Provider modes can be modified by setting the \"%s\" or \"%s\"\n system"
                        + " property and restarting the service or rebooting the device.\n",
                LocationTimeZoneManagerService.PROVIDER_MODE_OVERRIDE_SYSTEM_PROPERTY_PREFIX);
                SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_PRIMARY,
                SYSTEM_PROPERTY_KEY_PROVIDER_MODE_OVERRIDE_SECONDARY);
        pw.println("Values are:");
        pw.printf("  %s - simulation mode (see below for commands)\n",
                LocationTimeZoneManagerService.PROVIDER_MODE_SIMULATED);
        pw.printf("  %s - disabled mode\n", LocationTimeZoneManagerService.PROVIDER_MODE_DISABLED);
                SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_SIMULATED);
        pw.printf("  %s - disabled mode\n", SYSTEM_PROPERTY_VALUE_PROVIDER_MODE_DISABLED);
        pw.println();
        pw.println("Simulated providers can be used to test the system server behavior or to"
                + " reproduce bugs without the complexity of using real providers.");
+24 −26
Original line number Diff line number Diff line
@@ -16,6 +16,12 @@

package com.android.server.location.timezone;

import static android.app.time.LocationTimeZoneManager.SIMULATED_PROVIDER_TEST_COMMAND_ON_BIND;
import static android.app.time.LocationTimeZoneManager.SIMULATED_PROVIDER_TEST_COMMAND_ON_UNBIND;
import static android.app.time.LocationTimeZoneManager.SIMULATED_PROVIDER_TEST_COMMAND_PERM_FAILURE;
import static android.app.time.LocationTimeZoneManager.SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS;
import static android.app.time.LocationTimeZoneManager.SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS_ARG_KEY_TZ;
import static android.app.time.LocationTimeZoneManager.SIMULATED_PROVIDER_TEST_COMMAND_UNCERTAIN;
import static android.service.timezone.TimeZoneProviderService.TEST_COMMAND_RESULT_ERROR_KEY;
import static android.service.timezone.TimeZoneProviderService.TEST_COMMAND_RESULT_SUCCESS_KEY;

@@ -41,17 +47,6 @@ import java.util.Objects;
 */
class SimulatedLocationTimeZoneProviderProxy extends LocationTimeZoneProviderProxy {

    private static final String TEST_COMMAND_NAME_ON_BIND = "on_bind";
    private static final String TEST_COMMAND_NAME_ON_UNBIND = "on_unbind";
    private static final String TEST_COMMAND_NAME_PERM_FAIL = "perm_fail";
    private static final String TEST_COMMAND_NAME_UNCERTAIN = "uncertain";
    private static final String TEST_COMMAND_NAME_SUCCESS = "success";

    /**
     * Used for {@link #TEST_COMMAND_NAME_SUCCESS}.
     */
    private static final String KEY_TIME_ZONE = "tz";

    @GuardedBy("mSharedLock")
    @NonNull private TimeZoneProviderRequest mRequest;

@@ -82,21 +77,21 @@ class SimulatedLocationTimeZoneProviderProxy extends LocationTimeZoneProviderPro
        synchronized (mSharedLock) {
            Bundle resultBundle = new Bundle();
            switch (testCommand.getName()) {
                case TEST_COMMAND_NAME_ON_BIND: {
                case SIMULATED_PROVIDER_TEST_COMMAND_ON_BIND: {
                    mLastEvent.set("Simulating onProviderBound(), testCommand=" + testCommand);
                    mThreadingDomain.post(this::onBindOnHandlerThread);
                    resultBundle.putBoolean(TEST_COMMAND_RESULT_SUCCESS_KEY, true);
                    break;
                }
                case TEST_COMMAND_NAME_ON_UNBIND: {
                case SIMULATED_PROVIDER_TEST_COMMAND_ON_UNBIND: {
                    mLastEvent.set("Simulating onProviderUnbound(), testCommand=" + testCommand);
                    mThreadingDomain.post(this::onUnbindOnHandlerThread);
                    resultBundle.putBoolean(TEST_COMMAND_RESULT_SUCCESS_KEY, true);
                    break;
                }
                case TEST_COMMAND_NAME_PERM_FAIL:
                case TEST_COMMAND_NAME_UNCERTAIN:
                case TEST_COMMAND_NAME_SUCCESS: {
                case SIMULATED_PROVIDER_TEST_COMMAND_PERM_FAILURE:
                case SIMULATED_PROVIDER_TEST_COMMAND_UNCERTAIN:
                case SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS: {
                    if (!mRequest.sendUpdates()) {
                        String errorMsg = "testCommand=" + testCommand
                                + " is testing an invalid case:"
@@ -173,12 +168,13 @@ class SimulatedLocationTimeZoneProviderProxy extends LocationTimeZoneProviderPro
     * {@link #createTimeZoneProviderEventFromTestCommand(TestCommand)}.
     */
    static void printTestCommandShellHelp(@NonNull PrintWriter pw) {
        pw.printf("%s\n", TEST_COMMAND_NAME_ON_BIND);
        pw.printf("%s\n", TEST_COMMAND_NAME_ON_UNBIND);
        pw.printf("%s\n", TEST_COMMAND_NAME_PERM_FAIL);
        pw.printf("%s\n", TEST_COMMAND_NAME_UNCERTAIN);
        pw.printf("%s\n", SIMULATED_PROVIDER_TEST_COMMAND_ON_BIND);
        pw.printf("%s\n", SIMULATED_PROVIDER_TEST_COMMAND_ON_UNBIND);
        pw.printf("%s\n", SIMULATED_PROVIDER_TEST_COMMAND_PERM_FAILURE);
        pw.printf("%s\n", SIMULATED_PROVIDER_TEST_COMMAND_UNCERTAIN);
        pw.printf("%s %s=string_array:<time zone id>[&<time zone id>]+\n",
                TEST_COMMAND_NAME_SUCCESS, KEY_TIME_ZONE);
                SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS,
                SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS_ARG_KEY_TZ);
    }

    @NonNull
@@ -186,17 +182,19 @@ class SimulatedLocationTimeZoneProviderProxy extends LocationTimeZoneProviderPro
            @NonNull TestCommand testCommand) {
        String name = testCommand.getName();
        switch (name) {
            case TEST_COMMAND_NAME_PERM_FAIL: {
            case SIMULATED_PROVIDER_TEST_COMMAND_PERM_FAILURE: {
                return TimeZoneProviderEvent.createPermanentFailureEvent("Simulated failure");
            }
            case TEST_COMMAND_NAME_UNCERTAIN: {
            case SIMULATED_PROVIDER_TEST_COMMAND_UNCERTAIN: {
                return TimeZoneProviderEvent.createUncertainEvent();
            }
            case TEST_COMMAND_NAME_SUCCESS: {
            case SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS: {
                Bundle args = testCommand.getArgs();
                String[] timeZoneIds = args.getStringArray(KEY_TIME_ZONE);
                String[] timeZoneIds = args.getStringArray(
                        SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS_ARG_KEY_TZ);
                if (timeZoneIds == null) {
                    throw new IllegalArgumentException("No " + KEY_TIME_ZONE + " arg found");
                    throw new IllegalArgumentException("No "
                            + SIMULATED_PROVIDER_TEST_COMMAND_SUCCESS_ARG_KEY_TZ + " arg found");
                }
                TimeZoneProviderSuggestion suggestion = new TimeZoneProviderSuggestion.Builder()
                        .setTimeZoneIds(Arrays.asList(timeZoneIds))
Loading