/* * 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 androidx.annotation.NonNull; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.linphone.LinphoneManager; import org.linphone.core.Player; import org.linphone.core.PlayerListener; import org.linphone.core.tools.Log; import org.linphone.utils.LinphoneUtils; class Recording implements PlayerListener, Comparable { public static final Pattern RECORD_PATTERN = Pattern.compile(".*/(.*)_(\\d{2}-\\d{2}-\\d{4}-\\d{2}-\\d{2}-\\d{2})\\..*"); private final String mRecordPath; private String mName; private Date mRecordDate; private final Player mPlayer; private RecordingListener mListener; private Runnable mUpdateCurrentPositionTimer; @SuppressLint("SimpleDateFormat") public Recording(Context context, String recordPath) { this.mRecordPath = recordPath; Matcher m = RECORD_PATTERN.matcher(recordPath); if (m.matches()) { mName = m.group(1); try { mRecordDate = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss").parse(m.group(2)); } catch (ParseException e) { Log.e(e); } } mUpdateCurrentPositionTimer = new Runnable() { @Override public void run() { if (mListener != null) mListener.currentPositionChanged(getCurrentPosition()); if (isPlaying()) LinphoneUtils.dispatchOnUIThreadAfter(mUpdateCurrentPositionTimer, 20); } }; mPlayer = LinphoneManager.getCore().createLocalPlayer(null, null, null); mPlayer.addListener(this); } public String getRecordPath() { return mRecordPath; } public String getName() { return mName; } public Date getRecordDate() { return mRecordDate; } public boolean isClosed() { return mPlayer.getState() == Player.State.Closed; } public void play() { if (isClosed()) { mPlayer.open(mRecordPath); } mPlayer.start(); LinphoneUtils.dispatchOnUIThread(mUpdateCurrentPositionTimer); } public boolean isPlaying() { return mPlayer.getState() == Player.State.Playing; } public void pause() { if (!isClosed()) { mPlayer.pause(); } } public boolean isPaused() { return mPlayer.getState() == Player.State.Paused; } public void seek(int i) { if (!isClosed()) mPlayer.seek(i); } public int getCurrentPosition() { if (isClosed()) { mPlayer.open(mRecordPath); } return mPlayer.getCurrentPosition(); } public int getDuration() { if (isClosed()) { mPlayer.open(mRecordPath); } return mPlayer.getDuration(); } public void close() { mPlayer.removeListener(this); mPlayer.close(); } public void setRecordingListener(RecordingListener listener) { this.mListener = listener; } @Override public void onEofReached(Player player) { if (mListener != null) mListener.endOfRecordReached(); } @Override public boolean equals(Object o) { if (o instanceof Recording) { Recording r = (Recording) o; return mRecordPath.equals(r.getRecordPath()); } return false; } @Override public int compareTo(@NonNull Recording o) { return -mRecordDate.compareTo(o.getRecordDate()); } }