package com.android.wallpaper.asset;

import android.os.Build;

import androidx.exifinterface.media.ExifInterface;

import java.io.IOException;
import java.io.InputStream;

/**
 * Provides access to basic ExifInterface APIs using {@link android.media.ExifInterface} in OMR1+
 * SDK or SupportLibrary's {@link ExifInterface} for earlier SDK versions.
 */
class ExifInterfaceCompat {

    public static final String TAG_ORIENTATION = ExifInterface.TAG_ORIENTATION;
    public static final int EXIF_ORIENTATION_NORMAL = 1;
    public static final int EXIF_ORIENTATION_UNKNOWN = -1;

    private ExifInterface mSupportExifInterface;
    private android.media.ExifInterface mFrameworkExifInterface;

    /**
     * Reads Exif tags from the specified image input stream. It's the caller's responsibility to
     * close the given InputStream after use.
     * @see ExifInterface#ExifInterface(InputStream)
     * @see android.media.ExifInterface#ExifInterface(InputStream)
     */
    public ExifInterfaceCompat(InputStream inputStream) throws IOException {
        // O-MR1 added support for more formats (HEIF), which Support Library cannot implement,
        // so use the framework version for SDK 27+
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
            mFrameworkExifInterface = new android.media.ExifInterface(inputStream);
        } else {
            mSupportExifInterface = new ExifInterface(inputStream);
        }
    }

    public int getAttributeInt(String tag, int defaultValue) {
        return mFrameworkExifInterface != null
                ? mFrameworkExifInterface.getAttributeInt(tag, defaultValue)
                : mSupportExifInterface.getAttributeInt(tag, defaultValue);
    }

    public String getAttribute(String tag) {
        return mFrameworkExifInterface != null
                ? mFrameworkExifInterface.getAttribute(tag)
                : mSupportExifInterface.getAttribute(tag);
    }
}
