• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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