• 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 android.view.ViewGroup;
25 import androidx.annotation.Nullable;
26 import com.google.android.setupcompat.partnerconfig.PartnerConfig;
27 import com.google.android.setupcompat.partnerconfig.PartnerConfigHelper;
28 import com.google.android.setupdesign.R;
29 
30 /**
31  * Applies the partner style of layout to the given View {@code view}. The user needs to check if
32  * the {@code view} should apply partner heavy theme before calling this method.
33  */
34 public final class LayoutStyler {
35 
36   /**
37    * Applies the partner layout padding style to the given view {@code view}. The theme should set
38    * partner heavy theme config first, and then the partner layout style would be applied.
39    *
40    * @param view A view would be applied partner layout padding style
41    */
42   @TargetApi(VERSION_CODES.JELLY_BEAN_MR1)
applyPartnerCustomizationLayoutPaddingStyle(@ullable View view)43   public static void applyPartnerCustomizationLayoutPaddingStyle(@Nullable View view) {
44     if (view == null) {
45       return;
46     }
47 
48     Context context = view.getContext();
49     boolean partnerMarginStartAvailable =
50         PartnerConfigHelper.get(context)
51             .isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_START);
52     boolean partnerMarginEndAvailable =
53         PartnerConfigHelper.get(context)
54             .isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_END);
55 
56     // TODO: After all users added the check before calling the API, this check can be
57     // deleted.
58     if (PartnerStyleHelper.shouldApplyPartnerResource(view)
59         && (partnerMarginStartAvailable || partnerMarginEndAvailable)) {
60       int paddingStart;
61       int paddingEnd;
62       if (partnerMarginStartAvailable) {
63         paddingStart =
64             (int)
65                 PartnerConfigHelper.get(context)
66                     .getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_START);
67       } else {
68         paddingStart = view.getPaddingStart();
69       }
70       if (partnerMarginEndAvailable) {
71         paddingEnd =
72             (int)
73                 PartnerConfigHelper.get(context)
74                     .getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_END);
75       } else {
76         paddingEnd = view.getPaddingEnd();
77       }
78 
79       if (paddingStart != view.getPaddingStart() || paddingEnd != view.getPaddingEnd()) {
80         view.setPadding(paddingStart, view.getPaddingTop(), paddingEnd, view.getPaddingBottom());
81       }
82     }
83   }
84 
85   /**
86    * Applies the extra padding style to the given view {@code view}. This method is used when {@code
87    * view} already sets its margin, and like to extra padding make view.margin + view.pendding =
88    * global page margin.
89    *
90    * @param view A view would be applied extra padding style based on the layout margin of partner
91    *     config.
92    */
93   @TargetApi(VERSION_CODES.JELLY_BEAN_MR1)
applyPartnerCustomizationExtraPaddingStyle(@ullable View view)94   public static void applyPartnerCustomizationExtraPaddingStyle(@Nullable View view) {
95     if (view == null) {
96       return;
97     }
98 
99     Context context = view.getContext();
100     boolean partnerMarginStartAvailable =
101         PartnerConfigHelper.get(context)
102             .isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_START);
103     boolean partnerMarginEndAvailable =
104         PartnerConfigHelper.get(context)
105             .isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_END);
106 
107     // TODO: After all users added the check before calling the API, this check can be
108     // deleted.
109     if (PartnerStyleHelper.shouldApplyPartnerResource(view)
110         && (partnerMarginStartAvailable || partnerMarginEndAvailable)) {
111       int extraPaddingStart;
112       int extraPaddingEnd;
113 
114       TypedArray a =
115           context.obtainStyledAttributes(new int[] {R.attr.sudMarginStart, R.attr.sudMarginEnd});
116       int layoutMarginStart = a.getDimensionPixelSize(0, 0);
117       int layoutMarginEnd = a.getDimensionPixelSize(1, 0);
118       a.recycle();
119 
120       if (partnerMarginStartAvailable) {
121         extraPaddingStart =
122             ((int)
123                     PartnerConfigHelper.get(context)
124                         .getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_START))
125                 - layoutMarginStart;
126       } else {
127         extraPaddingStart = view.getPaddingStart();
128       }
129 
130       if (partnerMarginEndAvailable) {
131         extraPaddingEnd =
132             ((int)
133                     PartnerConfigHelper.get(context)
134                         .getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_END))
135                 - layoutMarginEnd;
136         // If the view is a content view, padding start and padding end will be the same.
137         if (view.getId() == R.id.sud_layout_content) {
138           extraPaddingEnd =
139               ((int)
140                       PartnerConfigHelper.get(context)
141                           .getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_START))
142                   - layoutMarginEnd;
143         }
144       } else {
145         extraPaddingEnd = view.getPaddingEnd();
146         // If the view is a content view, padding start and padding end will be the same.
147         if (view.getId() == R.id.sud_layout_content) {
148           extraPaddingEnd = view.getPaddingStart();
149         }
150       }
151 
152       if (extraPaddingStart != view.getPaddingStart() || extraPaddingEnd != view.getPaddingEnd()) {
153         if (view.getId() == R.id.sud_layout_content) {
154           // The sud_layout_content is framelayout.
155           // The framelayout background maybe infected by this change.
156           // Currently the content background is same as the activity background, and there is no
157           // partner config to customize it.
158           ViewGroup.LayoutParams params = view.getLayoutParams();
159           ViewGroup.MarginLayoutParams marginLayoutParams;
160           if (params instanceof ViewGroup.MarginLayoutParams) {
161             marginLayoutParams = (ViewGroup.MarginLayoutParams) params;
162           } else {
163             marginLayoutParams = new ViewGroup.MarginLayoutParams(params);
164           }
165           marginLayoutParams.setMargins(
166               extraPaddingStart, view.getPaddingTop(), extraPaddingEnd, view.getPaddingBottom());
167         } else {
168           view.setPadding(
169               extraPaddingStart, view.getPaddingTop(), extraPaddingEnd, view.getPaddingBottom());
170         }
171       }
172     }
173   }
174 
LayoutStyler()175   private LayoutStyler() {}
176 }
177