/*
* Copyright (c) 2010-2019 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package org.linphone.recording;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SeekBar;
import androidx.annotation.NonNull;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import org.linphone.R;
import org.linphone.utils.SelectableAdapter;
import org.linphone.utils.SelectableHelper;
public class RecordingsAdapter extends SelectableAdapter {
private final List mRecordings;
private final Context mContext;
private final RecordingViewHolder.ClickListener mClickListener;
public RecordingsAdapter(
Context context,
List recordings,
RecordingViewHolder.ClickListener listener,
SelectableHelper helper) {
super(helper);
mRecordings = recordings;
mContext = context;
mClickListener = listener;
}
@Override
public Object getItem(int position) {
return mRecordings.get(position);
}
@NonNull
@Override
public RecordingViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v =
LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.recording_cell, viewGroup, false);
return new RecordingViewHolder(v, mClickListener);
}
@SuppressLint("SimpleDateFormat")
@Override
public void onBindViewHolder(@NonNull final RecordingViewHolder viewHolder, int i) {
final Recording record = mRecordings.get(i);
viewHolder.name.setSelected(true); // For automated horizontal scrolling of long texts
Calendar recordTime = Calendar.getInstance();
recordTime.setTime(record.getRecordDate());
viewHolder.separatorText.setText(DateToHumanDate(recordTime));
viewHolder.select.setVisibility(isEditionEnabled() ? View.VISIBLE : View.GONE);
viewHolder.select.setChecked(isSelected(i));
if (i > 0) {
Recording previousRecord = mRecordings.get(i - 1);
Date previousRecordDate = previousRecord.getRecordDate();
Calendar previousRecordTime = Calendar.getInstance();
previousRecordTime.setTime(previousRecordDate);
if (isSameDay(previousRecordTime, recordTime)) {
viewHolder.separator.setVisibility(View.GONE);
} else {
viewHolder.separator.setVisibility(View.VISIBLE);
}
} else {
viewHolder.separator.setVisibility(View.VISIBLE);
}
if (record.isPlaying()) {
viewHolder.playButton.setImageResource(R.drawable.record_pause);
} else {
viewHolder.playButton.setImageResource(R.drawable.record_play);
}
viewHolder.playButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
if (record.isPaused()) {
record.play();
viewHolder.playButton.setImageResource(R.drawable.record_pause);
} else {
record.pause();
viewHolder.playButton.setImageResource(R.drawable.record_play);
}
}
});
viewHolder.name.setText(record.getName());
viewHolder.date.setText(new SimpleDateFormat("HH:mm").format(record.getRecordDate()));
int position = record.getCurrentPosition();
viewHolder.currentPosition.setText(
String.format(
Locale.getDefault(),
"%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(position),
TimeUnit.MILLISECONDS.toSeconds(position)
- TimeUnit.MINUTES.toSeconds(
TimeUnit.MILLISECONDS.toMinutes(position))));
int duration = record.getDuration();
viewHolder.duration.setText(
String.format(
Locale.getDefault(),
"%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(duration),
TimeUnit.MILLISECONDS.toSeconds(duration)
- TimeUnit.MINUTES.toSeconds(
TimeUnit.MILLISECONDS.toMinutes(duration))));
viewHolder.progressionBar.setMax(record.getDuration());
viewHolder.progressionBar.setProgress(0);
viewHolder.progressionBar.setOnSeekBarChangeListener(
new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
int progressToSet =
progress > 0 && progress < seekBar.getMax() ? progress : 0;
if (progress == seekBar.getMax()) {
if (record.isPlaying()) record.pause();
}
record.seek(progressToSet);
seekBar.setProgress(progressToSet);
int currentPosition = record.getCurrentPosition();
viewHolder.currentPosition.setText(
String.format(
Locale.getDefault(),
"%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(currentPosition),
TimeUnit.MILLISECONDS.toSeconds(currentPosition)
- TimeUnit.MINUTES.toSeconds(
TimeUnit.MILLISECONDS.toMinutes(
currentPosition))));
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
record.setRecordingListener(
new RecordingListener() {
@Override
public void currentPositionChanged(int currentPosition) {
viewHolder.currentPosition.setText(
String.format(
Locale.getDefault(),
"%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(currentPosition),
TimeUnit.MILLISECONDS.toSeconds(currentPosition)
- TimeUnit.MINUTES.toSeconds(
TimeUnit.MILLISECONDS.toMinutes(
currentPosition))));
viewHolder.progressionBar.setProgress(currentPosition);
}
@Override
public void endOfRecordReached() {
record.pause();
record.seek(0);
viewHolder.progressionBar.setProgress(0);
viewHolder.currentPosition.setText("00:00");
viewHolder.playButton.setImageResource(R.drawable.record_play);
}
});
}
@Override
public int getItemCount() {
return mRecordings.size();
}
@SuppressLint("SimpleDateFormat")
private String DateToHumanDate(Calendar cal) {
SimpleDateFormat dateFormat;
if (isToday(cal)) {
return mContext.getString(R.string.today);
} else if (isYesterday(cal)) {
return mContext.getString(R.string.yesterday);
} else {
dateFormat =
new SimpleDateFormat(
mContext.getResources().getString(R.string.history_date_format));
}
return dateFormat.format(cal.getTime());
}
private boolean isSameDay(Calendar cal1, Calendar cal2) {
if (cal1 == null || cal2 == null) {
return false;
}
return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA)
&& cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)
&& cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));
}
private boolean isToday(Calendar cal) {
return isSameDay(cal, Calendar.getInstance());
}
private boolean isYesterday(Calendar cal) {
Calendar yesterday = Calendar.getInstance();
yesterday.roll(Calendar.DAY_OF_MONTH, -1);
return isSameDay(cal, yesterday);
}
}