1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.android.setupdesign.util; 18 19 import android.annotation.TargetApi; 20 import android.content.Context; 21 import android.content.res.TypedArray; 22 import android.os.Build.VERSION_CODES; 23 import android.view.View; 24 import androidx.annotation.Nullable; 25 import com.google.android.setupcompat.partnerconfig.PartnerConfig; 26 import com.google.android.setupcompat.partnerconfig.PartnerConfigHelper; 27 import com.google.android.setupdesign.R; 28 29 /** 30 * Applies the partner style of layout to the given View {@code view}. The user needs to check if 31 * the {@code view} should apply partner heavy theme before calling this method. 32 */ 33 public final class LayoutStyler { 34 35 /** 36 * Applies the partner layout padding style to the given view {@code view}. The theme should set 37 * partner heavy theme config first, and then the partner layout style would be applied. 38 * 39 * @param view A view would be applied partner layout padding style 40 */ 41 @TargetApi(VERSION_CODES.JELLY_BEAN_MR1) applyPartnerCustomizationLayoutPaddingStyle(@ullable View view)42 public static void applyPartnerCustomizationLayoutPaddingStyle(@Nullable View view) { 43 if (view == null) { 44 return; 45 } 46 47 Context context = view.getContext(); 48 boolean partnerMarginStartAvailable = 49 PartnerConfigHelper.get(context) 50 .isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_START); 51 boolean partnerMarginEndAvailable = 52 PartnerConfigHelper.get(context) 53 .isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_END); 54 55 if (PartnerStyleHelper.shouldApplyPartnerHeavyThemeResource(view) 56 && (partnerMarginStartAvailable || partnerMarginEndAvailable)) { 57 int paddingStart; 58 int paddingEnd; 59 if (partnerMarginStartAvailable) { 60 paddingStart = 61 (int) 62 PartnerConfigHelper.get(context) 63 .getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_START); 64 } else { 65 paddingStart = view.getPaddingStart(); 66 } 67 if (partnerMarginEndAvailable) { 68 paddingEnd = 69 (int) 70 PartnerConfigHelper.get(context) 71 .getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_END); 72 } else { 73 paddingEnd = view.getPaddingEnd(); 74 } 75 76 if (paddingStart != view.getPaddingStart() || paddingEnd != view.getPaddingEnd()) { 77 view.setPadding(paddingStart, view.getPaddingTop(), paddingEnd, view.getPaddingBottom()); 78 } 79 } 80 } 81 82 /** 83 * Applies the extra padding style to the given view {@code view}. This method is used when {@code 84 * view} already sets its margin, and like to extra padding make view.margin + view.pendding = 85 * global page margin. 86 * 87 * @param view A view would be applied extra padding style based on the layout margin of partner 88 * config. 89 */ 90 @TargetApi(VERSION_CODES.JELLY_BEAN_MR1) applyPartnerCustomizationExtraPaddingStyle(@ullable View view)91 public static void applyPartnerCustomizationExtraPaddingStyle(@Nullable View view) { 92 if (view == null) { 93 return; 94 } 95 96 Context context = view.getContext(); 97 boolean partnerMarginStartAvailable = 98 PartnerConfigHelper.get(context) 99 .isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_START); 100 boolean partnerMarginEndAvailable = 101 PartnerConfigHelper.get(context) 102 .isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_END); 103 104 if (PartnerStyleHelper.shouldApplyPartnerHeavyThemeResource(view) 105 && (partnerMarginStartAvailable || partnerMarginEndAvailable)) { 106 int extraPaddingStart; 107 int extraPaddingEnd; 108 109 TypedArray a = 110 context.obtainStyledAttributes(new int[] {R.attr.sudMarginStart, R.attr.sudMarginEnd}); 111 int layoutMarginStart = a.getDimensionPixelSize(0, 0); 112 int layoutMarginEnd = a.getDimensionPixelSize(1, 0); 113 a.recycle(); 114 115 if (partnerMarginStartAvailable) { 116 extraPaddingStart = 117 ((int) 118 PartnerConfigHelper.get(context) 119 .getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_START)) 120 - layoutMarginStart; 121 } else { 122 extraPaddingStart = view.getPaddingStart(); 123 } 124 125 if (partnerMarginEndAvailable) { 126 extraPaddingEnd = 127 ((int) 128 PartnerConfigHelper.get(context) 129 .getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_END)) 130 - layoutMarginEnd; 131 } else { 132 extraPaddingEnd = view.getPaddingEnd(); 133 } 134 135 if (extraPaddingStart != view.getPaddingStart() || extraPaddingEnd != view.getPaddingEnd()) { 136 // If the view is a content view, padding start and padding end will be the same. 137 view.setPadding( 138 extraPaddingStart, 139 view.getPaddingTop(), 140 view.getId() == R.id.sud_layout_content ? extraPaddingStart : extraPaddingEnd, 141 view.getPaddingBottom()); 142 } 143 } 144 } 145 LayoutStyler()146 private LayoutStyler() {} 147 } 148