/*
 * Copyright (C) 2015 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.setupwizardlib.util;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable;
import android.os.Build;
import android.view.View;

/**
 * Provides convenience methods to handle drawable layout directions in different SDK versions.
 */
public class DrawableLayoutDirectionHelper {

    /**
     * Creates an {@link android.graphics.drawable.InsetDrawable} according to the layout direction
     * of {@code view}.
     */
    @SuppressLint("InlinedApi")  // Use of View.LAYOUT_DIRECTION_RTL is guarded by version check
    public static InsetDrawable createRelativeInsetDrawable(Drawable drawable,
            int insetStart, int insetTop, int insetEnd, int insetBottom, View view) {
        boolean isRtl = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
                && view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
        return createRelativeInsetDrawable(drawable, insetStart, insetTop, insetEnd, insetBottom,
                isRtl);
    }

    /**
     * Creates an {@link android.graphics.drawable.InsetDrawable} according to the layout direction
     * of {@code context}.
     */
    @SuppressLint("InlinedApi")  // Use of View.LAYOUT_DIRECTION_RTL is guarded by version check
    public static InsetDrawable createRelativeInsetDrawable(Drawable drawable,
            int insetStart, int insetTop, int insetEnd, int insetBottom, Context context) {
        boolean isRtl = false;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            final int layoutDirection =
                    context.getResources().getConfiguration().getLayoutDirection();
            isRtl = layoutDirection == View.LAYOUT_DIRECTION_RTL;
        }
        return createRelativeInsetDrawable(drawable, insetStart, insetTop, insetEnd, insetBottom,
                isRtl);
    }

    /**
     * Creates an {@link android.graphics.drawable.InsetDrawable} according to
     * {@code layoutDirection}.
     */
    @SuppressLint("InlinedApi")  // Given layoutDirection will not be View.LAYOUT_DIRECTION_RTL if
                                 // SDK version doesn't support it.
    public static InsetDrawable createRelativeInsetDrawable(Drawable drawable,
            int insetStart, int insetTop, int insetEnd, int insetBottom, int layoutDirection) {
        return createRelativeInsetDrawable(drawable, insetStart, insetTop, insetEnd, insetBottom,
                layoutDirection == View.LAYOUT_DIRECTION_RTL);
    }

    private static InsetDrawable createRelativeInsetDrawable(Drawable drawable,
            int insetStart, int insetTop, int insetEnd, int insetBottom, boolean isRtl) {
        if (isRtl) {
            return new InsetDrawable(drawable, insetEnd, insetTop, insetStart, insetBottom);
        } else {
            return new InsetDrawable(drawable, insetStart, insetTop, insetEnd, insetBottom);
        }
    }
}
