SetupWizardLibrary/library/main/src/com/android/setupwizardlib/template/ButtonFooterMixin.java
Aurimas Liutikas 4860e4ee48 Migrate setup-wizard-lib to androidx.
Test: make setup-wizard-lib
Bug: 76692459
Change-Id: I40171e973d442b1a1815e9e7d7c2cc984cb38bac
2018-04-18 17:26:19 -07:00

175 lines
6.1 KiB
Java

/*
* Copyright (C) 2017 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.android.setupwizardlib.template;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewStub;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.annotation.StyleRes;
import com.android.setupwizardlib.R;
import com.android.setupwizardlib.TemplateLayout;
/**
* A {@link Mixin} for managing buttons. By default, the button bar follows the GLIF design and
* expects that buttons on the start (left for LTR) are "secondary" borderless buttons, while
* buttons on the end (right for LTR) are "primary" accent-colored buttons.
*/
public class ButtonFooterMixin implements Mixin {
private final Context mContext;
@Nullable
private final ViewStub mFooterStub;
private LinearLayout mButtonContainer;
/**
* Create a mixin for managing buttons on the footer.
*
* @param layout The {@link TemplateLayout} containing this mixin.
*/
public ButtonFooterMixin(TemplateLayout layout) {
mContext = layout.getContext();
mFooterStub = (ViewStub) layout.findManagedViewById(R.id.suw_layout_footer);
}
/**
* Add a button with the given text and style. Common style for GLIF are
* {@code SuwGlifButton.Primary} and {@code SuwGlifButton.Secondary}.
*
* @param text The label for the button.
* @param theme Theme resource to be used for this button. Since this is applied as a theme,
* the resource will typically apply {@code android:buttonStyle} so it will be
* applied to the button as a style as well.
*
* @return The button that was created.
*/
public Button addButton(CharSequence text, @StyleRes int theme) {
Button button = createThemedButton(mContext, theme);
button.setText(text);
return addButton(button);
}
/**
* Add a button with the given text and style. Common style for GLIF are
* {@code SuwGlifButton.Primary} and {@code SuwGlifButton.Secondary}.
*
* @param text The label for the button.
* @param theme Theme resource to be used for this button. Since this is applied as a theme,
* the resource will typically apply {@code android:buttonStyle} so it will be
* applied to the button as a style as well.
*
* @return The button that was created.
*/
public Button addButton(@StringRes int text, @StyleRes int theme) {
Button button = createThemedButton(mContext, theme);
button.setText(text);
return addButton(button);
}
/**
* Add a button to the footer.
*
* @param button The button to be added to the footer.
* @return The button that was added.
*/
public Button addButton(Button button) {
final LinearLayout buttonContainer = ensureFooterInflated();
buttonContainer.addView(button);
return button;
}
/**
* Add a space to the footer. Spaces will share the remaining space of footer, so for example,
* [Button] [space] [Button] [space] [Button] will give you 3 buttons, left, center, and right
* aligned.
*
* @return The view that was used as space.
*/
public View addSpace() {
final LinearLayout buttonContainer = ensureFooterInflated();
View space = new View(buttonContainer.getContext());
space.setLayoutParams(new LayoutParams(0, 0, 1.0f));
space.setVisibility(View.INVISIBLE);
buttonContainer.addView(space);
return space;
}
/**
* Remove a previously added button.
*
* @param button The button to be removed.
*/
public void removeButton(Button button) {
if (mButtonContainer != null) {
mButtonContainer.removeView(button);
}
}
/**
* Remove a previously added space.
*
* @param space The space to be removed.
*/
public void removeSpace(View space) {
if (mButtonContainer != null) {
mButtonContainer.removeView(space);
}
}
/**
* Remove all views, including spaces, from the footer. Note that if the footer container is
* already inflated, this will not remove the container itself.
*/
public void removeAllViews() {
if (mButtonContainer != null) {
mButtonContainer.removeAllViews();
}
}
@NonNull
private LinearLayout ensureFooterInflated() {
if (mButtonContainer == null) {
if (mFooterStub == null) {
throw new IllegalStateException("Footer stub is not found in this template");
}
mFooterStub.setLayoutResource(R.layout.suw_glif_footer_button_bar);
mButtonContainer = (LinearLayout) mFooterStub.inflate();
}
return mButtonContainer;
}
@SuppressLint("InflateParams")
private Button createThemedButton(Context context, @StyleRes int theme) {
// Inflate a single button from XML, which when using support lib, will take advantage of
// the injected layout inflater and give us AppCompatButton instead.
LayoutInflater inflater = LayoutInflater.from(new ContextThemeWrapper(context, theme));
return (Button) inflater.inflate(R.layout.suw_button, null, false);
}
}