blob: b3773272884ae97bf718d15c7a14047a871b39cf [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 android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
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);
// TODO: After all users added the check before calling the API, this check can be
// deleted.
if (PartnerStyleHelper.shouldApplyPartnerResource(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);
// TODO: After all users added the check before calling the API, this check can be
// deleted.
if (PartnerStyleHelper.shouldApplyPartnerResource(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;
// If the view is a content view, padding start and padding end will be the same.
if (view.getId() == R.id.sud_layout_content) {
extraPaddingEnd =
((int)
PartnerConfigHelper.get(context)
.getDimension(context, PartnerConfig.CONFIG_LAYOUT_MARGIN_START))
- layoutMarginEnd;
}
} else {
extraPaddingEnd = view.getPaddingEnd();
// If the view is a content view, padding start and padding end will be the same.
if (view.getId() == R.id.sud_layout_content) {
extraPaddingEnd = view.getPaddingStart();
}
}
if (extraPaddingStart != view.getPaddingStart() || extraPaddingEnd != view.getPaddingEnd()) {
if (view.getId() == R.id.sud_layout_content) {
// The sud_layout_content is framelayout.
// The framelayout background maybe infected by this change.
// Currently the content background is same as the activity background, and there is no
// partner config to customize it.
LinearLayout.LayoutParams layoutParams = (LayoutParams) view.getLayoutParams();
layoutParams.setMargins(
extraPaddingStart, view.getPaddingTop(), extraPaddingEnd, view.getPaddingBottom());
} else {
view.setPadding(
extraPaddingStart, view.getPaddingTop(), extraPaddingEnd, view.getPaddingBottom());
}
}
}
}
private LayoutStyler() {}
}