12266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira/*
22266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * Copyright (C) 2010 The Android Open Source Project
32266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira *
42266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * Licensed under the Apache License, Version 2.0 (the "License");
52266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * you may not use this file except in compliance with the License.
62266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * You may obtain a copy of the License at
72266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira *
82266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira *      http://www.apache.org/licenses/LICENSE-2.0
92266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira *
102266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * Unless required by applicable law or agreed to in writing, software
112266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
122266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * See the License for the specific language governing permissions and
142266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * limitations under the License.
152266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira */
162266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira
172266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereirapackage android.preference;
182266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira
192266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereiraimport android.content.Context;
202266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereiraimport android.content.res.TypedArray;
212266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereiraimport android.util.AttributeSet;
222266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereiraimport android.view.View;
232266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereiraimport android.widget.FrameLayout;
242266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira
252266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira/**
262266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * @hide
272266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira */
282266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereirapublic class PreferenceFrameLayout extends FrameLayout {
298b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    private static final int DEFAULT_BORDER_TOP = 0;
308b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    private static final int DEFAULT_BORDER_BOTTOM = 0;
318b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    private static final int DEFAULT_BORDER_LEFT = 0;
328b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    private static final int DEFAULT_BORDER_RIGHT = 0;
338b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    private final int mBorderTop;
348b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    private final int mBorderBottom;
358b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    private final int mBorderLeft;
368b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    private final int mBorderRight;
373c9f519f898f8fc809550199ea823c0225c682a8Amith Yamasani    private boolean mPaddingApplied;
382266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira
392266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira    public PreferenceFrameLayout(Context context) {
402266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira        this(context, null);
412266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira    }
422266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira
432266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira    public PreferenceFrameLayout(Context context, AttributeSet attrs) {
442266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira        this(context, attrs, com.android.internal.R.attr.preferenceFrameLayoutStyle);
452266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira    }
462266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira
47617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public PreferenceFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
48617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        this(context, attrs, defStyleAttr, 0);
49617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    }
50617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
51617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public PreferenceFrameLayout(
52617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
53617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        super(context, attrs, defStyleAttr, defStyleRes);
54617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        final TypedArray a = context.obtainStyledAttributes(attrs,
55617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette                com.android.internal.R.styleable.PreferenceFrameLayout, defStyleAttr, defStyleRes);
562266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira
5735c8be065541fc818cc06567acd3c763b5f86056Mindy Pereira        float density = context.getResources().getDisplayMetrics().density;
588b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int defaultBorderTop = (int) (density * DEFAULT_BORDER_TOP + 0.5f);
598b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int defaultBottomPadding = (int) (density * DEFAULT_BORDER_BOTTOM + 0.5f);
608b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int defaultLeftPadding = (int) (density * DEFAULT_BORDER_LEFT + 0.5f);
618b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int defaultRightPadding = (int) (density * DEFAULT_BORDER_RIGHT + 0.5f);
6235c8be065541fc818cc06567acd3c763b5f86056Mindy Pereira
638b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        mBorderTop = a.getDimensionPixelSize(
648b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                com.android.internal.R.styleable.PreferenceFrameLayout_borderTop,
658b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                defaultBorderTop);
668b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        mBorderBottom = a.getDimensionPixelSize(
678b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                com.android.internal.R.styleable.PreferenceFrameLayout_borderBottom,
688b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                defaultBottomPadding);
698b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        mBorderLeft = a.getDimensionPixelSize(
708b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                com.android.internal.R.styleable.PreferenceFrameLayout_borderLeft,
718b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                defaultLeftPadding);
728b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        mBorderRight = a.getDimensionPixelSize(
738b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                com.android.internal.R.styleable.PreferenceFrameLayout_borderRight,
748b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                defaultRightPadding);
7535c8be065541fc818cc06567acd3c763b5f86056Mindy Pereira
762266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira        a.recycle();
772266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira    }
782266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira
798b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    /**
808b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira     * {@inheritDoc}
818b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira     */
828b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    @Override
838b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    public LayoutParams generateLayoutParams(AttributeSet attrs) {
848b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        return new LayoutParams(getContext(), attrs);
858b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    }
868b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira
872266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira    @Override
882266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira    public void addView(View child) {
898b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int borderTop = getPaddingTop();
908b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int borderBottom = getPaddingBottom();
918b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int borderLeft = getPaddingLeft();
928b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int borderRight = getPaddingRight();
938b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira
94c57406cdfa1925c3474e87865c51950b76ee0347Jim Miller        android.view.ViewGroup.LayoutParams params = child.getLayoutParams();
95c57406cdfa1925c3474e87865c51950b76ee0347Jim Miller        LayoutParams layoutParams = params instanceof PreferenceFrameLayout.LayoutParams
96c57406cdfa1925c3474e87865c51950b76ee0347Jim Miller            ? (PreferenceFrameLayout.LayoutParams) child.getLayoutParams() : null;
972266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira        // Check on the id of the child before adding it.
988b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        if (layoutParams != null && layoutParams.removeBorders) {
992266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira            if (mPaddingApplied) {
1008b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                borderTop -= mBorderTop;
1018b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                borderBottom -= mBorderBottom;
1028b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                borderLeft -= mBorderLeft;
1038b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                borderRight -= mBorderRight;
1042266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira                mPaddingApplied = false;
1052266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira            }
1068b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        } else {
1078b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            // Add the padding to the view group after determining if the
1088b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            // padding already exists.
1098b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            if (!mPaddingApplied) {
1108b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                borderTop += mBorderTop;
1118b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                borderBottom += mBorderBottom;
1128b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                borderLeft += mBorderLeft;
1138b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                borderRight += mBorderRight;
1148b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                mPaddingApplied = true;
1158b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            }
1162266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira        }
1178b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira
1182266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira        int previousTop = getPaddingTop();
1192266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira        int previousBottom = getPaddingBottom();
1208b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int previousLeft = getPaddingLeft();
1218b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        int previousRight = getPaddingRight();
1228b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        if (previousTop != borderTop || previousBottom != borderBottom
1238b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                || previousLeft != borderLeft || previousRight != borderRight) {
1248b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            setPadding(borderLeft, borderTop, borderRight, borderBottom);
1252266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira        }
1268b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira
1272266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira        super.addView(child);
1282266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira    }
1298b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira
1308b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    public static class LayoutParams extends FrameLayout.LayoutParams {
1318b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        public boolean removeBorders = false;
1328b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        /**
1338b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira         * {@inheritDoc}
1348b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira         */
1358b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        public LayoutParams(Context c, AttributeSet attrs) {
1368b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            super(c, attrs);
1378b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira
1388b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            TypedArray a = c.obtainStyledAttributes(attrs,
1398b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                    com.android.internal.R.styleable.PreferenceFrameLayout_Layout);
1408b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            removeBorders = a.getBoolean(
1418b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                    com.android.internal.R.styleable.PreferenceFrameLayout_Layout_layout_removeBorders,
1428b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira                    false);
1438b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            a.recycle();
1448b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        }
1458b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira
1468b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        /**
1478b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira         * {@inheritDoc}
1488b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira         */
1498b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        public LayoutParams(int width, int height) {
1508b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira            super(width, height);
1518b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira        }
1528b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira    }
1532266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira}