Skip to content

Commit

Permalink
Merge pull request #120 from Dimowner/active_record_fixes
Browse files Browse the repository at this point in the history
Improved active record and recording record usage in main screen to prevent from sync issues.
  • Loading branch information
Dimowner authored Jun 2, 2024
2 parents 2bb62e0 + ec5fed4 commit ae64ebb
Show file tree
Hide file tree
Showing 10 changed files with 227 additions and 113 deletions.
16 changes: 14 additions & 2 deletions app/src/main/java/com/dimowner/audiorecorder/Injector.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import com.dimowner.audiorecorder.audio.recorder.ThreeGpRecorder;
import com.dimowner.audiorecorder.audio.recorder.RecorderContract;
import com.dimowner.audiorecorder.audio.recorder.WavRecorder;
import com.dimowner.audiorecorder.data.RecordDataSource;
import com.dimowner.audiorecorder.data.FileRepository;
import com.dimowner.audiorecorder.data.FileRepositoryImpl;
import com.dimowner.audiorecorder.data.Prefs;
Expand All @@ -62,6 +63,7 @@ public class Injector {
private BackgroundQueue copyTasks;

private MainContract.UserActionsListener mainPresenter;
private RecordDataSource recordDataSource;
private RecordsContract.UserActionsListener recordsPresenter;
private SettingsContract.UserActionsListener settingsPresenter;
private LostRecordsContract.UserActionsListener lostRecordsPresenter;
Expand Down Expand Up @@ -95,7 +97,7 @@ public LocalRepository provideLocalRepository(Context context) {

public AppRecorder provideAppRecorder(Context context) {
return AppRecorderImpl.getInstance(provideAudioRecorder(context), provideLocalRepository(context),
provideLoadingTasksQueue(), providePrefs(context));
provideLoadingTasksQueue(), provideRecordDataSource(context));
}

public AudioWaveformVisualization provideAudioWaveformVisualization() {
Expand Down Expand Up @@ -168,12 +170,22 @@ public RecorderContract.Recorder provideAudioRecorder(Context context) {
}
}

public RecordDataSource provideRecordDataSource(Context context) {
if (recordDataSource == null) {
recordDataSource = new RecordDataSource(
provideLocalRepository(context),
providePrefs(context)
);
}
return recordDataSource;
}

public MainContract.UserActionsListener provideMainPresenter(Context context) {
if (mainPresenter == null) {
mainPresenter = new MainPresenter(providePrefs(context), provideFileRepository(context),
provideLocalRepository(context), provideAudioPlayer(), provideAppRecorder(context),
provideRecordingTasksQueue(), provideLoadingTasksQueue(), provideProcessingTasksQueue(),
provideImportTasksQueue(), provideSettingsMapper(context));
provideImportTasksQueue(), provideSettingsMapper(context), provideRecordDataSource(context));
}
return mainPresenter;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import com.dimowner.audiorecorder.app.info.RecordInfo;
import com.dimowner.audiorecorder.audio.AudioDecoder;
import com.dimowner.audiorecorder.audio.recorder.RecorderContract;
import com.dimowner.audiorecorder.data.Prefs;
import com.dimowner.audiorecorder.data.RecordDataSource;
import com.dimowner.audiorecorder.data.database.LocalRepository;
import com.dimowner.audiorecorder.data.database.Record;
import com.dimowner.audiorecorder.exception.AppException;
Expand All @@ -48,9 +48,7 @@ public class AppRecorderImpl implements AppRecorder {
private final LocalRepository localRepository;
private final RecorderContract.RecorderCallback recorderCallback;
private final List<AppRecorderCallback> appCallbacks;
private final Prefs prefs;
private final IntArrayList recordingData;
// private long recordingDuration;
private final IntArrayList apmpPool;
private long durationMills = 0;
private long updateTime = 0;
Expand All @@ -59,24 +57,31 @@ public class AppRecorderImpl implements AppRecorder {

private volatile static AppRecorderImpl instance;

public static AppRecorderImpl getInstance(RecorderContract.Recorder recorder,
LocalRepository localRep, BackgroundQueue tasks, Prefs prefs) {
public static AppRecorderImpl getInstance(
RecorderContract.Recorder recorder,
LocalRepository localRep,
BackgroundQueue tasks,
RecordDataSource recordDataSource
) {
if (instance == null) {
synchronized (AppRecorderImpl.class) {
if (instance == null) {
instance = new AppRecorderImpl(recorder, localRep, tasks, prefs);
instance = new AppRecorderImpl(recorder, localRep, tasks, recordDataSource);
}
}
}
return instance;
}

private AppRecorderImpl(RecorderContract.Recorder recorder,
LocalRepository localRep, BackgroundQueue tasks, Prefs pr) {
private AppRecorderImpl(
RecorderContract.Recorder recorder,
LocalRepository localRep,
BackgroundQueue tasks,
RecordDataSource recordDataSource
) {
this.audioRecorder = recorder;
this.localRepository = localRep;
this.recordingsTasks = tasks;
this.prefs = pr;
this.appCallbacks = new ArrayList<>();
this.recordingData = new IntArrayList();
this.apmpPool = new IntArrayList();
Expand All @@ -85,7 +90,6 @@ private AppRecorderImpl(RecorderContract.Recorder recorder,

@Override
public void onStartRecord(File output) {
// recordingDuration = 0;
durationMills = 0;
scheduleRecordingTimeUpdate();
onRecordingStarted(output);
Expand Down Expand Up @@ -117,11 +121,10 @@ public void onStopRecord(final File output) {
if (duration <= 0) {
duration = durationMills;
}
// recordingDuration = 0;
durationMills = 0;

int[] waveForm = convertRecordingData(recordingData, (int) (duration / 1000000f));
final Record record = localRepository.getRecord((int) prefs.getActiveRecord());
final Record record = recordDataSource.getRecordingRecord();
if (record != null) {
final Record update = new Record(
record.getId(),
Expand Down Expand Up @@ -153,6 +156,7 @@ public void onStopRecord(final File output) {
AndroidUtils.runOnUIThread(() -> onRecordingStopped(output, record));
}
}
recordDataSource.setRecordingRecord(null);
} else {
AndroidUtils.runOnUIThread(() -> onRecordingError(new RecordingException()));
}
Expand Down Expand Up @@ -258,7 +262,6 @@ public IntArrayList getRecordingData() {

@Override
public long getRecordingDuration() {
// return recordingDuration;
return durationMills;
}

Expand Down Expand Up @@ -351,8 +354,6 @@ public void run() {
long curTime = System.currentTimeMillis();
durationMills += curTime - updateTime;
updateTime = curTime;

// recordingDuration += VISUALIZATION_INTERVAL2;
}
}, 0, PLAYBACK_VISUALIZATION_INTERVAL);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import com.dimowner.audiorecorder.audio.recorder.RecorderContract;
import com.dimowner.audiorecorder.data.FileRepository;
import com.dimowner.audiorecorder.data.Prefs;
import com.dimowner.audiorecorder.data.RecordDataSource;
import com.dimowner.audiorecorder.data.database.LocalRepository;
import com.dimowner.audiorecorder.data.database.Record;
import com.dimowner.audiorecorder.exception.AppException;
Expand Down Expand Up @@ -89,6 +90,7 @@ public class RecordingService extends Service {
private BackgroundQueue recordingsTasks;
private LocalRepository localRepository;
private Prefs prefs;
private RecordDataSource recordDataSource;
private RecorderContract.Recorder recorder;
private AppRecorderCallback appRecorderCallback;
private ColorMap colorMap;
Expand All @@ -106,13 +108,13 @@ public IBinder onBind(Intent intent) {
@Override
public void onCreate() {
super.onCreate();
getApplicationContext();
appRecorder = ARApplication.getInjector().provideAppRecorder(getApplicationContext());
audioPlayer = ARApplication.getInjector().provideAudioPlayer();
recordingsTasks = ARApplication.getInjector().provideRecordingTasksQueue();
localRepository = ARApplication.getInjector().provideLocalRepository(getApplicationContext());
prefs = ARApplication.getInjector().providePrefs(getApplicationContext());
recorder = ARApplication.getInjector().provideAudioRecorder(getApplicationContext());
recordDataSource = ARApplication.getInjector().provideRecordDataSource(getApplicationContext());

colorMap = ARApplication.getInjector().provideColorMap(getApplicationContext());
fileRepository = ARApplication.getInjector().provideFileRepository(getApplicationContext());
Expand Down Expand Up @@ -427,14 +429,16 @@ private void startRecording(String path) {
try {
Record record = localRepository.insertEmptyFile(path);
prefs.setActiveRecord(record.getId());
recordDataSource.setRecordingRecord(record);
AndroidUtils.runOnUIThread(() -> appRecorder.startRecording(
path,
prefs.getSettingChannelCount(),
prefs.getSettingSampleRate(),
prefs.getSettingBitrate()
));
} catch (IOException | OutOfMemoryError | IllegalStateException e) {
} catch (IOException | OutOfMemoryError | IllegalStateException | NullPointerException e) {
Timber.e(e);
showError(R.string.error_failed_to_start_recording);
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,17 +304,7 @@ protected void onDestroy() {
public void onClick(View view) {
int id = view.getId();
if (id == R.id.btn_play) {
String path = presenter.getActiveRecordPath();
//This method Starts or Pause playback.
if (FileUtil.isFileInExternalStorage(getApplicationContext(), path)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
AndroidUtils.showRecordFileNotAvailable(this, path);
} else if (checkStoragePermissionPlayback()) {
presenter.startPlayback();
}
} else {
presenter.startPlayback();
}
presenter.onPlaybackClick(getApplicationContext(), checkStoragePermissionPlayback());
} else if (id == R.id.btn_record) {
if (checkRecordPermission2()) {
if (checkStoragePermission2()) {
Expand Down Expand Up @@ -699,6 +689,11 @@ public void showMigratePublicStorageWarning() {
);
}

@Override
public void showRecordFileNotAvailable(String path) {
AndroidUtils.showRecordFileNotAvailable(this, path);
}

@Override
public void onPlayProgress(final long mills, int percent) {
playProgress.setProgress(percent);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ interface View extends Contract.View {
void downloadRecord(Record record);

void showMigratePublicStorageWarning();

void showRecordFileNotAvailable(String path);
}

interface UserActionsListener extends Contract.UserActionsListener<MainContract.View> {
Expand All @@ -96,6 +98,7 @@ interface UserActionsListener extends Contract.UserActionsListener<MainContract.
void stopRecording();

void startPlayback();
void onPlaybackClick(Context context, boolean isStorageAvailable);
void seekPlayback(long mills);
void stopPlayback();

Expand Down Expand Up @@ -128,8 +131,6 @@ interface UserActionsListener extends Contract.UserActionsListener<MainContract.
//TODO: Remove this getters
boolean isStorePublic();

String getActiveRecordPath();

void deleteActiveRecord();

void onRecordInfo();
Expand Down
Loading

0 comments on commit ae64ebb

Please sign in to comment.