blob: b5df2bab704427c8139f49deae05d868c5389c26 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.download.interstitial;
import static org.chromium.chrome.browser.download.interstitial.DownloadInterstitialProperties.STATE;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.chromium.chrome.browser.download.home.list.ListItem;
import org.chromium.chrome.browser.download.home.list.holder.GenericViewHolder;
import org.chromium.chrome.browser.download.home.list.holder.InProgressGenericViewHolder;
import org.chromium.chrome.browser.download.internal.R;
import org.chromium.components.browser_ui.widget.DualControlLayout;
import org.chromium.components.offline_items_collection.OfflineItem;
import org.chromium.components.offline_items_collection.OfflineItemState;
import org.chromium.ui.modelutil.PropertyModel;
/** Class for a download interstitial which handles all interaction with the view. */
class DownloadInterstitialView {
private final View mView;
private final TextView mTitle;
private final GenericViewHolder mGenericViewHolder;
private final InProgressGenericViewHolder mInProgressGenericViewHolder;
private final Button mPrimaryButton;
private final Button mSecondaryButton;
/**
* @param context The context of the tab to contain the download interstitial.
* @return A new DownloadInterstitialView instance.
*/
public static DownloadInterstitialView create(Context context) {
View view = LayoutInflater.from(context).inflate(R.layout.download_interstitial, null);
return new DownloadInterstitialView(view, context);
}
private DownloadInterstitialView(View view, Context context) {
mView = view;
mTitle = mView.findViewById(R.id.heading);
FrameLayout fileInfo = mView.findViewById(R.id.file_info);
mGenericViewHolder = GenericViewHolder.create(fileInfo);
mInProgressGenericViewHolder = InProgressGenericViewHolder.create(fileInfo);
mGenericViewHolder.itemView.setVisibility(View.GONE);
mInProgressGenericViewHolder.itemView.setVisibility(View.INVISIBLE);
fileInfo.addView(mGenericViewHolder.itemView);
fileInfo.addView(mInProgressGenericViewHolder.itemView);
mPrimaryButton = DualControlLayout.createButtonForLayout(context, true, "", null);
mPrimaryButton.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mPrimaryButton.setVisibility(View.INVISIBLE);
mSecondaryButton = DualControlLayout.createButtonForLayout(
context, false, mView.getResources().getString(R.string.cancel), null);
mSecondaryButton.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mSecondaryButton.setVisibility(View.INVISIBLE);
DualControlLayout buttonBar = mView.findViewById(R.id.button_bar);
buttonBar.addView(mPrimaryButton);
buttonBar.addView(mSecondaryButton);
}
/** @return The parent view containing the download interstitial. */
public View getView() {
return mView;
}
/**
* Updates the file info section when the attached download's progress or state is updated.
* @param item The offline item attached to the UI.
* @param model The property model of the DownloadInterstitial.
*/
void updateFileInfo(OfflineItem item, PropertyModel model) {
// TODO(alexmitra): Investigate removing code which sets the item's state directly.
if (model.get(STATE) == DownloadInterstitialProperties.State.PENDING_REMOVAL) {
item.state = OfflineItemState.CANCELLED;
} else if (model.get(STATE) == DownloadInterstitialProperties.State.SUCCESSFUL) {
item.state = OfflineItemState.COMPLETE;
}
if (item.state == OfflineItemState.COMPLETE) {
mInProgressGenericViewHolder.itemView.setVisibility(View.GONE);
mGenericViewHolder.itemView.setVisibility(View.VISIBLE);
mGenericViewHolder.bind(model, new ListItem.OfflineItemListItem(item));
} else {
mGenericViewHolder.itemView.setVisibility(View.GONE);
mInProgressGenericViewHolder.itemView.setVisibility(View.VISIBLE);
mInProgressGenericViewHolder.bind(model, new ListItem.OfflineItemListItem(item));
}
}
/**
* Sets the text shown as the title.
* @param text The new text for the title to display.
*/
void setTitleText(String text) {
mTitle.setText(text);
}
/**
* Sets whether the primary button should be shown.
* @param visible Whether the primary button should be visible.
*/
void setPrimaryButtonVisibility(boolean visible) {
mPrimaryButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
}
/**
* Sets the text shown on the primary button.
* @param text The new text for the primary button to display.
*/
void setPrimaryButtonText(String text) {
mPrimaryButton.setText(text);
}
/**
* Sets the callback which is run when the primary button is clicked.
* @param callback The callback to run.
*/
void setPrimaryButtonCallback(Runnable callback) {
mPrimaryButton.setOnClickListener(v -> callback.run());
}
/**
* Sets whether the secondary button should be shown.
* @param visible Whether the secondary button should be visible.
*/
void setSecondaryButtonVisibility(boolean visible) {
mSecondaryButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
}
/**
* Sets the text shown on the secondary button.
* @param text The new text for the secondary button to display.
*/
void setSecondaryButtonText(String text) {
mSecondaryButton.setText(text);
}
/**
* Sets the callback which is run when the secondary button is clicked.
* @param callback The callback to run.
*/
void setSecondaryButtonCallback(Runnable callback) {
mSecondaryButton.setOnClickListener(v -> callback.run());
}
}