/*
 * Copyright (C) 2023 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.platform.helpers;

/**
 * Helper class for functional tests that use the Bluetooth settings page (and device-specific
 * connection pages reached from the Bluetooth settings page)
 */
public interface IAutoBluetoothSettingsHelper extends IAppHelper, Scrollable {

    /**
     * Setup Expectations: The bluetooth settings view is open, and at least one device is listed
     * under "Paired devices"
     *
     * @return - Whether the audio preference button is currently checked
     */
    boolean isMediaPreferenceChecked();

    /**
     * Setup Expectations: The bluetooth settings view is open, and at least one device is listed
     * under "Paired devices"
     *
     * @return - Whether the bluetooth preference button is currently checked
     */
    boolean isBluetoothPreferenceChecked();

    /**
     * Setup Expectations: The bluetooth settings view is open, and at least one device is listed
     * under "Paired devices"
     *
     * @return - Whether the phone preference button is currently checked
     */
    boolean isPhonePreferenceChecked();

    /**
     * Setup Expectations: The bluetooth settings view is open, and at least one device is listed
     * under "Paired devices"
     *
     * @return - Whether the audio preference button is currently checked
     */
    boolean isMediaPreferenceEnabled();

    /**
     * Setup Expectations: The bluetooth settings view is open, and at least one device is listed
     * under "Paired devices"
     *
     * @return - Whether the phone preference button is currently checked
     */
    boolean isPhonePreferenceEnabled();

    /**
     * Setup Expectations: The bluetooth settings view is open, and the looked-for device is present
     * under "paired devices"
     *
     * @param deviceName - The name of the connected device to disconnect
     */
    void pressBluetoothToggleOnDevice(String deviceName);

    /**
     * Opens the device bluetooth view by clicking the device name.
     *
     * <p>Setup Expectations: The bluetooth settings view is open. and the looked-for device is
     * present under "paired devices"
     *
     * @param deviceName - The name of the connected device to disconnect
     */
    void pressDevice(String deviceName);

    /**
     * Setup Expectations: A connected device bluetooth view is open ('level two')
     *
     * @return - The exact text displayed as the device's connection status
     */
    String getDeviceSummary();

    /**
     * Setup Expectations: A connected device bluetooth view is open ('level two')
     *
     * @return - Whether the device shows that it is connected.
     */
    boolean isConnected();

    /**
     * Presses the 'forget' button.
     *
     * <p>Setup Expectations: A connected device bluetooth view is open ('level two') and the
     * 'Forget' button is visible.
     */
    void pressForget();

    /**
     * Presses the 'Connect' or 'Disconnect' toggle button
     *
     * <p>Setup Expectations: A connected device bluetooth view is open ('level two')
     */
    void pressConnectionToggle();

    /**
     * Presses the back button to return from a device's connection page to the Bluetooth settings
     * page
     *
     * <p>Setup Expectations: A connected device bluetooth view is open ('level two')
     */
    void goBackToBluetoothSettings();
}
