/* * Copyright (C) 2023 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.tv.settings; import android.graphics.drawable.Icon; import android.os.Bundle; import android.text.TextUtils; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import androidx.fragment.app.Fragment; /** * Full screen dialog fragment. * * Use {@link DialogBuilder} to set up the arguments to the fragment. * To be used with the {@link R.style#TvSettingsDialog_FullScreen} theme. */ public class FullScreenDialogFragment extends Fragment { /** Constant for {@link #onButtonPressed(int)} indicating the positive button was pressed. */ public static final int ACTION_POSITIVE = 0; /** Constant for {@link #onButtonPressed(int)} indicating the negative button was pressed. */ public static final int ACTION_NEGATIVE = 1; private static final String ARGUMENT_ICON = "ARGUMENT_ICON"; private static final String ARGUMENT_TITLE = "ARGUMENT_TITLE"; private static final String ARGUMENT_MESSAGE = "ARGUMENT_MESSAGE"; private static final String ARGUMENT_HINT_ICON = "ARGUMENT_HINT_ICON"; private static final String ARGUMENT_HINT_TEXT = "ARGUMENT_HINT_TEXT"; private static final String ARGUMENT_POSITIVE_BUTTON_LABEL = "ARGUMENT_POSITIVE_BUTTON_LABEL"; private static final String ARGUMENT_NEGATIVE_BUTTON_LABEL = "ARGUMENT_NEGATIVE_BUTTON_LABEL"; /** Builder that sets up arguments to the dialog fragment */ public static final class DialogBuilder { private final Bundle mArgs = new Bundle(); /** Builder that sets up arguments to the dialog fragment */ public DialogBuilder() { } /** Sets the icon of the dialog */ public DialogBuilder setIcon(Icon icon) { mArgs.putParcelable(ARGUMENT_ICON, icon); return this; } /** Sets the title of the dialog */ public DialogBuilder setTitle(String title) { mArgs.putString(ARGUMENT_TITLE, title); return this; } /** Sets the message of the dialog */ public DialogBuilder setMessage(String message) { mArgs.putString(ARGUMENT_MESSAGE, message); return this; } /** Sets the hint icon (shown below the message) of the dialog */ public DialogBuilder setHintIcon(Icon hintIcon) { mArgs.putParcelable(ARGUMENT_HINT_ICON, hintIcon); return this; } /** Sets the hint text (shown below the message) of the dialog */ public DialogBuilder setHintText(String hintText) { mArgs.putString(ARGUMENT_HINT_TEXT, hintText); return this; } /** Sets the label of the positive button */ public DialogBuilder setPositiveButton(String positiveButtonLabel) { mArgs.putString(ARGUMENT_POSITIVE_BUTTON_LABEL, positiveButtonLabel); return this; } /** Sets the label of the negative button */ public DialogBuilder setNegativeButton(String negativeButtonLabel) { mArgs.putString(ARGUMENT_NEGATIVE_BUTTON_LABEL, negativeButtonLabel); return this; } /** Returns arguments for the dialog fragment */ public Bundle build() { return mArgs; } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LayoutInflater themedInflater = inflater.cloneInContext( new ContextThemeWrapper(inflater.getContext(), R.style.TvSettingsDialog_FullScreen)); View view = themedInflater.inflate(R.layout.full_screen_dialog, container, false); ImageView iconView = view.findViewById(R.id.dialog_icon); TextView titleView = view.findViewById(R.id.dialog_title); TextView messageView = view.findViewById(R.id.dialog_message); ViewGroup customViewContainer = view.findViewById(R.id.custom_view_container); ImageView hintIconView = view.findViewById(R.id.hint_icon); TextView hintTextView = view.findViewById(R.id.hint_text); ViewGroup hintContainerView = view.findViewById(R.id.hint_container); Button positiveButton = view.findViewById(R.id.positive_button); Button negativeButton = view.findViewById(R.id.negative_button); final Bundle args = getArguments(); final Icon icon = args.getParcelable(ARGUMENT_ICON, Icon.class); if (icon != null) { iconView.setVisibility(View.VISIBLE); iconView.setImageIcon(icon); } titleView.setText(args.getString(ARGUMENT_TITLE)); CharSequence message = getMessage(); if (!TextUtils.isEmpty(message)) { messageView.setText(message); } else { messageView.setVisibility(View.GONE); } View customView = createCustomView(customViewContainer); if (customView != null) { customViewContainer.addView(customView); } else { customViewContainer.setVisibility(View.GONE); } final Icon hintIcon = args.getParcelable(ARGUMENT_HINT_ICON, Icon.class); final String hintText = args.getString(ARGUMENT_HINT_TEXT); final boolean hasHint = !TextUtils.isEmpty(hintText); hintContainerView.setVisibility(hasHint ? View.VISIBLE : View.GONE); if (hasHint) { hintTextView.setText(hintText); if (hintIcon != null) { hintIconView.setVisibility(View.VISIBLE); hintIconView.setImageIcon(hintIcon); } } final String positiveButtonLabel = args.getString(ARGUMENT_POSITIVE_BUTTON_LABEL); positiveButton.setVisibility( TextUtils.isEmpty(positiveButtonLabel) ? View.GONE : View.VISIBLE); positiveButton.setText(positiveButtonLabel); positiveButton.setOnClickListener((v) -> onButtonPressed(ACTION_POSITIVE)); final String negativeButtonLabel = args.getString(ARGUMENT_NEGATIVE_BUTTON_LABEL); negativeButton.setVisibility( TextUtils.isEmpty(negativeButtonLabel) ? View.GONE : View.VISIBLE); negativeButton.setText(negativeButtonLabel); negativeButton.setOnClickListener((v) -> onButtonPressed(ACTION_NEGATIVE)); return view; } /** Returns the dialog message. */ public CharSequence getMessage() { return getArguments().getString(ARGUMENT_MESSAGE); } /** Returns the custom view (shown below the message) */ public View createCustomView(ViewGroup parent) { return null; } /** * Called when a dialog button was pressed. * * @param action Indicates which button was pressed * @see #ACTION_POSITIVE * @see #ACTION_NEGATIVE */ public void onButtonPressed(int action) { } }