/*
* 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.Manifest;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.linphone.LinphoneManager;
import org.linphone.R;
import org.linphone.activities.MainActivity;
import org.linphone.call.views.LinphoneLinearLayoutManager;
import org.linphone.utils.FileUtils;
import org.linphone.utils.SelectableHelper;
public class RecordingsActivity extends MainActivity
implements SelectableHelper.DeleteListener, RecordingViewHolder.ClickListener {
private RecyclerView mRecordingList;
private List mRecordings;
private TextView mNoRecordings;
private RecordingsAdapter mRecordingsAdapter;
private SelectableHelper mSelectableHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOnBackPressGoHome = false;
mAlwaysHideTabBar = true;
// Uses the fragment container layout to inflate the about view instead of using a fragment
View recordingsView =
LayoutInflater.from(this).inflate(R.layout.recordings_list, null, false);
LinearLayout fragmentContainer = findViewById(R.id.fragmentContainer);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
fragmentContainer.addView(recordingsView, params);
if (isTablet()) {
findViewById(R.id.fragmentContainer2).setVisibility(View.GONE);
}
ImageView backButton = findViewById(R.id.back);
backButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
goBack();
}
});
mSelectableHelper = new SelectableHelper(findViewById(R.id.root_layout), this);
mRecordingList = findViewById(R.id.recording_list);
mNoRecordings = findViewById(R.id.no_recordings);
LinearLayoutManager mLayoutManager = new LinphoneLinearLayoutManager(this);
mRecordingList.setLayoutManager(mLayoutManager);
// Divider between items
DividerItemDecoration dividerItemDecoration =
new DividerItemDecoration(this, mLayoutManager.getOrientation());
dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.divider));
mRecordingList.addItemDecoration(dividerItemDecoration);
mRecordings = new ArrayList<>();
mPermissionsToHave =
new String[] {
Manifest.permission.READ_EXTERNAL_STORAGE,
};
}
@Override
protected void onResume() {
super.onResume();
hideTopBar();
hideTabBar();
LinphoneManager.getAudioManager().setAudioManagerModeNormal();
LinphoneManager.getAudioManager().routeAudioToSpeaker();
removeDeletedRecordings();
searchForRecordings();
hideRecordingListAndDisplayMessageIfEmpty();
mRecordingsAdapter = new RecordingsAdapter(this, mRecordings, this, mSelectableHelper);
mRecordingList.setAdapter(mRecordingsAdapter);
mSelectableHelper.setAdapter(mRecordingsAdapter);
mSelectableHelper.setDialogMessage(R.string.recordings_delete_dialog);
}
@Override
protected void onPause() {
super.onPause();
LinphoneManager.getAudioManager().routeAudioToEarPiece();
// Close all opened mRecordings
for (Recording r : mRecordings) {
if (!r.isClosed()) {
if (r.isPlaying()) r.pause();
r.close();
}
}
}
@Override
protected void onDestroy() {
mRecordingList = null;
mRecordings = null;
mNoRecordings = null;
mRecordingsAdapter = null;
mSelectableHelper = null;
super.onDestroy();
}
@Override
public void onDeleteSelection(Object[] objectsToDelete) {
int size = mRecordingsAdapter.getSelectedItemCount();
for (int i = 0; i < size; i++) {
Recording record = (Recording) objectsToDelete[i];
if (record.isPlaying()) record.pause();
record.close();
File recordingFile = new File(record.getRecordPath());
if (recordingFile.delete()) {
mRecordings.remove(record);
}
}
hideRecordingListAndDisplayMessageIfEmpty();
}
@Override
public void onItemClicked(int position) {
if (mRecordingsAdapter.isEditionEnabled()) {
mRecordingsAdapter.toggleSelection(position);
}
}
@Override
public boolean onItemLongClicked(int position) {
if (!mRecordingsAdapter.isEditionEnabled()) {
mSelectableHelper.enterEditionMode();
}
mRecordingsAdapter.toggleSelection(position);
return true;
}
private void hideRecordingListAndDisplayMessageIfEmpty() {
if (mRecordings == null || mRecordings.isEmpty()) {
mNoRecordings.setVisibility(View.VISIBLE);
mRecordingList.setVisibility(View.GONE);
} else {
mNoRecordings.setVisibility(View.GONE);
mRecordingList.setVisibility(View.VISIBLE);
}
}
private void removeDeletedRecordings() {
String recordingsDirectory = FileUtils.getRecordingsDirectory(this);
File directory = new File(recordingsDirectory);
if (directory.exists() && directory.isDirectory()) {
File[] existingRecordings = directory.listFiles();
for (Recording r : mRecordings) {
boolean exists = false;
for (File f : existingRecordings) {
if (f.getPath().equals(r.getRecordPath())) {
exists = true;
break;
}
}
if (!exists) mRecordings.remove(r);
}
Collections.sort(mRecordings);
}
hideRecordingListAndDisplayMessageIfEmpty();
}
private void searchForRecordings() {
String recordingsDirectory = FileUtils.getRecordingsDirectory(this);
File directory = new File(recordingsDirectory);
if (directory.exists() && directory.isDirectory()) {
File[] existingRecordings = directory.listFiles();
if (existingRecordings == null) return;
for (File f : existingRecordings) {
boolean exists = false;
for (Recording r : mRecordings) {
if (r.getRecordPath().equals(f.getPath())) {
exists = true;
break;
}
}
if (!exists) {
if (Recording.RECORD_PATTERN.matcher(f.getPath()).matches()) {
mRecordings.add(new Recording(this, f.getPath()));
}
}
}
Collections.sort(mRecordings);
}
}
}