PreferenceFrameLayout.java revision c57406cdfa1925c3474e87865c51950b76ee0347
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; 238b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereiraimport android.view.ViewGroup.MarginLayoutParams; 242266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereiraimport android.widget.FrameLayout; 258b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereiraimport android.widget.FrameLayout.LayoutParams; 262266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira 272266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira/** 282266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira * @hide 292266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira */ 302266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereirapublic class PreferenceFrameLayout extends FrameLayout { 318b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira private static final int DEFAULT_BORDER_TOP = 0; 328b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira private static final int DEFAULT_BORDER_BOTTOM = 0; 338b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira private static final int DEFAULT_BORDER_LEFT = 0; 348b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira private static final int DEFAULT_BORDER_RIGHT = 0; 358b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira private final int mBorderTop; 368b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira private final int mBorderBottom; 378b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira private final int mBorderLeft; 388b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira private final int mBorderRight; 392266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira private boolean mPaddingApplied = false; 402266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira 412266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira public PreferenceFrameLayout(Context context) { 422266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira this(context, null); 432266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira } 442266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira 452266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira public PreferenceFrameLayout(Context context, AttributeSet attrs) { 462266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira this(context, attrs, com.android.internal.R.attr.preferenceFrameLayoutStyle); 472266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira } 482266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira 492266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira public PreferenceFrameLayout(Context context, AttributeSet attrs, int defStyle) { 502266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira super(context, attrs, defStyle); 512266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira TypedArray a = context.obtainStyledAttributes(attrs, 522266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira com.android.internal.R.styleable.PreferenceFrameLayout, defStyle, 0); 532266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira 5435c8be065541fc818cc06567acd3c763b5f86056Mindy Pereira float density = context.getResources().getDisplayMetrics().density; 558b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int defaultBorderTop = (int) (density * DEFAULT_BORDER_TOP + 0.5f); 568b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int defaultBottomPadding = (int) (density * DEFAULT_BORDER_BOTTOM + 0.5f); 578b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int defaultLeftPadding = (int) (density * DEFAULT_BORDER_LEFT + 0.5f); 588b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int defaultRightPadding = (int) (density * DEFAULT_BORDER_RIGHT + 0.5f); 5935c8be065541fc818cc06567acd3c763b5f86056Mindy Pereira 608b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira mBorderTop = a.getDimensionPixelSize( 618b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira com.android.internal.R.styleable.PreferenceFrameLayout_borderTop, 628b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira defaultBorderTop); 638b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira mBorderBottom = a.getDimensionPixelSize( 648b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira com.android.internal.R.styleable.PreferenceFrameLayout_borderBottom, 658b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira defaultBottomPadding); 668b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira mBorderLeft = a.getDimensionPixelSize( 678b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira com.android.internal.R.styleable.PreferenceFrameLayout_borderLeft, 688b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira defaultLeftPadding); 698b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira mBorderRight = a.getDimensionPixelSize( 708b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira com.android.internal.R.styleable.PreferenceFrameLayout_borderRight, 718b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira defaultRightPadding); 7235c8be065541fc818cc06567acd3c763b5f86056Mindy Pereira 732266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira 742266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira a.recycle(); 752266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira } 762266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira 778b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira /** 788b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira * {@inheritDoc} 798b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira */ 808b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira @Override 818b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira public LayoutParams generateLayoutParams(AttributeSet attrs) { 828b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira return new LayoutParams(getContext(), attrs); 838b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira } 848b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira 852266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira @Override 862266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira public void addView(View child) { 878b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int borderTop = getPaddingTop(); 888b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int borderBottom = getPaddingBottom(); 898b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int borderLeft = getPaddingLeft(); 908b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int borderRight = getPaddingRight(); 918b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira 92c57406cdfa1925c3474e87865c51950b76ee0347Jim Miller android.view.ViewGroup.LayoutParams params = child.getLayoutParams(); 93c57406cdfa1925c3474e87865c51950b76ee0347Jim Miller LayoutParams layoutParams = params instanceof PreferenceFrameLayout.LayoutParams 94c57406cdfa1925c3474e87865c51950b76ee0347Jim Miller ? (PreferenceFrameLayout.LayoutParams) child.getLayoutParams() : null; 952266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira // Check on the id of the child before adding it. 968b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira if (layoutParams != null && layoutParams.removeBorders) { 972266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira if (mPaddingApplied) { 988b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira borderTop -= mBorderTop; 998b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira borderBottom -= mBorderBottom; 1008b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira borderLeft -= mBorderLeft; 1018b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira borderRight -= mBorderRight; 1022266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira mPaddingApplied = false; 1032266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira } 1048b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira } else { 1058b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira // Add the padding to the view group after determining if the 1068b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira // padding already exists. 1078b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira if (!mPaddingApplied) { 1088b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira borderTop += mBorderTop; 1098b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira borderBottom += mBorderBottom; 1108b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira borderLeft += mBorderLeft; 1118b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira borderRight += mBorderRight; 1128b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira mPaddingApplied = true; 1138b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira } 1142266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira } 1158b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira 1162266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira int previousTop = getPaddingTop(); 1172266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira int previousBottom = getPaddingBottom(); 1188b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int previousLeft = getPaddingLeft(); 1198b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira int previousRight = getPaddingRight(); 1208b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira if (previousTop != borderTop || previousBottom != borderBottom 1218b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira || previousLeft != borderLeft || previousRight != borderRight) { 1228b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira setPadding(borderLeft, borderTop, borderRight, borderBottom); 1232266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira } 1248b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira 1252266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira super.addView(child); 1262266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira } 1278b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira 1288b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira public static class LayoutParams extends FrameLayout.LayoutParams { 1298b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira public boolean removeBorders = false; 1308b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira /** 1318b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira * {@inheritDoc} 1328b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira */ 1338b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira public LayoutParams(Context c, AttributeSet attrs) { 1348b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira super(c, attrs); 1358b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira 1368b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira TypedArray a = c.obtainStyledAttributes(attrs, 1378b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira com.android.internal.R.styleable.PreferenceFrameLayout_Layout); 1388b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira removeBorders = a.getBoolean( 1398b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira com.android.internal.R.styleable.PreferenceFrameLayout_Layout_layout_removeBorders, 1408b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira false); 1418b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira a.recycle(); 1428b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira } 1438b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira 1448b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira /** 1458b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira * {@inheritDoc} 1468b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira */ 1478b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira public LayoutParams(int width, int height) { 1488b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira super(width, height); 1498b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira } 1508b2fb60cd49426c77869ddd91cbf4130d337a41cMindy Pereira } 1512266b92072b2eda16ef71ed6f3d8811159b756deMindy Pereira}