/*
 * Copyright (C) 2017 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.inputmethodservice.cts.common.test;

import java.util.Arrays;

/**
 * Utility class for preparing "adb shell" command.
 */
public final class ShellCommandUtils {

    // This is utility class, can't instantiate.
    private ShellCommandUtils() {}

    // Copied from android.content.pm.PackageManager#FEATURE_INPUT_METHODS.
    public static final String FEATURE_INPUT_METHODS = "android.software.input_methods";

    private static final String SETTING_DEFAULT_IME = "secure default_input_method";

    /** Command to get ID of current IME. */
    public static String getCurrentIme() {
        return "settings get " + SETTING_DEFAULT_IME;
    }

    /** Command to set current IME to {@code imeId} synchronously */
    public static String setCurrentImeSync(final String imeId) {
        return "ime set " + imeId;
    }

    public static String getEnabledImes() {
        return "ime list -s";
    }
    public static String getAvailableImes() {
        return "ime list -s -a";
    }

    public static String listPackage(String packageName) {
        return "pm list package " + packageName;
    }

    /** Command to enable IME of {@code imeId}. */
    public static String enableIme(final String imeId) {
        return "ime enable " + imeId;
    }

    /** Command to disable IME of {@code imeId}. */
    public static String disableIme(final String imeId) {
        return "ime disable " + imeId;
    }

    /** Command to reset currently selected/enabled IMEs to the default ones. */
    public static String resetImes() {
        return "ime reset";
    }

    /** Command to delete all records of IME event provider. */
    public static String deleteContent(final String contentUri) {
        return "content delete --uri " + contentUri;
    }

    public static String uninstallPackage(String packageName) {
        return "pm uninstall " + packageName;
    }

    /**
     * Command to send broadcast {@code Intent}.
     *
     * @param action action of intent.
     * @param targetComponent target of intent.
     * @param extras extra of intent, must be specified as triplet of option flag, key, and value.
     * @return shell command to send broadcast intent.
     */
    public static String broadcastIntent(final String action, final String targetComponent,
            final String... extras) {
        if (extras.length % 3 != 0) {
            throw new IllegalArgumentException(
                    "extras must be triplets: " + Arrays.toString(extras));
        }
        final StringBuilder sb = new StringBuilder("am broadcast -a ")
                .append(action);
        for (int index = 0; index < extras.length; index += 3) {
            final String optionFlag = extras[index];
            final String extraKey = extras[index + 1];
            final String extraValue = extras[index + 2];
            sb.append(" ").append(optionFlag)
                    .append(" ").append(extraKey)
                    .append(" ").append(extraValue);
        }
        return sb.append(" ").append(targetComponent).toString();
    }
}
