/* * 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); } } }