package com.automattic.simplenote;
import android.content.DialogInterface;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import com.automattic.simplenote.models.Note;
import com.automattic.simplenote.utils.DateTimeUtils;
import com.simperium.client.Bucket;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Map;
/**
* Created by Ondrej Ruttkay on 26/03/2016.
*/
public class HistoryBottomSheetDialog extends BottomSheetDialogBase {
private boolean mDidTapButton;
private ArrayList<Note> mNoteRevisionsList;
private View mProgressBar;
private View mErrorText;
private View mLoadingView;
private View mSliderView;
private TextView mHistoryDate;
private SeekBar mHistorySeekBar;
private Fragment mFragment;
private Note note;
private final Bucket.RevisionsRequestCallbacks<Note> mRevisionsRequestCallbacks = new
Bucket.RevisionsRequestCallbacks<Note>() {
// Note: These callbacks won't be running on the main thread
@Override
public void onComplete(Map<Integer, Note> revisionsMap) {
if (!mFragment.isAdded() || note == null) return;
// Convert map to an array list, to work better with the 0-index based seekbar
mNoteRevisionsList = new ArrayList<>(revisionsMap.values());
mFragment.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
updateProgressBar();
}
});
}
@Override
public void onRevision(String key, int version, JSONObject object) {
}
@Override
public void onError(Throwable exception) {
if (!mFragment.isAdded() || !isShowing()) return;
mFragment.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressBar.setVisibility(View.GONE);
mErrorText.setVisibility(View.VISIBLE);
}
});
}
};
public HistoryBottomSheetDialog(@NonNull final Fragment fragment, @NonNull final HistorySheetListener historySheetListener) {
super(fragment.getActivity());
mFragment = fragment;
View mHistoryView = LayoutInflater.from(fragment.getActivity()).inflate(R.layout.bottom_sheet_history, null, false);
mHistoryDate = (TextView) mHistoryView.findViewById(R.id.history_date);
mHistorySeekBar = (SeekBar) mHistoryView.findViewById(R.id.seek_bar);
mProgressBar = mHistoryView.findViewById(R.id.history_progress_bar);
mErrorText = mHistoryView.findViewById(R.id.history_error_text);
mLoadingView = mHistoryView.findViewById(R.id.history_loading_view);
mSliderView = mHistoryView.findViewById(R.id.history_slider_view);
mHistorySeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mNoteRevisionsList == null || !isShowing()) {
return;
}
Calendar noteDate = null;
if (progress == mNoteRevisionsList.size() && note != null) {
historySheetListener.onHistoryUpdateNote(note.getContent());
noteDate = note.getModificationDate();
} else if (progress < mNoteRevisionsList.size() && mNoteRevisionsList.get(progress) != null) {
Note revisedNote = mNoteRevisionsList.get(progress);
noteDate = revisedNote.getModificationDate();
historySheetListener.onHistoryUpdateNote(revisedNote.getContent());
}
mHistoryDate.setText(DateTimeUtils.getDateText(mFragment.getActivity(), noteDate));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// noop
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// noop
}
});
View cancelHistoryButton = mHistoryView.findViewById(R.id.cancel_history_button);
cancelHistoryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDidTapButton = true;
historySheetListener.onHistoryCancelClicked();
}
});
View restoreHistoryButton = mHistoryView.findViewById(R.id.restore_history_button);
restoreHistoryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDidTapButton = true;
historySheetListener.onHistoryRestoreClicked();
}
});
setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
historySheetListener.onHistoryDismissed();
note = null;
}
});
setContentView(mHistoryView);
}
public boolean isHistoryLoaded() {
return isShowing() && mSliderView.getVisibility() == View.VISIBLE;
}
public void show(Note note) {
if (mFragment.isAdded()) {
this.note = note;
this.mDidTapButton = false;
setProgressBar();
show();
}
}
public boolean didTapOnButton() {
return mDidTapButton;
}
public void updateProgressBar() {
if (isShowing()) {
setProgressBar();
}
}
public Bucket.RevisionsRequestCallbacks<Note> getRevisionsRequestCallbacks() {
return mRevisionsRequestCallbacks;
}
private void setProgressBar() {
int totalRevs = mNoteRevisionsList == null ? 0 : mNoteRevisionsList.size();
if (totalRevs > 0) {
mHistorySeekBar.setMax(totalRevs);
mHistorySeekBar.setProgress(totalRevs);
mHistoryDate.setText(DateTimeUtils.getDateText(mFragment.getActivity(), note.getModificationDate()));
mLoadingView.setVisibility(View.GONE);
mSliderView.setVisibility(View.VISIBLE);
} else {
mLoadingView.setVisibility(View.VISIBLE);
mSliderView.setVisibility(View.INVISIBLE);
}
}
public interface HistorySheetListener {
void onHistoryCancelClicked();
void onHistoryRestoreClicked();
void onHistoryDismissed();
void onHistoryUpdateNote(String content);
}
}