Commit e27b1a0d authored by 9731301's avatar 9731301

add duration with help of TimeAgo

parent dbb33fb2
......@@ -15,7 +15,10 @@ import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import com.example.mynotepad.MenuFeatures.CustomToolbarOption;
import com.example.mynotepad.MenuFeatures.CustomToolbarOptionListener;
......@@ -32,12 +35,15 @@ import java.util.ArrayList;
public class AudioListFragment extends Fragment {
private ConstraintLayout playerSheet;
private BottomSheetBehavior bottomSheetBehavior;
public static BottomSheetBehavior bottomSheetBehavior;
private RecyclerView recyclerViewRecordings;
private VoiceAdaptor recordingAdapter;
private ArrayList<MyVoice> myVoiceArrayList;
private CustomToolbarOption customToolbarOption;
private MyVoice myChosenVoice;
private ImageButton playerPlayBtn;
private TextView fileNameTv , headerTitleTv;
private SeekBar seekBar;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
......@@ -61,7 +67,10 @@ public class AudioListFragment extends Fragment {
customToolbarOption = v.findViewById(R.id.customToolbarOption);
customToolbarOption.setVisibility(View.GONE);
myVoiceArrayList = new ArrayList<>();
playerPlayBtn = v.findViewById(R.id.player_play_btn);
headerTitleTv = v.findViewById(R.id.player_header_title);
fileNameTv = v.findViewById(R.id.textView3);
seekBar = v.findViewById(R.id.seekBar);
recyclerViewRecordings = v.findViewById(R.id.recyclerView);
recyclerViewRecordings.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
......@@ -78,11 +87,11 @@ public class AudioListFragment extends Fragment {
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getName();
String recordingUri = root.getAbsolutePath() + "/NotepadVoiceRecorder/Audios/" + fileName;
MyVoice myVoice = new MyVoice(recordingUri, fileName, false);
MyVoice myVoice = new MyVoice(recordingUri, fileName, false , files[i].lastModified());
myVoiceArrayList.add(myVoice);
}
}
recordingAdapter = new VoiceAdaptor(getContext(), myVoiceArrayList);
recordingAdapter = new VoiceAdaptor(getContext(), myVoiceArrayList , playerPlayBtn,fileNameTv , headerTitleTv , seekBar);
recyclerViewRecordings.setAdapter(recordingAdapter);
}
......
package com.example.mynotepad.MenuFeatures.VoiceMassages.VoiceMassagesRecyclerView;
public class MyVoice {
String Uri, fileName;
boolean isPlaying = false;
private String Uri, fileName;
private boolean isPlaying = false;
private long lastModified;
public MyVoice(String uri, String fileName, boolean isPlaying) {
public MyVoice(String uri, String fileName, boolean isPlaying , long lastModified) {
Uri = uri;
this.fileName = fileName;
this.isPlaying = isPlaying;
this.lastModified = lastModified;
}
public String getUri() {
......@@ -25,4 +27,8 @@ public class MyVoice {
public void setPlaying(boolean playing) {
this.isPlaying = playing;
}
public long getLastModified() {
return lastModified;
}
}
......@@ -5,7 +5,7 @@ import java.util.Date;
import java.util.concurrent.TimeUnit;
public class TimeAgo {
Date now = new Date();
private Date now = new Date();
public String getTimeAgo(long duration) {
long seconds = TimeUnit.MILLISECONDS.toSeconds(now.getTime() - duration);
......
......@@ -10,6 +10,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
......@@ -18,7 +19,9 @@ import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.recyclerview.widget.RecyclerView;
import com.example.mynotepad.MenuFeatures.VoiceMassages.AudioListFragment;
import com.example.mynotepad.R;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import java.io.IOException;
import java.util.ArrayList;
......@@ -30,13 +33,22 @@ public class VoiceAdaptor extends RecyclerView.Adapter<VoiceAdaptor.VoiceViewHol
private boolean isPlaying = false;
private int last_index = -1;
private OnVoiceMassageClickListener onVoiceMassageClickListener;
private ImageButton playerPlayBtn;
private TextView fileNameTv, headerTitleTv;
private SeekBar seekBar;
private TimeAgo timeAgo;
public VoiceAdaptor(Context context, ArrayList<MyVoice> myVoiceArrayList) {
public VoiceAdaptor(Context context, ArrayList<MyVoice> myVoiceArrayList, ImageButton playerPlayBtn, TextView fileNameTv, TextView headerTitleTv, SeekBar seekBar) {
this.context = context;
this.myVoiceArrayList = myVoiceArrayList;
this.playerPlayBtn = playerPlayBtn;
this.fileNameTv = fileNameTv;
this.headerTitleTv = headerTitleTv;
this.seekBar = seekBar;
timeAgo= new TimeAgo();
}
@NonNull
@Override
public VoiceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
......@@ -56,21 +68,24 @@ public class VoiceAdaptor extends RecyclerView.Adapter<VoiceAdaptor.VoiceViewHol
MyVoice myVoice = myVoiceArrayList.get(position);
holder.textViewName.setText(myVoice.getFileName());
holder.textLongAgo.setText(timeAgo.getTimeAgo(myVoice.getLastModified()));
if (myVoice.isPlaying()) {
holder.imageViewStop.setVisibility(View.VISIBLE);
holder.imageViewPlay.setVisibility(View.GONE);
headerTitleTv.setText("playing");
playerPlayBtn.setImageDrawable(context.getResources().getDrawable(R.drawable.white_play_arrow));
TransitionManager.beginDelayedTransition((ViewGroup) holder.itemView);
// holder.seekBar.setVisibility(View.VISIBLE);
// holder.seekUpdation(holder);
holder.seekUpdation(holder);
} else {
headerTitleTv.setText("not playing");
holder.imageViewStop.setVisibility(View.GONE);
holder.imageViewPlay.setVisibility(View.VISIBLE);
playerPlayBtn.setImageDrawable(context.getResources().getDrawable(R.drawable.white_pause));
TransitionManager.beginDelayedTransition((ViewGroup) holder.itemView);
// holder.seekBar.setVisibility(View.GONE);
}
// holder.manageSeekBar(holder);
holder.manageSeekBar(holder);
}
......@@ -83,116 +98,95 @@ public class VoiceAdaptor extends RecyclerView.Adapter<VoiceAdaptor.VoiceViewHol
this.onVoiceMassageClickListener = onVoiceMassageClickListener;
}
class VoiceViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {
FrameLayout startStopBtn;
ImageView imageViewPlay, imageViewStop;
// SeekBar seekBar;
TextView textViewName;
private FrameLayout startStopBtn;
private ImageView imageViewPlay, imageViewStop;
private TextView textViewName , textLongAgo;
private String recordingUri;
private Handler mHandler = new Handler();
VoiceViewHolder holder;
private VoiceViewHolder holder;
private int playingPosition;
public VoiceViewHolder(View itemView) {
super(itemView);
imageViewPlay = itemView.findViewById(R.id.playImg);
imageViewStop = itemView.findViewById(R.id.pauseImg);
// seekBar = itemView.findViewById(R.id.seekBar);
textViewName = itemView.findViewById(R.id.voiceName);
textLongAgo = itemView.findViewById(R.id.voiceTime);
startStopBtn = itemView.findViewById(R.id.start_stopBtn);
imageViewStop.setVisibility(View.GONE);
itemView.setOnLongClickListener(this);
/*
add clickListener to stop or start playing
*/
startStopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAdapterPosition();
MyVoice myVoice = myVoiceArrayList.get(position);
recordingUri = myVoice.getUri();
//if media player is playing
if (isPlaying) {
stopPlaying();
//if another clicked item (your last chosen item) is playing and you click on it again to stop it
if (position == last_index) {
myVoice.setPlaying(false);
stopPlaying();
notifyItemChanged(position);
}
// if you click on another item while your last one(your last chosen item) is playing
else {
markAllPaused();
myVoice.setPlaying(true);
notifyItemChanged(position);
startPlaying(myVoice, position);
last_index = position;// set the last playing item on the one which is playing
}
}
//if media player is not playing
else {
//if clicked item is playing it is wrong so it should be stopped
if (myVoice.isPlaying()) {
myVoice.setPlaying(false);
stopPlaying();
Log.d("isPlayin", "True");
}
//if nothing is playing and you want to play a new voice massage
else {
startPlaying(myVoice, position);
myVoice.setPlaying(true);
// seekBar.setMax(mPlayer.getDuration());
Log.d("isPlayin", "False");
}
notifyItemChanged(position);
last_index = position;// set the last playing item on the one which is playing
}
playerPlayBtn.setImageDrawable(context.getResources().getDrawable(R.drawable.white_play_arrow));
}
addListener();
});
}
/* public void manageSeekBar(VoiceViewHolder holder) {
holder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mPlayer != null && fromUser) {
mPlayer.seekTo(progress);
}
}
private void addListener() {
itemView.setOnLongClickListener(this);
//add clickListener to stop or start playing
startStopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
public void onClick(View view) {
playingPosition = getAdapterPosition();
startAndStopPlaying(playingPosition);
}
});
playerPlayBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
public void onClick(View view) {
startAndStopPlaying(playingPosition);
}
});
}
private void startAndStopPlaying(int position) {
MyVoice myVoice = myVoiceArrayList.get(position);
recordingUri = myVoice.getUri();
fileNameTv.setText(myVoice.getFileName());
Runnable runnable = new Runnable() {
@Override
public void run() {
seekUpdation(holder);
//if media player is playing
if (isPlaying) {
stopPlaying();
//if another clicked item (your last chosen item) is playing and you click on it again to stop it
if (position == last_index) {
myVoice.setPlaying(false);
stopPlaying();
notifyItemChanged(position);
}
// if you click on another item while your last one(your last chosen item) is playing
else {
markAllPaused();
myVoice.setPlaying(true);
notifyItemChanged(position);
startPlaying(myVoice, position);
last_index = position;// set the last playing item on the one which is playing
}
}
};
private void seekUpdation(VoiceViewHolder holder) {
this.holder = holder;
if (mPlayer != null) {
int mCurrentPosition = mPlayer.getCurrentPosition();
holder.seekBar.setMax(mPlayer.getDuration());
holder.seekBar.setProgress(mCurrentPosition);
//if media player is not playing
else {
//if clicked item is playing it is wrong so it should be stopped
if (myVoice.isPlaying()) {
myVoice.setPlaying(false);
stopPlaying();
Log.d("isPlayin", "True");
}
//if nothing is playing and you want to play a new voice massage
else {
startPlaying(myVoice, position);
myVoice.setPlaying(true);
// seekBar.setMax(mPlayer.getDuration());
Log.d("isPlayin", "False");
}
notifyItemChanged(position);
last_index = position;// set the last playing item on the one which is playing
}
mHandler.postDelayed(runnable, 100);
}*/
}
private void stopPlaying() {
try {
......@@ -205,6 +199,7 @@ public class VoiceAdaptor extends RecyclerView.Adapter<VoiceAdaptor.VoiceViewHol
}
private void startPlaying(final MyVoice audio, final int position) {
AudioListFragment.bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);// when u choose an item media player will open automatically
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(recordingUri);
......@@ -214,7 +209,7 @@ public class VoiceAdaptor extends RecyclerView.Adapter<VoiceAdaptor.VoiceViewHol
Log.e("LOG_TAG", "prepare() failed");
}
//showing the pause button
// seekBar.setMax(mPlayer.getDuration());
seekBar.setMax(mPlayer.getDuration());
isPlaying = true;
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
......@@ -225,7 +220,62 @@ public class VoiceAdaptor extends RecyclerView.Adapter<VoiceAdaptor.VoiceViewHol
}
});
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopPlaying();
playerPlayBtn.setImageDrawable(context.getResources().getDrawable(R.drawable.white_play_arrow));
headerTitleTv.setText("finished");
}
});
}
public void manageSeekBar(VoiceViewHolder holder) {
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mPlayer != null && fromUser) {
mPlayer.seekTo(progress);
}
mHandler.postDelayed(runnable, 100);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
Runnable runnable = new Runnable() {
@Override
public void run() {
seekUpdation(holder);
}
};
private void seekUpdation(VoiceViewHolder holder) {
this.holder = holder;
if (mPlayer != null) {
int mCurrentPosition = mPlayer.getCurrentPosition();
seekBar.setMax(mPlayer.getDuration());
seekBar.setProgress(mCurrentPosition);
}
mHandler.postDelayed(runnable, 100);
}
/*
* set all voice items on pause and stop all of them
*/
private void markAllPaused() {
for (int i = 0; i < myVoiceArrayList.size(); i++) {
myVoiceArrayList.get(i).setPlaying(false);
myVoiceArrayList.set(i, myVoiceArrayList.get(i));
}
notifyDataSetChanged();
}
@Override
......@@ -235,14 +285,5 @@ public class VoiceAdaptor extends RecyclerView.Adapter<VoiceAdaptor.VoiceViewHol
return true;
}
}
/*
* set all voice items on pause and stop all of them
*/
private void markAllPaused() {
for (int i = 0; i < myVoiceArrayList.size(); i++) {
myVoiceArrayList.get(i).setPlaying(false);
myVoiceArrayList.set(i, myVoiceArrayList.get(i));
}
notifyDataSetChanged();
}
}
<vector android:height="40dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="40dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/>
</vector>
......@@ -92,7 +92,7 @@
android:id="@+id/player_play_btn"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginTop="28dp"
android:layout_marginTop="24dp"
android:background="#0035438C"
android:padding="5dp"
app:layout_constraintEnd_toEndOf="parent"
......@@ -127,6 +127,7 @@
app:srcCompat="@android:drawable/ic_media_ff" />
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment