111417b1cfde8f1749905f2d735623af9214148afJeff Brown/*
211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Copyright (C) 2013 The Android Open Source Project
311417b1cfde8f1749905f2d735623af9214148afJeff Brown *
411417b1cfde8f1749905f2d735623af9214148afJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
511417b1cfde8f1749905f2d735623af9214148afJeff Brown * you may not use this file except in compliance with the License.
611417b1cfde8f1749905f2d735623af9214148afJeff Brown * You may obtain a copy of the License at
711417b1cfde8f1749905f2d735623af9214148afJeff Brown *
811417b1cfde8f1749905f2d735623af9214148afJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
911417b1cfde8f1749905f2d735623af9214148afJeff Brown *
1011417b1cfde8f1749905f2d735623af9214148afJeff Brown * Unless required by applicable law or agreed to in writing, software
1111417b1cfde8f1749905f2d735623af9214148afJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1211417b1cfde8f1749905f2d735623af9214148afJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1311417b1cfde8f1749905f2d735623af9214148afJeff Brown * See the License for the specific language governing permissions and
1411417b1cfde8f1749905f2d735623af9214148afJeff Brown * limitations under the License.
1511417b1cfde8f1749905f2d735623af9214148afJeff Brown */
1611417b1cfde8f1749905f2d735623af9214148afJeff Brown
1711417b1cfde8f1749905f2d735623af9214148afJeff Brownpackage android.support.v4.graphics.drawable;
1811417b1cfde8f1749905f2d735623af9214148afJeff Brown
1911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.graphics.drawable.Drawable;
2011417b1cfde8f1749905f2d735623af9214148afJeff Brown
2111417b1cfde8f1749905f2d735623af9214148afJeff Brown/**
2211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Helper for accessing features in {@link android.graphics.drawable.Drawable}
2311417b1cfde8f1749905f2d735623af9214148afJeff Brown * introduced after API level 4 in a backwards compatible fashion.
2411417b1cfde8f1749905f2d735623af9214148afJeff Brown */
2511417b1cfde8f1749905f2d735623af9214148afJeff Brownpublic class DrawableCompat {
2611417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
2711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Interface for the full API.
2811417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
2911417b1cfde8f1749905f2d735623af9214148afJeff Brown    interface DrawableImpl {
3011417b1cfde8f1749905f2d735623af9214148afJeff Brown        void jumpToCurrentState(Drawable drawable);
315df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        void setAutoMirrored(Drawable drawable, boolean mirrored);
325df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        boolean isAutoMirrored(Drawable drawable);
3311417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
3411417b1cfde8f1749905f2d735623af9214148afJeff Brown
3511417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
3611417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Interface implementation that doesn't use anything about v4 APIs.
3711417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
3811417b1cfde8f1749905f2d735623af9214148afJeff Brown    static class BaseDrawableImpl implements DrawableImpl {
3911417b1cfde8f1749905f2d735623af9214148afJeff Brown        @Override
4011417b1cfde8f1749905f2d735623af9214148afJeff Brown        public void jumpToCurrentState(Drawable drawable) {
4111417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
425df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette
435df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        @Override
445df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        public void setAutoMirrored(Drawable drawable, boolean mirrored) {
455df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        }
465df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette
475df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        @Override
485df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        public boolean isAutoMirrored(Drawable drawable) {
495df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette            return false;
505df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        }
5111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
5211417b1cfde8f1749905f2d735623af9214148afJeff Brown
5311417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
5411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Interface implementation for devices with at least v11 APIs.
5511417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
565df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    static class HoneycombDrawableImpl extends BaseDrawableImpl {
5711417b1cfde8f1749905f2d735623af9214148afJeff Brown        @Override
5811417b1cfde8f1749905f2d735623af9214148afJeff Brown        public void jumpToCurrentState(Drawable drawable) {
5911417b1cfde8f1749905f2d735623af9214148afJeff Brown            DrawableCompatHoneycomb.jumpToCurrentState(drawable);
6011417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
6111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
6211417b1cfde8f1749905f2d735623af9214148afJeff Brown
6311417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
645df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * Interface implementation for devices with at least v11 APIs.
655df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     */
665df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    static class KitKatDrawableImpl extends HoneycombDrawableImpl {
675df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        @Override
685df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        public void setAutoMirrored(Drawable drawable, boolean mirrored) {
695df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette            DrawableCompatKitKat.setAutoMirrored(drawable, mirrored);
705df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        }
715df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette
725df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        @Override
735df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        public boolean isAutoMirrored(Drawable drawable) {
745df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette            return DrawableCompatKitKat.isAutoMirrored(drawable);
755df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        }
765df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    }
775df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette
785df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    /**
7911417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Select the correct implementation to use for the current platform.
8011417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
8111417b1cfde8f1749905f2d735623af9214148afJeff Brown    static final DrawableImpl IMPL;
8211417b1cfde8f1749905f2d735623af9214148afJeff Brown    static {
8311417b1cfde8f1749905f2d735623af9214148afJeff Brown        final int version = android.os.Build.VERSION.SDK_INT;
845df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        if (version >= 19) {
855df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette            IMPL = new KitKatDrawableImpl();
865df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        } else if (version >= 11) {
8711417b1cfde8f1749905f2d735623af9214148afJeff Brown            IMPL = new HoneycombDrawableImpl();
8811417b1cfde8f1749905f2d735623af9214148afJeff Brown        } else {
8911417b1cfde8f1749905f2d735623af9214148afJeff Brown            IMPL = new BaseDrawableImpl();
9011417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
9111417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
9211417b1cfde8f1749905f2d735623af9214148afJeff Brown
9311417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
9411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Call {@link Drawable#jumpToCurrentState() Drawable.jumpToCurrentState()}.
955df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * <p>
965df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * If running on a pre-{@link android.os.Build.VERSION_CODES#HONEYCOMB}
975df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * device this method does nothing.
985df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     *
995df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * @param drawable The Drawable against which to invoke the method.
10011417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
10111417b1cfde8f1749905f2d735623af9214148afJeff Brown    public static void jumpToCurrentState(Drawable drawable) {
10211417b1cfde8f1749905f2d735623af9214148afJeff Brown        IMPL.jumpToCurrentState(drawable);
10311417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
1045df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette
1055df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    /**
1065df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * Set whether this Drawable is automatically mirrored when its layout
1075df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * direction is RTL (right-to left). See
1085df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * {@link android.util.LayoutDirection}.
1095df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * <p>
1105df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * If running on a pre-{@link android.os.Build.VERSION_CODES#KITKAT} device
1115df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * this method does nothing.
1125df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     *
1135df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * @param drawable The Drawable against which to invoke the method.
1145df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * @param mirrored Set to true if the Drawable should be mirrored, false if
1155df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     *            not.
1165df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     */
1175df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    public static void setAutoMirrored(Drawable drawable, boolean mirrored) {
1185df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        IMPL.setAutoMirrored(drawable, mirrored);
1195df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    }
1205df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette
1215df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    /**
1225df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * Tells if this Drawable will be automatically mirrored when its layout
1235df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * direction is RTL right-to-left. See {@link android.util.LayoutDirection}.
1245df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * <p>
1255df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * If running on a pre-{@link android.os.Build.VERSION_CODES#KITKAT} device
1265df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * this method returns false.
1275df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     *
1285df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * @param drawable The Drawable against which to invoke the method.
1295df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     * @return boolean Returns true if this Drawable will be automatically
1305df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     *         mirrored.
1315df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette     */
1325df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    public static boolean isAutoMirrored(Drawable drawable) {
1335df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette        return IMPL.isAutoMirrored(drawable);
1345df122f8bb619edcdbef94cd455efef0e6e44377Alan Viverette    }
13511417b1cfde8f1749905f2d735623af9214148afJeff Brown}
136