// Copyright 2018 The Chromium Authors
// 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.home.list.holder;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.CallSuper;
import org.chromium.chrome.browser.download.home.list.ListItem;
import org.chromium.chrome.browser.download.home.list.ListProperties;
import org.chromium.chrome.browser.download.home.list.UiUtils;
import org.chromium.chrome.browser.download.home.list.view.CircularProgressView;
import org.chromium.chrome.browser.download.internal.R;
import org.chromium.components.offline_items_collection.OfflineItem;
import org.chromium.components.offline_items_collection.OfflineItemState;
import org.chromium.ui.modelutil.PropertyModel;
/**
* A {@link RecyclerView.ViewHolder} specifically meant to display an in-progress {@code
* OfflineItem}.
*/
public abstract class InProgressViewHolder extends ListItemViewHolder {
private final boolean mConstrainCaption;
private final TextView mCaption;
private final CircularProgressView mActionButton;
private final ImageButton mCancelButton;
/** Constructor. */
public InProgressViewHolder(View view, boolean constrainCaption) {
super(view);
mConstrainCaption = constrainCaption;
mCaption = view.findViewById(R.id.caption);
mActionButton = view.findViewById(R.id.action_button);
mCancelButton = view.findViewById(R.id.cancel_button);
}
// ListItemViewHolder implementation.
@Override
@CallSuper
public void bind(PropertyModel properties, ListItem item) {
OfflineItem offlineItem = ((ListItem.OfflineItemListItem) item).item;
mCaption.setText(UiUtils.generateInProgressCaption(offlineItem, mConstrainCaption));
UiUtils.setProgressForOfflineItem(mActionButton, offlineItem);
mCancelButton.setOnClickListener(
v -> properties.get(ListProperties.CALLBACK_CANCEL).onResult(offlineItem));
mCancelButton.setVisibility(
offlineItem.state == OfflineItemState.CANCELLED ? View.INVISIBLE : View.VISIBLE);
mActionButton.setOnClickListener(
view -> {
switch (offlineItem.state) {
case OfflineItemState.IN_PROGRESS: // Intentional fallthrough.
case OfflineItemState.PENDING:
properties.get(ListProperties.CALLBACK_PAUSE).onResult(offlineItem);
break;
case OfflineItemState.PAUSED: // Intentional fallthrough.
case OfflineItemState.FAILED: // Intentional fallthrough.
case OfflineItemState.INTERRUPTED: // Intentional fallthrough.
case OfflineItemState.CANCELLED: // Intentional fallthrough.
properties.get(ListProperties.CALLBACK_RESUME).onResult(offlineItem);
break;
case OfflineItemState.COMPLETE: // Intentional fallthrough.
default:
assert false : "Unexpected state for progress bar.";
break;
}
});
}
}