/* * Copyright (C) 2013 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 android.support.v4.view; import android.os.Build; import android.view.ViewGroup; /** * Helper for accessing API features in * {@link android.view.ViewGroup.MarginLayoutParams MarginLayoutParams} added after API 4. */ public class MarginLayoutParamsCompat { interface MarginLayoutParamsCompatImpl { int getMarginStart(ViewGroup.MarginLayoutParams lp); int getMarginEnd(ViewGroup.MarginLayoutParams lp); void setMarginStart(ViewGroup.MarginLayoutParams lp, int marginStart); void setMarginEnd(ViewGroup.MarginLayoutParams lp, int marginEnd); boolean isMarginRelative(ViewGroup.MarginLayoutParams lp); int getLayoutDirection(ViewGroup.MarginLayoutParams lp); void setLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection); void resolveLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection); } static class MarginLayoutParamsCompatImplBase implements MarginLayoutParamsCompatImpl { @Override public int getMarginStart(ViewGroup.MarginLayoutParams lp) { return lp.leftMargin; } @Override public int getMarginEnd(ViewGroup.MarginLayoutParams lp) { return lp.rightMargin; } @Override public void setMarginStart(ViewGroup.MarginLayoutParams lp, int marginStart) { lp.leftMargin = marginStart; } @Override public void setMarginEnd(ViewGroup.MarginLayoutParams lp, int marginEnd) { lp.rightMargin = marginEnd; } @Override public boolean isMarginRelative(ViewGroup.MarginLayoutParams lp) { return false; } @Override public int getLayoutDirection(ViewGroup.MarginLayoutParams lp) { return ViewCompat.LAYOUT_DIRECTION_LTR; } @Override public void setLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection) { // No-op } @Override public void resolveLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection) { // No-op } } static class MarginLayoutParamsCompatImplJbMr1 implements MarginLayoutParamsCompatImpl { @Override public int getMarginStart(ViewGroup.MarginLayoutParams lp) { return MarginLayoutParamsCompatJellybeanMr1.getMarginStart(lp); } @Override public int getMarginEnd(ViewGroup.MarginLayoutParams lp) { return MarginLayoutParamsCompatJellybeanMr1.getMarginEnd(lp); } @Override public void setMarginStart(ViewGroup.MarginLayoutParams lp, int marginStart) { MarginLayoutParamsCompatJellybeanMr1.setMarginStart(lp, marginStart); } @Override public void setMarginEnd(ViewGroup.MarginLayoutParams lp, int marginEnd) { MarginLayoutParamsCompatJellybeanMr1.setMarginEnd(lp, marginEnd); } @Override public boolean isMarginRelative(ViewGroup.MarginLayoutParams lp) { return MarginLayoutParamsCompatJellybeanMr1.isMarginRelative(lp); } @Override public int getLayoutDirection(ViewGroup.MarginLayoutParams lp) { return MarginLayoutParamsCompatJellybeanMr1.getLayoutDirection(lp); } @Override public void setLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection) { MarginLayoutParamsCompatJellybeanMr1.setLayoutDirection(lp, layoutDirection); } @Override public void resolveLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection) { MarginLayoutParamsCompatJellybeanMr1.resolveLayoutDirection(lp, layoutDirection); } } static final MarginLayoutParamsCompatImpl IMPL; static { final int version = Build.VERSION.SDK_INT; if (version >= 17) { // jb-mr1 IMPL = new MarginLayoutParamsCompatImplJbMr1(); } else { IMPL = new MarginLayoutParamsCompatImplBase(); } } /** * Get the relative starting margin that was set. * * <p>On platform versions supporting bidirectional text and layouts * this value will be resolved into the LayoutParams object's left or right * margin as appropriate when the associated View is attached to a window * or when the layout direction of that view changes.</p> * * @param lp LayoutParams to query * @return the margin along the starting edge in pixels */ public static int getMarginStart(ViewGroup.MarginLayoutParams lp) { return IMPL.getMarginStart(lp); } /** * Get the relative ending margin that was set. * * <p>On platform versions supporting bidirectional text and layouts * this value will be resolved into the LayoutParams object's left or right * margin as appropriate when the associated View is attached to a window * or when the layout direction of that view changes.</p> * * @param lp LayoutParams to query * @return the margin along the ending edge in pixels */ public static int getMarginEnd(ViewGroup.MarginLayoutParams lp) { return IMPL.getMarginEnd(lp); } /** * Set the relative start margin. * * <p>On platform versions supporting bidirectional text and layouts * this value will be resolved into the LayoutParams object's left or right * margin as appropriate when the associated View is attached to a window * or when the layout direction of that view changes.</p> * * @param lp LayoutParams to query * @param marginStart the desired start margin in pixels */ public static void setMarginStart(ViewGroup.MarginLayoutParams lp, int marginStart) { IMPL.setMarginStart(lp, marginStart); } /** * Set the relative end margin. * * <p>On platform versions supporting bidirectional text and layouts * this value will be resolved into the LayoutParams object's left or right * margin as appropriate when the associated View is attached to a window * or when the layout direction of that view changes.</p> * * @param lp LayoutParams to query * @param marginEnd the desired end margin in pixels */ public static void setMarginEnd(ViewGroup.MarginLayoutParams lp, int marginEnd) { IMPL.setMarginEnd(lp, marginEnd); } /** * Check if margins are relative. * * @return true if either marginStart or marginEnd has been set. */ public static boolean isMarginRelative(ViewGroup.MarginLayoutParams lp) { return IMPL.isMarginRelative(lp); } /** * Retuns the layout direction. Can be either {@link ViewCompat#LAYOUT_DIRECTION_LTR} or * {@link ViewCompat#LAYOUT_DIRECTION_RTL}. * * @return the layout direction. */ public static int getLayoutDirection(ViewGroup.MarginLayoutParams lp) { return IMPL.getLayoutDirection(lp); } /** * Set the layout direction. * * @param layoutDirection the layout direction. * Should be either {@link ViewCompat#LAYOUT_DIRECTION_LTR} * or {@link ViewCompat#LAYOUT_DIRECTION_RTL}. */ public static void setLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection) { IMPL.setLayoutDirection(lp, layoutDirection); } /** * This will be called by {@link android.view.View#requestLayout()}. Left and Right margins * may be overridden depending on layout direction. */ public static void resolveLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection) { IMPL.resolveLayoutDirection(lp, layoutDirection); } }