blob: b70752139ab13f82b978d465118c228e27d55229 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.setupdesign.util;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build.VERSION_CODES;
import android.view.View;
import androidx.annotation.Nullable;
import com.google.android.setupcompat.partnerconfig.PartnerConfig;
import com.google.android.setupcompat.partnerconfig.PartnerConfigHelper;
import com.google.android.setupdesign.R;
/**
* Applies the partner style of layout to the given View {@code view}. The user needs to check if
* the {@code view} should apply partner heavy theme before calling this method.
*/
public final class LayoutStyler {
/**
* Applies the partner layout padding style to the given view {@code view}. The theme should set
* partner heavy theme config first, and then the partner layout style would be applied.
*
* @param view A view would be applied partner layout padding style
*/
@TargetApi(VERSION_CODES.JELLY_BEAN_MR1)
public static void applyPartnerCustomizationLayoutPaddingStyle(@Nullable View view) {
if (view == null) {
return;
}
Context context = view.getContext();
boolean partnerMarginStartAvailable =
PartnerConfigHelper.get(context)
.isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_START);
boolean partnerMarginEndAvailable =
PartnerConfigHelper.get(context)
.isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_END);
if (PartnerStyleHelper.shouldApplyPartnerHeavyThemeResource(view)
&& (partnerMarginStartAvailable || partnerMarginEndAvailable)) {
int paddingStart;
int paddingEnd;
if (partnerMarginStartAvailable) {
paddingStart =
(int)
PartnerConfigHelper.get(context)
.getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_START);
} else {
paddingStart = view.getPaddingStart();
}
if (partnerMarginEndAvailable) {
paddingEnd =
(int)
PartnerConfigHelper.get(context)
.getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_END);
} else {
paddingEnd = view.getPaddingEnd();
}
if (paddingStart != view.getPaddingStart() || paddingEnd != view.getPaddingEnd()) {
view.setPadding(paddingStart, view.getPaddingTop(), paddingEnd, view.getPaddingBottom());
}
}
}
/**
* Applies the extra padding style to the given view {@code view}. This method is used when {@code
* view} already sets its margin, and like to extra padding make view.margin + view.pendding =
* global page margin.
*
* @param view A view would be applied extra padding style based on the layout margin of partner
* config.
*/
@TargetApi(VERSION_CODES.JELLY_BEAN_MR1)
public static void applyPartnerCustomizationExtraPaddingStyle(@Nullable View view) {
if (view == null) {
return;
}
Context context = view.getContext();
boolean partnerMarginStartAvailable =
PartnerConfigHelper.get(context)
.isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_START);
boolean partnerMarginEndAvailable =
PartnerConfigHelper.get(context)
.isPartnerConfigAvailable(PartnerConfig.CONFIG_LAYOUT_MARGIN_END);
if (PartnerStyleHelper.shouldApplyPartnerHeavyThemeResource(view)
&& (partnerMarginStartAvailable || partnerMarginEndAvailable)) {
int extraPaddingStart;
int extraPaddingEnd;
TypedArray a =
context.obtainStyledAttributes(new int[] {R.attr.sudMarginStart, R.attr.sudMarginEnd});
int layoutMarginStart = a.getDimensionPixelSize(0, 0);
int layoutMarginEnd = a.getDimensionPixelSize(1, 0);
a.recycle();
if (partnerMarginStartAvailable) {
extraPaddingStart =
((int)
PartnerConfigHelper.get(context)
.getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_START))
- layoutMarginStart;
} else {
extraPaddingStart = view.getPaddingStart();
}
if (partnerMarginEndAvailable) {
extraPaddingEnd =
((int)
PartnerConfigHelper.get(context)
.getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_END))
- layoutMarginEnd;
} else {
extraPaddingEnd = view.getPaddingEnd();
}
if (extraPaddingStart != view.getPaddingStart() || extraPaddingEnd != view.getPaddingEnd()) {
// If the view is a content view, padding start and padding end will be the same.
view.setPadding(
extraPaddingStart,
view.getPaddingTop(),
view.getId() == R.id.sud_layout_content ? extraPaddingStart : extraPaddingEnd,
view.getPaddingBottom());
}
}
}
private LayoutStyler() {}
}