diff --git a/app/build.gradle b/app/build.gradle index 6ee9832..cffac3d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.github.axet.audiorecorder" minSdkVersion 9 targetSdkVersion 23 - versionCode 147 - versionName "1.5.17" + versionCode 148 + versionName "1.6.0" } signingConfigs { release { @@ -43,5 +43,5 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' - compile 'com.github.axet:android-audio-library:0.0.48' // compile project(':android-audio-library') + compile 'com.github.axet:android-audio-library:0.0.51' // compile project(':android-audio-library') } diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java index 6c65cff..7188204 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java +++ b/app/src/main/java/com/github/axet/audiorecorder/activities/MainActivity.java @@ -1,7 +1,9 @@ package com.github.axet.audiorecorder.activities; import android.Manifest; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; @@ -95,7 +97,11 @@ public class MainActivity extends AppCompatActivity { list.setEmptyView(findViewById(R.id.empty_list)); if (Storage.permitted(MainActivity.this, PERMISSIONS, 1)) { - storage.migrateLocalStorage(); + try { + storage.migrateLocalStorage(); + } catch (RuntimeException e) { + Error(e); + } } } @@ -106,12 +112,25 @@ public class MainActivity extends AppCompatActivity { } } + Intent showIntent() { + Uri selectedUri = Uri.fromFile(storage.getStoragePath()); + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(selectedUri, "resource/folder"); + return intent; + } + @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu_main, menu); + MenuItem item = menu.findItem(R.id.action_show_folder); + Intent intent = showIntent(); + if (intent.resolveActivityInfo(getPackageManager(), 0) == null) { + item.setVisible(false); + } + return true; } @@ -129,9 +148,7 @@ public class MainActivity extends AppCompatActivity { } if (id == R.id.action_show_folder) { - Uri selectedUri = Uri.fromFile(storage.getStoragePath()); - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(selectedUri, "resource/folder"); + Intent intent = showIntent(); if (intent.resolveActivityInfo(getPackageManager(), 0) != null) { startActivity(intent); } else { @@ -207,7 +224,11 @@ public class MainActivity extends AppCompatActivity { switch (requestCode) { case 1: if (Storage.permitted(MainActivity.this, permissions)) { - storage.migrateLocalStorage(); + try { + storage.migrateLocalStorage(); + } catch (RuntimeException e) { + Error(e); + } recordings.load(null); checkPending(); } else { @@ -246,4 +267,33 @@ public class MainActivity extends AppCompatActivity { TextView text = (TextView) findViewById(R.id.space_left); text.setText(((MainApplication) getApplication()).formatFree(free, sec)); } + + + public void Error(Throwable e) { + String msg = e.getMessage(); + if (msg == null || msg.isEmpty()) { + Throwable t = e; + while (t.getCause() != null) + t = t.getCause(); + msg = t.getClass().getSimpleName(); + } + Error(msg); + } + + public void Error(String msg) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Error"); + builder.setMessage(msg); + builder.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + } + }); + builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + builder.show(); + } } diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java index f7f61db..3750b97 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java +++ b/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java @@ -37,7 +37,6 @@ import com.github.axet.androidlibrary.animations.MarginBottomAnimation; import com.github.axet.androidlibrary.sound.AudioTrack; import com.github.axet.audiolibrary.app.RawSamples; import com.github.axet.audiolibrary.app.Sound; -import com.github.axet.audiolibrary.app.Storage; import com.github.axet.audiolibrary.encoders.Encoder; import com.github.axet.audiolibrary.encoders.EncoderInfo; import com.github.axet.audiolibrary.encoders.Factory; @@ -45,6 +44,7 @@ import com.github.axet.audiolibrary.encoders.FileEncoder; import com.github.axet.audiolibrary.widgets.PitchView; import com.github.axet.audiorecorder.R; import com.github.axet.audiorecorder.app.MainApplication; +import com.github.axet.audiorecorder.app.Storage; import com.github.axet.audiorecorder.services.RecordingService; import java.io.File; @@ -180,7 +180,7 @@ public class RecordingActivity extends AppCompatActivity { } sampleRate = Integer.parseInt(shared.getString(MainApplication.PREFERENCE_RATE, "")); - sampleRate = Sound.getValidRecordRate(MainApplication.getMode(this), sampleRate); + sampleRate = Sound.getValidRecordRate(MainApplication.getInMode(this), sampleRate); samplesUpdate = (int) (pitch.getPitchTime() * sampleRate / 1000.0); updateBufferSize(false); @@ -443,7 +443,7 @@ public class RecordingActivity extends AppCompatActivity { int playUpdate = PitchView.UPDATE_SPEED * sampleRate / 1000; RawSamples rs = new RawSamples(storage.getTempRecording()); - int len = (int) (rs.getSamples() - editSample); + int len = (int) (rs.getSamples() - editSample); // in samples final AudioTrack.OnPlaybackPositionUpdateListener listener = new AudioTrack.OnPlaybackPositionUpdateListener() { @Override @@ -461,10 +461,12 @@ public class RecordingActivity extends AppCompatActivity { } }; - short[] buf = new short[len]; - rs.open(editSample, buf.length); - int r = rs.read(buf); - play = sound.generateTrack(sampleRate, buf, r); + AudioTrack.AudioBuffer buffer = new AudioTrack.AudioBuffer(sampleRate, MainApplication.getOutMode(this), Sound.AUDIO_FORMAT, len); + rs.open(editSample, len); // len in samples + int r = rs.read(buffer.buffer); // r in samples + if (r != buffer.len) + throw new RuntimeException("unable to read data"); + play = sound.generateTrack(buffer); play.setPositionNotificationPeriod(playUpdate); play.setPlaybackPositionUpdateListener(listener, handler); play.play(); @@ -589,12 +591,12 @@ public class RecordingActivity extends AppCompatActivity { rs.open(samplesTime); - int min = AudioRecord.getMinBufferSize(sampleRate, MainApplication.getMode(RecordingActivity.this), Sound.AUDIO_FORMAT); + int min = AudioRecord.getMinBufferSize(sampleRate, MainApplication.getInMode(RecordingActivity.this), Sound.AUDIO_FORMAT); if (min <= 0) { throw new RuntimeException("Unable to initialize AudioRecord: Bad audio values"); } - recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, MainApplication.getMode(RecordingActivity.this), Sound.AUDIO_FORMAT, min * 2); + recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, MainApplication.getInMode(RecordingActivity.this), Sound.AUDIO_FORMAT, min * 2); if (recorder.getState() != AudioRecord.STATE_INITIALIZED) { throw new RuntimeException("Unable to initialize AudioRecord"); } diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java index 87e8f61..97c524d 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java +++ b/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java @@ -142,6 +142,7 @@ public class SettingsActivity extends AppCompatActivity implements SharedPrefere bindPreferenceSummaryToValue(pm.findPreference(MainApplication.PREFERENCE_RATE)); bindPreferenceSummaryToValue(pm.findPreference(MainApplication.PREFERENCE_THEME)); bindPreferenceSummaryToValue(pm.findPreference(MainApplication.PREFERENCE_CHANNELS)); + bindPreferenceSummaryToValue(pm.findPreference(MainApplication.PREFERENCE_FORMAT)); } public static int getAppTheme(Context context) { diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java b/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java new file mode 100644 index 0000000..f9ece44 --- /dev/null +++ b/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java @@ -0,0 +1,40 @@ +package com.github.axet.audiorecorder.app; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Storage extends com.github.axet.audiolibrary.app.Storage { + + public Storage(Context context) { + super(context); + } + + @Override + public File getNewFile() { + + SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); + String ext = shared.getString(MainApplication.PREFERENCE_ENCODING, ""); + + String format = "%s"; + + format = shared.getString(MainApplication.PREFERENCE_FORMAT, format); + + format = format.replaceAll("%s", SIMPLE.format(new Date())); + format = format.replaceAll("%I", ISO8601.format(new Date())); + format = format.replaceAll("%T", "" + System.currentTimeMillis() / 1000); + + File parent = getStoragePath(); + if (!parent.exists()) { + if (!parent.mkdirs()) + throw new RuntimeException("Unable to create: " + parent); + } + + return getNextFile(parent, format, ext); + } + +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8017c1f..1449735 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -41,6 +41,18 @@ 2 + + 2017-02-01 09.08.01.wav + 1487926249.wav + 20170528T043902.wav + + + + %s + %T + %I + + Settings Not permitted No folder view application installed diff --git a/app/src/main/res/xml-de/pref_general.xml b/app/src/main/res/xml-de/pref_general.xml index 23b8027..a2b6ac3 100644 --- a/app/src/main/res/xml-de/pref_general.xml +++ b/app/src/main/res/xml-de/pref_general.xml @@ -36,6 +36,16 @@ android:summary="Aufnahmekanäle" android:title="Mono/Stereo" /> + + + + + + + +