/*
 * Copyright (C) 2022 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.settingslib.media;

import android.annotation.DrawableRes;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.media.AudioDeviceInfo;
import android.media.MediaRoute2Info;

import com.android.settingslib.R;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/** A util class to get the appropriate icon for different device types. */
public class DeviceIconUtil {
    // A map from a @AudioDeviceInfo.AudioDeviceType to full device information.
    private final Map<Integer, Device> mAudioDeviceTypeToIconMap = new HashMap<>();
    // A map from a @MediaRoute2Info.Type to full device information.
    private final Map<Integer, Device> mMediaRouteTypeToIconMap = new HashMap<>();
    // A default icon to use if the type is not present in the map.
    @DrawableRes private static final int DEFAULT_ICON = R.drawable.ic_smartphone;

    public DeviceIconUtil() {
        List<Device> deviceList = Arrays.asList(
                new Device(
                    AudioDeviceInfo.TYPE_USB_DEVICE,
                    MediaRoute2Info.TYPE_USB_DEVICE,
                    R.drawable.ic_headphone),
                new Device(
                    AudioDeviceInfo.TYPE_USB_HEADSET,
                    MediaRoute2Info.TYPE_USB_HEADSET,
                    R.drawable.ic_headphone),
                new Device(
                    AudioDeviceInfo.TYPE_USB_ACCESSORY,
                    MediaRoute2Info.TYPE_USB_ACCESSORY,
                    R.drawable.ic_headphone),
                new Device(
                    AudioDeviceInfo.TYPE_DOCK,
                    MediaRoute2Info.TYPE_DOCK,
                    R.drawable.ic_dock_device),
                new Device(
                    AudioDeviceInfo.TYPE_HDMI,
                    MediaRoute2Info.TYPE_HDMI,
                    R.drawable.ic_headphone),
                new Device(
                    AudioDeviceInfo.TYPE_WIRED_HEADSET,
                    MediaRoute2Info.TYPE_WIRED_HEADSET,
                    R.drawable.ic_headphone),
                new Device(
                    AudioDeviceInfo.TYPE_WIRED_HEADPHONES,
                    MediaRoute2Info.TYPE_WIRED_HEADPHONES,
                    R.drawable.ic_headphone),
                new Device(
                    AudioDeviceInfo.TYPE_BUILTIN_SPEAKER,
                    MediaRoute2Info.TYPE_BUILTIN_SPEAKER,
                    R.drawable.ic_smartphone));
        for (int i = 0; i < deviceList.size(); i++) {
            Device device = deviceList.get(i);
            mAudioDeviceTypeToIconMap.put(device.mAudioDeviceType, device);
            mMediaRouteTypeToIconMap.put(device.mMediaRouteType, device);
        }
    }

    /** Returns a drawable for an icon representing the given audioDeviceType. */
    public Drawable getIconFromAudioDeviceType(
            @AudioDeviceInfo.AudioDeviceType int audioDeviceType, Context context) {
        return context.getDrawable(getIconResIdFromAudioDeviceType(audioDeviceType));
    }

    /** Returns a drawable res ID for an icon representing the given audioDeviceType. */
    @DrawableRes
    public int getIconResIdFromAudioDeviceType(
            @AudioDeviceInfo.AudioDeviceType int audioDeviceType) {
        if (mAudioDeviceTypeToIconMap.containsKey(audioDeviceType)) {
            return mAudioDeviceTypeToIconMap.get(audioDeviceType).mIconDrawableRes;
        }
        return DEFAULT_ICON;
    }

    /** Returns a drawable res ID for an icon representing the given mediaRouteType. */
    @DrawableRes
    public int getIconResIdFromMediaRouteType(
            @MediaRoute2Info.Type int mediaRouteType) {
        if (mMediaRouteTypeToIconMap.containsKey(mediaRouteType)) {
            return mMediaRouteTypeToIconMap.get(mediaRouteType).mIconDrawableRes;
        }
        return DEFAULT_ICON;
    }

    private static class Device {
        @AudioDeviceInfo.AudioDeviceType
        private final int mAudioDeviceType;

        @MediaRoute2Info.Type
        private final int mMediaRouteType;

        @DrawableRes
        private final int mIconDrawableRes;

        Device(@AudioDeviceInfo.AudioDeviceType int audioDeviceType,
                @MediaRoute2Info.Type int mediaRouteType,
                @DrawableRes int iconDrawableRes) {
            mAudioDeviceType = audioDeviceType;
            mMediaRouteType = mediaRouteType;
            mIconDrawableRes = iconDrawableRes;
        }
    }
}
