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