From ff25c9a29408e7d2af12c4e2c101c34ee38b21a8 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Sun, 19 Feb 2017 16:53:09 +0300 Subject: [PATCH 01/12] clean ups --- .../com/github/axet/audiorecorder/encoders/FileEncoder.java | 1 - .../java/com/github/axet/audiorecorder/encoders/FormatMKA.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java b/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java index 8002f65..31014cb 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java +++ b/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java @@ -25,7 +25,6 @@ public class FileEncoder { this.context = context; this.in = in; this.encoder = encoder; - handler = new Handler(); } diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatMKA.java b/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatMKA.java index e3972aa..226b32b 100755 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatMKA.java +++ b/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatMKA.java @@ -35,7 +35,7 @@ public class FormatMKA implements Encoder { format.setString(MediaFormat.KEY_MIME, Factory.MP4A); format.setInteger(MediaFormat.KEY_SAMPLE_RATE, info.sampleRate); format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, info.channels); - format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024); + format.setInteger(MediaFormat.KEY_BIT_RATE, 64000); format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE); format.setInteger(KEY_AAC_SBR_MODE, 0); create(info, format, out); From 5da130e11be09b4babdc0f6c248dc7402e6cd62b Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 23 Feb 2017 20:02:50 +0300 Subject: [PATCH 02/12] fix order --- app/build.gradle | 8 ++++---- app/src/main/AndroidManifest.xml | 2 +- app/src/main/res/menu/menu_main.xml | 10 +++++----- app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a5a8383..d644e64 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,12 +43,12 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:25.1.1' - compile 'com.android.support:support-v4:25.1.1' - compile 'com.android.support:design:25.1.1' + compile 'com.android.support:appcompat-v7:25.2.0' + compile 'com.android.support:support-v4:25.2.0' + compile 'com.android.support:design:25.2.0' compile 'com.google.android.gms:play-services-appindexing:9.8.0' compile 'org.apache.commons:commons-math3:3.6.1' - compile 'com.github.axet:android-library:1.9.7' //compile project(':android-library') + compile 'com.github.axet:android-library:1.9.9' //compile project(':android-library') compile 'com.github.axet:jebml:0.0.2' // compile project(':jebml') compile 'com.github.axet:vorbis:1.0.0' // compile project(':vorbis') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0af67e5..50bf023 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,7 @@ diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index e4cb74b..78cc22b 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -2,14 +2,14 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".activities.MainActivity"> - + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ca3a019..379a7d2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -25,7 +25,6 @@ Стерео - Аудио Рекордер Настройки Доступ запрещен Программа для просмотра папок не установлена diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cd7f48f..eb7e5e8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,7 +49,6 @@ 2 - Audio Recorder Settings Not permitted No folder view application installed From aabff79a1e71542d48617d736917ebe62245fddc Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 23 Feb 2017 23:21:06 +0300 Subject: [PATCH 03/12] fix order --- .../axet/audiorecorder/activities/MainActivity.java | 10 +++++----- .../audiorecorder/activities/RecordingActivity.java | 4 ++-- .../github/axet/audiorecorder/app/MainApplication.java | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) 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 2d52f5c..b21c602 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 @@ -36,7 +36,7 @@ import android.widget.TextView; import android.widget.Toast; import com.github.axet.androidlibrary.animations.RemoveItemAnimation; -import com.github.axet.androidlibrary.app.LibraryApplication; +import com.github.axet.androidlibrary.app.MainLibrary; import com.github.axet.androidlibrary.widgets.OpenFileDialog; import com.github.axet.androidlibrary.widgets.PopupShareActionProvider; import com.github.axet.audiorecorder.R; @@ -180,10 +180,10 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr time.setText(s.format(new Date(f.lastModified()))); TextView dur = (TextView) convertView.findViewById(R.id.recording_duration); - dur.setText(LibraryApplication.formatDuration(getContext(), durations.get(f))); + dur.setText(MainLibrary.formatDuration(getContext(), durations.get(f))); TextView size = (TextView) convertView.findViewById(R.id.recording_size); - size.setText(LibraryApplication.formatSize(getContext(), f.length())); + size.setText(MainLibrary.formatSize(getContext(), f.length())); final View playerBase = convertView.findViewById(R.id.recording_player); playerBase.setOnClickListener(new View.OnClickListener() { @@ -448,11 +448,11 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr } }); - start.setText(LibraryApplication.formatDuration(getContext(), c)); + start.setText(MainLibrary.formatDuration(getContext(), c)); bar.setMax(d); bar.setKeyProgressIncrement(1); bar.setProgress(c); - end.setText("-" + LibraryApplication.formatDuration(getContext(), d - c)); + end.setText("-" + MainLibrary.formatDuration(getContext(), d - c)); return playing; } 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 cadd0a3..34abcf3 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 @@ -35,7 +35,7 @@ import android.widget.TextView; import android.widget.Toast; import com.github.axet.androidlibrary.animations.MarginBottomAnimation; -import com.github.axet.androidlibrary.app.LibraryApplication; +import com.github.axet.androidlibrary.app.MainLibrary; import com.github.axet.audiorecorder.R; import com.github.axet.audiorecorder.app.MainApplication; import com.github.axet.audiorecorder.app.RawSamples; @@ -717,7 +717,7 @@ public class RecordingActivity extends AppCompatActivity { void updateSamples(long samplesTime) { long ms = samplesTime / sampleRate * 1000; - time.setText(LibraryApplication.formatDuration(this, ms)); + time.setText(MainLibrary.formatDuration(this, ms)); } @Override diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java b/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java index 0a04cad..8d6fdbe 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java +++ b/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java @@ -6,7 +6,7 @@ import android.content.SharedPreferences; import android.media.AudioFormat; import android.preference.PreferenceManager; -import com.github.axet.androidlibrary.app.LibraryApplication; +import com.github.axet.androidlibrary.app.MainLibrary; import com.github.axet.androidlibrary.widgets.ThemeUtils; import com.github.axet.audiorecorder.R; @@ -70,7 +70,7 @@ public class MainApplication extends Application { str = getResources().getQuantityString(R.plurals.seconds, diffSeconds, diffSeconds); } - return getString(R.string.title_header, LibraryApplication.formatSize(this, free), str); + return getString(R.string.title_header, MainLibrary.formatSize(this, free), str); } public static int getChannels(Context context) { From ba01f8003d121701008ab6aaa9f7cd7664f1400d Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 24 Feb 2017 10:37:32 +0300 Subject: [PATCH 04/12] split main src and lib --- android-audio-library/.gitignore | 1 + android-audio-library/build.gradle | 38 ++ android-audio-library/proguard-rules.pro | 17 + .../audiolibrary/ExampleInstrumentedTest.java | 26 + .../src/main/AndroidManifest.xml | 9 + .../animations/RecordingAnimation.java | 5 +- .../audiolibrary/app/MainApplication.java | 83 ++++ .../axet/audiolibrary}/app/RawSamples.java | 4 +- .../axet/audiolibrary/app/Recordings.java | 447 +++++++++++++++++ .../github/axet/audiolibrary}/app/Sound.java | 5 +- .../axet/audiolibrary}/app/Storage.java | 5 +- .../axet/audiolibrary}/encoders/Encoder.java | 2 +- .../audiolibrary}/encoders/EncoderInfo.java | 2 +- .../axet/audiolibrary}/encoders/Factory.java | 6 +- .../audiolibrary}/encoders/FileEncoder.java | 4 +- .../audiolibrary}/encoders/Format3GP.java | 3 +- .../audiolibrary}/encoders/FormatM4A.java | 2 +- .../audiolibrary}/encoders/FormatMKA.java | 2 +- .../audiolibrary}/encoders/FormatOGG.java | 2 +- .../audiolibrary}/encoders/FormatWAV.java | 4 +- .../axet/audiolibrary}/encoders/MuxerMP4.java | 2 +- .../audiolibrary}/widgets/FFTBarView.java | 8 +- .../audiolibrary}/widgets/FFTChartView.java | 10 +- .../axet/audiolibrary}/widgets/FFTView.java | 4 +- .../axet/audiolibrary}/widgets/PitchView.java | 7 +- .../ic_create_black_24dp.xml | 0 .../res/drawable-xxxhdpi}/ic_mic_24dp.xml | 0 .../res/drawable-xxxhdpi}/ic_pause_24dp.xml | 0 .../drawable-xxxhdpi}/round_button_dark.xml | 0 .../drawable-xxxhdpi}/round_button_light.xml | 0 .../res/drawable/ic_delete_black_24dp.xml | 9 + .../main/res/drawable/ic_pause_black_24dp.xml | 9 + .../res/drawable/ic_play_arrow_black_24dp.xml | 9 + .../main/res/drawable/ic_share_black_24dp.xml | 9 + .../res/layout/notifictaion_recording.xml | 2 +- .../layout/notifictaion_recording_dark.xml | 0 .../layout/notifictaion_recording_light.xml | 0 .../src/main/res/layout/recording.xml | 6 +- .../src/main/res/menu/menu_context.xml | 0 .../src/main/res/values-ru/strings.xml | 17 + .../src/main/res/values/attrs.xml | 6 + .../src/main/res/values/colors.xml | 8 + .../src/main/res/values/strings.xml | 23 + .../src/main/res/values/styles.xml | 48 ++ .../axet/audiolibrary/ExampleUnitTest.java | 17 + app/build.gradle | 7 +- .../axet/audiorecorder/ApplicationTest.java | 3 - .../activities/MainActivity.java | 454 +----------------- .../activities/RecordingActivity.java | 20 +- .../activities/SettingsActivity.java | 2 +- .../audiorecorder/app/MainApplication.java | 73 +-- .../services/RecordingService.java | 3 +- app/src/main/res/drawable-hdpi/pause.png | Bin 149 -> 0 bytes app/src/main/res/drawable-hdpi/share.png | Bin 441 -> 0 bytes app/src/main/res/drawable-hdpi/trash.png | Bin 513 -> 0 bytes app/src/main/res/drawable-mdpi/pause.png | Bin 127 -> 0 bytes app/src/main/res/drawable-mdpi/share.png | Bin 295 -> 0 bytes app/src/main/res/drawable-mdpi/trash.png | Bin 349 -> 0 bytes app/src/main/res/drawable-xhdpi/pause.png | Bin 164 -> 0 bytes app/src/main/res/drawable-xhdpi/share.png | Bin 552 -> 0 bytes app/src/main/res/drawable-xhdpi/trash.png | Bin 624 -> 0 bytes app/src/main/res/drawable-xxhdpi/pause.png | Bin 226 -> 0 bytes app/src/main/res/drawable-xxhdpi/share.png | Bin 893 -> 0 bytes app/src/main/res/drawable-xxhdpi/trash.png | Bin 976 -> 0 bytes app/src/main/res/drawable-xxxhdpi/play.png | Bin 1227 -> 0 bytes .../main/res/layout/activity_recording.xml | 4 +- app/src/main/res/values-ru/strings.xml | 15 - app/src/main/res/values/attrs.xml | 3 - app/src/main/res/values/colors.xml | 5 - app/src/main/res/values/strings.xml | 19 - app/src/main/res/values/styles.xml | 46 -- settings.gradle | 2 +- 72 files changed, 835 insertions(+), 682 deletions(-) create mode 100644 android-audio-library/.gitignore create mode 100644 android-audio-library/build.gradle create mode 100644 android-audio-library/proguard-rules.pro create mode 100644 android-audio-library/src/androidTest/java/com/github/axet/audiolibrary/ExampleInstrumentedTest.java create mode 100644 android-audio-library/src/main/AndroidManifest.xml rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/animations/RecordingAnimation.java (96%) create mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/app/RawSamples.java (97%) create mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/app/Sound.java (94%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/app/Storage.java (98%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/Encoder.java (64%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/EncoderInfo.java (84%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/Factory.java (95%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/FileEncoder.java (95%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/Format3GP.java (90%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/FormatM4A.java (91%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/FormatMKA.java (96%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/FormatOGG.java (91%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/FormatWAV.java (94%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/encoders/MuxerMP4.java (96%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/widgets/FFTBarView.java (91%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/widgets/FFTChartView.java (88%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/widgets/FFTView.java (97%) rename {app/src/main/java/com/github/axet/audiorecorder => android-audio-library/src/main/java/com/github/axet/audiolibrary}/widgets/PitchView.java (99%) rename {app/src/main/res/drawable => android-audio-library/src/main/res/drawable-xxxhdpi}/ic_create_black_24dp.xml (100%) rename {app/src/main/res/drawable => android-audio-library/src/main/res/drawable-xxxhdpi}/ic_mic_24dp.xml (100%) rename {app/src/main/res/drawable => android-audio-library/src/main/res/drawable-xxxhdpi}/ic_pause_24dp.xml (100%) rename {app/src/main/res/drawable => android-audio-library/src/main/res/drawable-xxxhdpi}/round_button_dark.xml (100%) rename {app/src/main/res/drawable => android-audio-library/src/main/res/drawable-xxxhdpi}/round_button_light.xml (100%) create mode 100644 android-audio-library/src/main/res/drawable/ic_delete_black_24dp.xml create mode 100644 android-audio-library/src/main/res/drawable/ic_pause_black_24dp.xml create mode 100644 android-audio-library/src/main/res/drawable/ic_play_arrow_black_24dp.xml create mode 100644 android-audio-library/src/main/res/drawable/ic_share_black_24dp.xml rename {app => android-audio-library}/src/main/res/layout/notifictaion_recording.xml (97%) rename {app => android-audio-library}/src/main/res/layout/notifictaion_recording_dark.xml (100%) rename {app => android-audio-library}/src/main/res/layout/notifictaion_recording_light.xml (100%) rename {app => android-audio-library}/src/main/res/layout/recording.xml (96%) rename {app => android-audio-library}/src/main/res/menu/menu_context.xml (100%) create mode 100644 android-audio-library/src/main/res/values-ru/strings.xml create mode 100644 android-audio-library/src/main/res/values/attrs.xml create mode 100644 android-audio-library/src/main/res/values/colors.xml create mode 100644 android-audio-library/src/main/res/values/strings.xml create mode 100644 android-audio-library/src/main/res/values/styles.xml create mode 100644 android-audio-library/src/test/java/com/github/axet/audiolibrary/ExampleUnitTest.java delete mode 100644 app/src/main/res/drawable-hdpi/pause.png delete mode 100644 app/src/main/res/drawable-hdpi/share.png delete mode 100644 app/src/main/res/drawable-hdpi/trash.png delete mode 100644 app/src/main/res/drawable-mdpi/pause.png delete mode 100644 app/src/main/res/drawable-mdpi/share.png delete mode 100644 app/src/main/res/drawable-mdpi/trash.png delete mode 100644 app/src/main/res/drawable-xhdpi/pause.png delete mode 100644 app/src/main/res/drawable-xhdpi/share.png delete mode 100644 app/src/main/res/drawable-xhdpi/trash.png delete mode 100644 app/src/main/res/drawable-xxhdpi/pause.png delete mode 100644 app/src/main/res/drawable-xxhdpi/share.png delete mode 100644 app/src/main/res/drawable-xxhdpi/trash.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/play.png diff --git a/android-audio-library/.gitignore b/android-audio-library/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/android-audio-library/.gitignore @@ -0,0 +1 @@ +/build diff --git a/android-audio-library/build.gradle b/android-audio-library/build.gradle new file mode 100644 index 0000000..23c150a --- /dev/null +++ b/android-audio-library/build.gradle @@ -0,0 +1,38 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.2" + + defaultConfig { + minSdkVersion 9 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:design:25.2.0' + compile 'com.android.support:appcompat-v7:25.2.0' + compile 'com.google.android.gms:play-services-appindexing:9.8.0' + compile 'org.apache.commons:commons-math3:3.6.1' + compile 'com.github.axet:android-library:1.9.9' //compile project(':android-library') + compile 'com.github.axet:jebml:0.0.2' // compile project(':jebml') + compile 'com.github.axet:vorbis:1.0.0' // compile project(':vorbis') + testCompile 'junit:junit:4.12' + compile project(path: ':android-library') +} diff --git a/android-audio-library/proguard-rules.pro b/android-audio-library/proguard-rules.pro new file mode 100644 index 0000000..f45cfad --- /dev/null +++ b/android-audio-library/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/axet/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/android-audio-library/src/androidTest/java/com/github/axet/audiolibrary/ExampleInstrumentedTest.java b/android-audio-library/src/androidTest/java/com/github/axet/audiolibrary/ExampleInstrumentedTest.java new file mode 100644 index 0000000..886cace --- /dev/null +++ b/android-audio-library/src/androidTest/java/com/github/axet/audiolibrary/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.github.axet.audiolibrary; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.github.axet.audiolibrary.test", appContext.getPackageName()); + } +} diff --git a/android-audio-library/src/main/AndroidManifest.xml b/android-audio-library/src/main/AndroidManifest.xml new file mode 100644 index 0000000..dbe8071 --- /dev/null +++ b/android-audio-library/src/main/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app/src/main/java/com/github/axet/audiorecorder/animations/RecordingAnimation.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/animations/RecordingAnimation.java similarity index 96% rename from app/src/main/java/com/github/axet/audiorecorder/animations/RecordingAnimation.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/animations/RecordingAnimation.java index eb13e12..d7d8f93 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/animations/RecordingAnimation.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/animations/RecordingAnimation.java @@ -1,15 +1,14 @@ -package com.github.axet.audiorecorder.animations; +package com.github.axet.audiolibrary.animations; import android.annotation.TargetApi; import android.os.Build; import android.os.Handler; -import android.util.Log; import android.view.View; import android.view.animation.Transformation; import android.widget.ListView; import com.github.axet.androidlibrary.animations.MarginAnimation; -import com.github.axet.audiorecorder.R; +import com.github.axet.audiolibrary.R; public class RecordingAnimation extends MarginAnimation { ListView list; diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java new file mode 100644 index 0000000..b5494f8 --- /dev/null +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java @@ -0,0 +1,83 @@ +package com.github.axet.audiolibrary.app; + +import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; +import android.media.AudioFormat; +import android.preference.PreferenceManager; + +import com.github.axet.androidlibrary.app.MainLibrary; +import com.github.axet.audiolibrary.R; + +public class MainApplication extends Application { + public static final String PREFERENCE_STORAGE = "storage_path"; + public static final String PREFERENCE_RATE = "sample_rate"; + public static final String PREFERENCE_CALL = "call"; + public static final String PREFERENCE_SILENT = "silence"; + public static final String PREFERENCE_ENCODING = "encoding"; + public static final String PREFERENCE_LAST = "last_recording"; + public static final String PREFERENCE_THEME = "theme"; + public static final String PREFERENCE_CHANNELS = "channels"; + + + @Override + public void onCreate() { + super.onCreate(); + Context context = this; + context.setTheme(getUserTheme()); + } + + public int getUserTheme() { + return getTheme(this, R.style.AppThemeLight, R.style.AppThemeDark); + } + + public static int getTheme(Context context, int light, int dark) { + final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); + String theme = shared.getString(PREFERENCE_THEME, ""); + if (theme.equals("Theme_Dark")) { + return dark; + } else { + return light; + } + } + + public String formatFree(long free, long left) { + String str = ""; + + long diff = left; + + int diffSeconds = (int) (diff / 1000 % 60); + int diffMinutes = (int) (diff / (60 * 1000) % 60); + int diffHours = (int) (diff / (60 * 60 * 1000) % 24); + int diffDays = (int) (diff / (24 * 60 * 60 * 1000)); + + if (diffDays > 0) { + str = getResources().getQuantityString(R.plurals.days, diffDays, diffDays); + } else if (diffHours > 0) { + str = getResources().getQuantityString(R.plurals.hours, diffHours, diffHours); + } else if (diffMinutes > 0) { + str = getResources().getQuantityString(R.plurals.minutes, diffMinutes, diffMinutes); + } else if (diffSeconds > 0) { + str = getResources().getQuantityString(R.plurals.seconds, diffSeconds, diffSeconds); + } + + return getString(R.string.title_header, MainLibrary.formatSize(this, free), str); + } + + public static int getChannels(Context context) { + final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); + int i = Integer.parseInt(shared.getString(MainApplication.PREFERENCE_CHANNELS, "1")); + return i; + } + + public static int getMode(Context context) { + switch (getChannels(context)) { + case 1: + return AudioFormat.CHANNEL_IN_MONO; + case 2: + return AudioFormat.CHANNEL_IN_STEREO; + default: + throw new RuntimeException("unknown mode"); + } + } +} diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/RawSamples.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java similarity index 97% rename from app/src/main/java/com/github/axet/audiorecorder/app/RawSamples.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java index 8d6245a..bd565da 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/RawSamples.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java @@ -1,10 +1,8 @@ -package com.github.axet.audiorecorder.app; +package com.github.axet.audiolibrary.app; import android.media.AudioFormat; import android.util.Log; -import com.github.axet.audiorecorder.activities.RecordingActivity; - import org.apache.commons.math3.complex.Complex; import org.apache.commons.math3.transform.DftNormalization; import org.apache.commons.math3.transform.FastFourierTransformer; diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java new file mode 100644 index 0000000..c2dd900 --- /dev/null +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java @@ -0,0 +1,447 @@ +package com.github.axet.audiolibrary.app; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Handler; +import android.support.v7.app.AlertDialog; +import android.support.v7.widget.PopupMenu; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.Toast; + +import com.github.axet.androidlibrary.animations.RemoveItemAnimation; +import com.github.axet.androidlibrary.app.MainLibrary; +import com.github.axet.androidlibrary.widgets.OpenFileDialog; +import com.github.axet.androidlibrary.widgets.PopupShareActionProvider; +import com.github.axet.audiolibrary.R; +import com.github.axet.audiolibrary.animations.RecordingAnimation; +import com.github.axet.audiolibrary.encoders.Factory; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +public class Recordings extends ArrayAdapter implements AbsListView.OnScrollListener { + public static String TAG = Recordings.class.getSimpleName(); + + static final int TYPE_COLLAPSED = 0; + static final int TYPE_EXPANDED = 1; + static final int TYPE_DELETED = 2; + + public static class SortFiles implements Comparator { + @Override + public int compare(File file, File file2) { + if (file.isDirectory() && file2.isFile()) + return -1; + else if (file.isFile() && file2.isDirectory()) + return 1; + else + return file.getPath().compareTo(file2.getPath()); + } + } + + Handler handler; + Storage storage; + MediaPlayer player; + Runnable updatePlayer; + int selected = -1; + ListView list; + PopupShareActionProvider shareProvider; + int scrollState; + + Map durations = new TreeMap<>(); + + public Recordings(Context context, ListView list) { + super(context, 0); + this.list = list; + this.handler = new Handler(); + this.storage = new Storage(context); + this.list.setOnScrollListener(this); + } + + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + this.scrollState = scrollState; + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + } + + public void scan(File dir) { + setNotifyOnChange(false); + clear(); + durations.clear(); + + List ff = storage.scan(dir); + + for (File f : ff) { + if (f.isFile()) { + MediaPlayer mp = null; + try { + mp = MediaPlayer.create(getContext(), Uri.fromFile(f)); + } catch (IllegalStateException e) { + Log.d(TAG, f.toString(), e); + } + if (mp != null) { + int d = mp.getDuration(); + mp.release(); + durations.put(f, d); + add(f); + } else { + Log.e(TAG, f.toString()); + } + } + } + + sort(new SortFiles()); + notifyDataSetChanged(); + } + + public void close() { + if (player != null) { + player.release(); + player = null; + } + if (updatePlayer != null) { + handler.removeCallbacks(updatePlayer); + updatePlayer = null; + } + } + + public void load() { + scan(storage.getStoragePath()); + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + + if (convertView == null) { + convertView = inflater.inflate(R.layout.recording, parent, false); + convertView.setTag(-1); + } + + final View view = convertView; + final View base = convertView.findViewById(R.id.recording_base); + + if ((int) convertView.getTag() == TYPE_DELETED) { + RemoveItemAnimation.restore(base); + convertView.setTag(-1); + } + + final File f = getItem(position); + + TextView title = (TextView) convertView.findViewById(R.id.recording_title); + title.setText(f.getName()); + + SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + TextView time = (TextView) convertView.findViewById(R.id.recording_time); + time.setText(s.format(new Date(f.lastModified()))); + + TextView dur = (TextView) convertView.findViewById(R.id.recording_duration); + dur.setText(MainLibrary.formatDuration(getContext(), durations.get(f))); + + TextView size = (TextView) convertView.findViewById(R.id.recording_size); + size.setText(MainLibrary.formatSize(getContext(), f.length())); + + final View playerBase = convertView.findViewById(R.id.recording_player); + playerBase.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + + final Runnable delete = new Runnable() { + @Override + public void run() { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setTitle(R.string.delete_recording); + builder.setMessage("...\\" + f.getName() + "\n\n" + getContext().getString(R.string.are_you_sure)); + builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + playerStop(); + dialog.cancel(); + RemoveItemAnimation.apply(list, base, new Runnable() { + @Override + public void run() { + f.delete(); + view.setTag(TYPE_DELETED); + select(-1); + load(); + } + }); + } + }); + builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + builder.show(); + } + }; + + final Runnable rename = new Runnable() { + @Override + public void run() { + final OpenFileDialog.EditTextDialog e = new OpenFileDialog.EditTextDialog(getContext()); + e.setTitle(getContext().getString(R.string.rename_recording)); + e.setText(Storage.getNameNoExt(f)); + e.setPositiveButton(new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String ext = Storage.getExt(f); + String s = String.format("%s.%s", e.getText(), ext); + File ff = new File(f.getParent(), s); + f.renameTo(ff); + load(); + } + }); + e.show(); + + } + }; + + if (selected == position) { + RecordingAnimation.apply(list, convertView, true, scrollState == SCROLL_STATE_IDLE && (int) convertView.getTag() == TYPE_COLLAPSED); + convertView.setTag(TYPE_EXPANDED); + + updatePlayerText(convertView, f); + + final View play = convertView.findViewById(R.id.recording_player_play); + play.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (player == null) { + playerPlay(playerBase, f); + } else if (player.isPlaying()) { + playerPause(playerBase, f); + } else { + playerPlay(playerBase, f); + } + } + }); + + final View edit = convertView.findViewById(R.id.recording_player_edit); + edit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + rename.run(); + } + }); + + final View share = convertView.findViewById(R.id.recording_player_share); + share.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + shareProvider = new PopupShareActionProvider(getContext(), share); + + Intent emailIntent = new Intent(Intent.ACTION_SEND); + emailIntent.setType(Factory.MP4A); + emailIntent.putExtra(Intent.EXTRA_EMAIL, ""); + emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); + emailIntent.putExtra(Intent.EXTRA_SUBJECT, f.getName()); + emailIntent.putExtra(Intent.EXTRA_TEXT, getContext().getString(R.string.shared_via, getContext().getString(R.string.app_name))); + + shareProvider.setShareIntent(emailIntent); + + shareProvider.show(); + } + }); + + View trash = convertView.findViewById(R.id.recording_player_trash); + trash.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + delete.run(); + } + }); + + convertView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + select(-1); + } + }); + } else { + RecordingAnimation.apply(list, convertView, false, scrollState == SCROLL_STATE_IDLE && (int) convertView.getTag() == TYPE_EXPANDED); + convertView.setTag(TYPE_COLLAPSED); + + convertView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + select(position); + } + }); + } + + convertView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + PopupMenu popup = new PopupMenu(getContext(), v); + MenuInflater inflater = popup.getMenuInflater(); + inflater.inflate(R.menu.menu_context, popup.getMenu()); + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + if (item.getItemId() == R.id.action_delete) { + delete.run(); + return true; + } + if (item.getItemId() == R.id.action_rename) { + rename.run(); + return true; + } + return false; + } + }); + popup.show(); + return true; + } + }); + + return convertView; + } + + void playerPlay(View v, File f) { + if (player == null) + player = MediaPlayer.create(getContext(), Uri.fromFile(f)); + if (player == null) { + Toast.makeText(getContext(), R.string.file_not_found, Toast.LENGTH_SHORT).show(); + return; + } + player.start(); + + updatePlayerRun(v, f); + } + + void playerPause(View v, File f) { + if (player != null) { + player.pause(); + } + if (updatePlayer != null) { + handler.removeCallbacks(updatePlayer); + updatePlayer = null; + } + updatePlayerText(v, f); + } + + void playerStop() { + if (updatePlayer != null) { + handler.removeCallbacks(updatePlayer); + updatePlayer = null; + } + if (player != null) { + player.stop(); + player.release(); + player = null; + } + } + + void updatePlayerRun(final View v, final File f) { + boolean playing = updatePlayerText(v, f); + + if (updatePlayer != null) { + handler.removeCallbacks(updatePlayer); + updatePlayer = null; + } + + if (!playing) { + playerStop(); // clear player instance + updatePlayerText(v, f); // update length + return; + } + + updatePlayer = new Runnable() { + @Override + public void run() { + updatePlayerRun(v, f); + } + }; + handler.postDelayed(updatePlayer, 200); + } + + boolean updatePlayerText(final View v, final File f) { + ImageView i = (ImageView) v.findViewById(R.id.recording_player_play); + + final boolean playing = player != null && player.isPlaying(); + + i.setImageResource(playing ? R.drawable.ic_pause_24dp : R.drawable.ic_play_arrow_black_24dp); + + TextView start = (TextView) v.findViewById(R.id.recording_player_start); + SeekBar bar = (SeekBar) v.findViewById(R.id.recording_player_seek); + TextView end = (TextView) v.findViewById(R.id.recording_player_end); + + int c = 0; + int d = durations.get(f); + + if (player != null) { + c = player.getCurrentPosition(); + d = player.getDuration(); + } + + bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (!fromUser) + return; + + if (player == null) + playerPlay(v, f); + + if (player != null) { + player.seekTo(progress); + if (!player.isPlaying()) + playerPlay(v, f); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + }); + + start.setText(MainLibrary.formatDuration(getContext(), c)); + bar.setMax(d); + bar.setKeyProgressIncrement(1); + bar.setProgress(c); + end.setText("-" + MainLibrary.formatDuration(getContext(), d - c)); + + return playing; + } + + public void select(int pos) { + selected = pos; + notifyDataSetChanged(); + playerStop(); + } + + public int getSelected() { + return selected; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/Sound.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java similarity index 94% rename from app/src/main/java/com/github/axet/audiorecorder/app/Sound.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java index d865da0..c8934c9 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/Sound.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java @@ -1,15 +1,12 @@ -package com.github.axet.audiorecorder.app; +package com.github.axet.audiolibrary.app; import android.content.Context; import android.content.SharedPreferences; import android.media.AudioFormat; import android.media.AudioManager; -import android.media.AudioRecord; import android.media.AudioTrack; import android.preference.PreferenceManager; -import java.util.Arrays; - public class Sound extends com.github.axet.androidlibrary.sound.Sound { public Sound(Context context) { diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java similarity index 98% rename from app/src/main/java/com/github/axet/audiorecorder/app/Storage.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java index efefa77..0319f30 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java @@ -1,4 +1,4 @@ -package com.github.axet.audiorecorder.app; +package com.github.axet.audiolibrary.app; import android.Manifest; import android.content.Context; @@ -9,8 +9,7 @@ import android.os.StatFs; import android.preference.PreferenceManager; import android.support.v4.content.ContextCompat; -import com.github.axet.audiorecorder.R; -import com.github.axet.audiorecorder.encoders.Factory; +import com.github.axet.audiolibrary.encoders.Factory; import java.io.File; import java.io.FileInputStream; diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/Encoder.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Encoder.java similarity index 64% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/Encoder.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Encoder.java index d3f2678..69620fb 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/Encoder.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Encoder.java @@ -1,4 +1,4 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; public interface Encoder { void encode(short[] buf, int len); diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/EncoderInfo.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/EncoderInfo.java similarity index 84% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/EncoderInfo.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/EncoderInfo.java index a5636b6..3213f8a 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/EncoderInfo.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/EncoderInfo.java @@ -1,4 +1,4 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; public class EncoderInfo { public int channels; diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/Factory.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java similarity index 95% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/Factory.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java index 005b18e..bcaa45f 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/Factory.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java @@ -1,11 +1,11 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; import android.content.Context; import android.media.AudioFormat; import android.os.Build; -import com.github.axet.audiorecorder.R; -import com.github.axet.audiorecorder.app.RawSamples; +import com.github.axet.audiolibrary.R; +import com.github.axet.audiolibrary.app.RawSamples; import java.io.File; import java.util.ArrayList; diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FileEncoder.java similarity index 95% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FileEncoder.java index 31014cb..a3f538e 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FileEncoder.java @@ -1,10 +1,10 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; import android.content.Context; import android.os.Handler; import android.util.Log; -import com.github.axet.audiorecorder.app.RawSamples; +import com.github.axet.audiolibrary.app.RawSamples; import java.io.File; diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/Format3GP.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Format3GP.java similarity index 90% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/Format3GP.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Format3GP.java index c333c8b..dd77c0a 100755 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/Format3GP.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Format3GP.java @@ -1,7 +1,6 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; import android.annotation.TargetApi; -import android.media.MediaCodecList; import android.media.MediaFormat; import java.io.File; diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatM4A.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatM4A.java similarity index 91% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/FormatM4A.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatM4A.java index bdfb786..f03eff4 100755 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatM4A.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatM4A.java @@ -1,4 +1,4 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; import android.annotation.TargetApi; import android.media.MediaCodecInfo; diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatMKA.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatMKA.java similarity index 96% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/FormatMKA.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatMKA.java index 226b32b..80f86a9 100755 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatMKA.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatMKA.java @@ -1,4 +1,4 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; import android.annotation.TargetApi; import android.media.MediaCodec; diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatOGG.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatOGG.java similarity index 91% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/FormatOGG.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatOGG.java index fcde098..3a94ac0 100755 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatOGG.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatOGG.java @@ -1,4 +1,4 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; import com.github.axet.vorbisjni.Vorbis; diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatWAV.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatWAV.java similarity index 94% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/FormatWAV.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatWAV.java index 09a2df9..4dad027 100755 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatWAV.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatWAV.java @@ -1,9 +1,7 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; // based on http://soundfile.sapp.org/doc/WaveFormat/ -import android.util.Log; - import java.io.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/MuxerMP4.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/MuxerMP4.java similarity index 96% rename from app/src/main/java/com/github/axet/audiorecorder/encoders/MuxerMP4.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/MuxerMP4.java index aea3563..e460a34 100755 --- a/app/src/main/java/com/github/axet/audiorecorder/encoders/MuxerMP4.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/MuxerMP4.java @@ -1,4 +1,4 @@ -package com.github.axet.audiorecorder.encoders; +package com.github.axet.audiolibrary.encoders; import android.annotation.TargetApi; import android.media.MediaCodec; diff --git a/app/src/main/java/com/github/axet/audiorecorder/widgets/FFTBarView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTBarView.java similarity index 91% rename from app/src/main/java/com/github/axet/audiorecorder/widgets/FFTBarView.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTBarView.java index e18e38e..63aad5c 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/widgets/FFTBarView.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTBarView.java @@ -1,16 +1,10 @@ -package com.github.axet.audiorecorder.widgets; +package com.github.axet.audiolibrary.widgets; import android.content.Context; import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.View; import com.github.axet.androidlibrary.widgets.ThemeUtils; -import com.github.axet.audiorecorder.app.RawSamples; public class FFTBarView extends FFTView { public static final String TAG = FFTBarView.class.getSimpleName(); diff --git a/app/src/main/java/com/github/axet/audiorecorder/widgets/FFTChartView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java similarity index 88% rename from app/src/main/java/com/github/axet/audiorecorder/widgets/FFTChartView.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java index dfcd50e..86d60e7 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/widgets/FFTChartView.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java @@ -1,17 +1,11 @@ -package com.github.axet.audiorecorder.widgets; +package com.github.axet.audiolibrary.widgets; import android.content.Context; -import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.os.Build; import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.View; -import com.github.axet.audiorecorder.app.RawSamples; +import com.github.axet.audiolibrary.app.RawSamples; public class FFTChartView extends FFTView { public static final String TAG = FFTChartView.class.getSimpleName(); diff --git a/app/src/main/java/com/github/axet/audiorecorder/widgets/FFTView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTView.java similarity index 97% rename from app/src/main/java/com/github/axet/audiorecorder/widgets/FFTView.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTView.java index 276441e..508eabd 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/widgets/FFTView.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTView.java @@ -1,15 +1,13 @@ -package com.github.axet.audiorecorder.widgets; +package com.github.axet.audiolibrary.widgets; import android.content.Context; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; -import android.util.TypedValue; import android.view.View; import com.github.axet.androidlibrary.widgets.ThemeUtils; -import com.github.axet.audiorecorder.app.RawSamples; import org.apache.commons.math3.complex.Complex; import org.apache.commons.math3.transform.DftNormalization; diff --git a/app/src/main/java/com/github/axet/audiorecorder/widgets/PitchView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java similarity index 99% rename from app/src/main/java/com/github/axet/audiorecorder/widgets/PitchView.java rename to android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java index c3816c3..f0e04d7 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/widgets/PitchView.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java @@ -1,4 +1,4 @@ -package com.github.axet.audiorecorder.widgets; +package com.github.axet.audiolibrary.widgets; import android.content.Context; import android.graphics.Canvas; @@ -7,13 +7,12 @@ import android.graphics.Paint; import android.graphics.Rect; import android.os.Handler; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import com.github.axet.androidlibrary.widgets.ThemeUtils; -import com.github.axet.audiorecorder.R; -import com.github.axet.audiorecorder.app.RawSamples; +import com.github.axet.audiolibrary.R; +import com.github.axet.audiolibrary.app.RawSamples; import java.util.LinkedList; import java.util.List; diff --git a/app/src/main/res/drawable/ic_create_black_24dp.xml b/android-audio-library/src/main/res/drawable-xxxhdpi/ic_create_black_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_create_black_24dp.xml rename to android-audio-library/src/main/res/drawable-xxxhdpi/ic_create_black_24dp.xml diff --git a/app/src/main/res/drawable/ic_mic_24dp.xml b/android-audio-library/src/main/res/drawable-xxxhdpi/ic_mic_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_mic_24dp.xml rename to android-audio-library/src/main/res/drawable-xxxhdpi/ic_mic_24dp.xml diff --git a/app/src/main/res/drawable/ic_pause_24dp.xml b/android-audio-library/src/main/res/drawable-xxxhdpi/ic_pause_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_pause_24dp.xml rename to android-audio-library/src/main/res/drawable-xxxhdpi/ic_pause_24dp.xml diff --git a/app/src/main/res/drawable/round_button_dark.xml b/android-audio-library/src/main/res/drawable-xxxhdpi/round_button_dark.xml similarity index 100% rename from app/src/main/res/drawable/round_button_dark.xml rename to android-audio-library/src/main/res/drawable-xxxhdpi/round_button_dark.xml diff --git a/app/src/main/res/drawable/round_button_light.xml b/android-audio-library/src/main/res/drawable-xxxhdpi/round_button_light.xml similarity index 100% rename from app/src/main/res/drawable/round_button_light.xml rename to android-audio-library/src/main/res/drawable-xxxhdpi/round_button_light.xml diff --git a/android-audio-library/src/main/res/drawable/ic_delete_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_delete_black_24dp.xml new file mode 100644 index 0000000..39e64d6 --- /dev/null +++ b/android-audio-library/src/main/res/drawable/ic_delete_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/android-audio-library/src/main/res/drawable/ic_pause_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_pause_black_24dp.xml new file mode 100644 index 0000000..8356ff5 --- /dev/null +++ b/android-audio-library/src/main/res/drawable/ic_pause_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/android-audio-library/src/main/res/drawable/ic_play_arrow_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_play_arrow_black_24dp.xml new file mode 100644 index 0000000..81a8f74 --- /dev/null +++ b/android-audio-library/src/main/res/drawable/ic_play_arrow_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/android-audio-library/src/main/res/drawable/ic_share_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_share_black_24dp.xml new file mode 100644 index 0000000..e3fe874 --- /dev/null +++ b/android-audio-library/src/main/res/drawable/ic_share_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/notifictaion_recording.xml b/android-audio-library/src/main/res/layout/notifictaion_recording.xml similarity index 97% rename from app/src/main/res/layout/notifictaion_recording.xml rename to android-audio-library/src/main/res/layout/notifictaion_recording.xml index 7caff47..02e7083 100644 --- a/app/src/main/res/layout/notifictaion_recording.xml +++ b/android-audio-library/src/main/res/layout/notifictaion_recording.xml @@ -54,7 +54,7 @@ android:id="@+id/notification_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@drawable/pause" /> + android:src="@drawable/ic_pause_black_24dp" /> diff --git a/app/src/main/res/layout/notifictaion_recording_dark.xml b/android-audio-library/src/main/res/layout/notifictaion_recording_dark.xml similarity index 100% rename from app/src/main/res/layout/notifictaion_recording_dark.xml rename to android-audio-library/src/main/res/layout/notifictaion_recording_dark.xml diff --git a/app/src/main/res/layout/notifictaion_recording_light.xml b/android-audio-library/src/main/res/layout/notifictaion_recording_light.xml similarity index 100% rename from app/src/main/res/layout/notifictaion_recording_light.xml rename to android-audio-library/src/main/res/layout/notifictaion_recording_light.xml diff --git a/app/src/main/res/layout/recording.xml b/android-audio-library/src/main/res/layout/recording.xml similarity index 96% rename from app/src/main/res/layout/recording.xml rename to android-audio-library/src/main/res/layout/recording.xml index 39c9e40..6348a79 100644 --- a/app/src/main/res/layout/recording.xml +++ b/android-audio-library/src/main/res/layout/recording.xml @@ -120,7 +120,7 @@ android:id="@+id/recording_player_play" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@drawable/play" + android:src="@drawable/ic_play_arrow_black_24dp" android:tint="?attr/colorAccent" /> diff --git a/app/src/main/res/menu/menu_context.xml b/android-audio-library/src/main/res/menu/menu_context.xml similarity index 100% rename from app/src/main/res/menu/menu_context.xml rename to android-audio-library/src/main/res/menu/menu_context.xml diff --git a/android-audio-library/src/main/res/values-ru/strings.xml b/android-audio-library/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..42ea624 --- /dev/null +++ b/android-audio-library/src/main/res/values-ru/strings.xml @@ -0,0 +1,17 @@ + + + .wav (по умолчанию) + + + %1$s свободно ~ %2$s + дБ + Нет + Да + Вы уверены? + Удалить запись + Переименовать запись + "Создано с помощью: %1$s" + Файл не найден + Переименовать + Удалить + diff --git a/android-audio-library/src/main/res/values/attrs.xml b/android-audio-library/src/main/res/values/attrs.xml new file mode 100644 index 0000000..4a34715 --- /dev/null +++ b/android-audio-library/src/main/res/values/attrs.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/android-audio-library/src/main/res/values/colors.xml b/android-audio-library/src/main/res/values/colors.xml new file mode 100644 index 0000000..cb49d2e --- /dev/null +++ b/android-audio-library/src/main/res/values/colors.xml @@ -0,0 +1,8 @@ + + + #3F51B5 + #303F9F + #33333333 + #FF4081 + #a4a4a4 + diff --git a/android-audio-library/src/main/res/values/strings.xml b/android-audio-library/src/main/res/values/strings.xml new file mode 100644 index 0000000..11b27e9 --- /dev/null +++ b/android-audio-library/src/main/res/values/strings.xml @@ -0,0 +1,23 @@ + + Audio Library + + + .wav (default) + + + + wav + + + %1$s free ~ %2$s left + dB + No + Yes + "Are you sure ? " + Delete Recording + Rename Recording + "Shared via %1$s" + File not found + Rename + Delete + diff --git a/android-audio-library/src/main/res/values/styles.xml b/android-audio-library/src/main/res/values/styles.xml new file mode 100644 index 0000000..a86375b --- /dev/null +++ b/android-audio-library/src/main/res/values/styles.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + diff --git a/android-audio-library/src/test/java/com/github/axet/audiolibrary/ExampleUnitTest.java b/android-audio-library/src/test/java/com/github/axet/audiolibrary/ExampleUnitTest.java new file mode 100644 index 0000000..7e1eec6 --- /dev/null +++ b/android-audio-library/src/test/java/com/github/axet/audiolibrary/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.github.axet.audiolibrary; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index d644e64..95db191 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,10 +45,5 @@ dependencies { testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.2.0' compile 'com.android.support:support-v4:25.2.0' - compile 'com.android.support:design:25.2.0' - compile 'com.google.android.gms:play-services-appindexing:9.8.0' - compile 'org.apache.commons:commons-math3:3.6.1' - compile 'com.github.axet:android-library:1.9.9' //compile project(':android-library') - compile 'com.github.axet:jebml:0.0.2' // compile project(':jebml') - compile 'com.github.axet:vorbis:1.0.0' // compile project(':vorbis') + compile project(':android-audio-library') } diff --git a/app/src/androidTest/java/com/github/axet/audiorecorder/ApplicationTest.java b/app/src/androidTest/java/com/github/axet/audiorecorder/ApplicationTest.java index 0e33c79..df0797a 100644 --- a/app/src/androidTest/java/com/github/axet/audiorecorder/ApplicationTest.java +++ b/app/src/androidTest/java/com/github/axet/audiorecorder/ApplicationTest.java @@ -2,9 +2,6 @@ package com.github.axet.audiorecorder; import android.app.Application; import android.test.ApplicationTestCase; -import android.util.Log; - -import com.github.axet.audiorecorder.app.RawSamples; /** * Testing Fundamentals 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 b21c602..5f28261 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,14 +1,11 @@ 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.pm.PackageManager; import android.content.res.Configuration; -import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -18,67 +15,39 @@ import android.support.design.widget.FloatingActionButton; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.PopupMenu; import android.support.v7.widget.Toolbar; import android.util.Log; -import android.view.LayoutInflater; import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; -import android.widget.AbsListView; -import android.widget.ArrayAdapter; -import android.widget.ImageView; import android.widget.ListView; -import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; -import com.github.axet.androidlibrary.animations.RemoveItemAnimation; -import com.github.axet.androidlibrary.app.MainLibrary; -import com.github.axet.androidlibrary.widgets.OpenFileDialog; -import com.github.axet.androidlibrary.widgets.PopupShareActionProvider; +import com.github.axet.audiolibrary.app.Recordings; +import com.github.axet.audiolibrary.app.Storage; import com.github.axet.audiorecorder.R; -import com.github.axet.audiorecorder.animations.RecordingAnimation; import com.github.axet.audiorecorder.app.MainApplication; -import com.github.axet.audiorecorder.app.Storage; -import com.github.axet.audiorecorder.encoders.Factory; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener { +public class MainActivity extends AppCompatActivity { public final static String TAG = MainActivity.class.getSimpleName(); - static final int TYPE_COLLAPSED = 0; - static final int TYPE_EXPANDED = 1; - static final int TYPE_DELETED = 2; - /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ private GoogleApiClient client; FloatingActionButton fab; + Handler handler = new Handler(); - final int[] ALL = {TYPE_COLLAPSED, TYPE_EXPANDED}; - - int scrollState; - + ListView list; Recordings recordings; Storage storage; - ListView list; - Handler handler; - PopupShareActionProvider shareProvider; int themeId; @@ -89,381 +58,6 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr context.startActivity(i); } - static class SortFiles implements Comparator { - @Override - public int compare(File file, File file2) { - if (file.isDirectory() && file2.isFile()) - return -1; - else if (file.isFile() && file2.isDirectory()) - return 1; - else - return file.getPath().compareTo(file2.getPath()); - } - } - - public class Recordings extends ArrayAdapter { - MediaPlayer player; - Runnable updatePlayer; - int selected = -1; - - Map durations = new TreeMap<>(); - - public Recordings(Context context) { - super(context, 0); - } - - public void scan(File dir) { - setNotifyOnChange(false); - clear(); - durations.clear(); - - List ff = storage.scan(dir); - - for (File f : ff) { - if (f.isFile()) { - MediaPlayer mp = null; - try { - mp = MediaPlayer.create(getContext(), Uri.fromFile(f)); - } catch (IllegalStateException e) { - Log.d(TAG, f.toString(), e); - } - if (mp != null) { - int d = mp.getDuration(); - mp.release(); - durations.put(f, d); - add(f); - } else { - Log.e(TAG, f.toString()); - } - } - } - - sort(new SortFiles()); - notifyDataSetChanged(); - } - - public void close() { - if (player != null) { - player.release(); - player = null; - } - if (updatePlayer != null) { - handler.removeCallbacks(updatePlayer); - updatePlayer = null; - } - } - - @Override - public View getView(final int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(getContext()); - - if (convertView == null) { - convertView = inflater.inflate(R.layout.recording, parent, false); - convertView.setTag(-1); - } - - final View view = convertView; - final View base = convertView.findViewById(R.id.recording_base); - - if ((int) convertView.getTag() == TYPE_DELETED) { - RemoveItemAnimation.restore(base); - convertView.setTag(-1); - } - - final File f = getItem(position); - - TextView title = (TextView) convertView.findViewById(R.id.recording_title); - title.setText(f.getName()); - - SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - TextView time = (TextView) convertView.findViewById(R.id.recording_time); - time.setText(s.format(new Date(f.lastModified()))); - - TextView dur = (TextView) convertView.findViewById(R.id.recording_duration); - dur.setText(MainLibrary.formatDuration(getContext(), durations.get(f))); - - TextView size = (TextView) convertView.findViewById(R.id.recording_size); - size.setText(MainLibrary.formatSize(getContext(), f.length())); - - final View playerBase = convertView.findViewById(R.id.recording_player); - playerBase.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - } - }); - - final Runnable delete = new Runnable() { - @Override - public void run() { - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(R.string.delete_recording); - builder.setMessage("...\\" + f.getName() + "\n\n" + getString(R.string.are_you_sure)); - builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - playerStop(); - dialog.cancel(); - RemoveItemAnimation.apply(list, base, new Runnable() { - @Override - public void run() { - f.delete(); - view.setTag(TYPE_DELETED); - select(-1); - load(); - } - }); - } - }); - builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }); - builder.show(); - } - }; - - final Runnable rename = new Runnable() { - @Override - public void run() { - final OpenFileDialog.EditTextDialog e = new OpenFileDialog.EditTextDialog(getContext()); - e.setTitle(getString(R.string.rename_recording)); - e.setText(Storage.getNameNoExt(f)); - e.setPositiveButton(new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String ext = Storage.getExt(f); - String s = String.format("%s.%s", e.getText(), ext); - File ff = new File(f.getParent(), s); - f.renameTo(ff); - load(); - } - }); - e.show(); - - } - }; - - if (selected == position) { - RecordingAnimation.apply(list, convertView, true, scrollState == SCROLL_STATE_IDLE && (int) convertView.getTag() == TYPE_COLLAPSED); - convertView.setTag(TYPE_EXPANDED); - - updatePlayerText(convertView, f); - - final View play = convertView.findViewById(R.id.recording_player_play); - play.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (player == null) { - playerPlay(playerBase, f); - } else if (player.isPlaying()) { - playerPause(playerBase, f); - } else { - playerPlay(playerBase, f); - } - } - }); - - final View edit = convertView.findViewById(R.id.recording_player_edit); - edit.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - rename.run(); - } - }); - - final View share = convertView.findViewById(R.id.recording_player_share); - share.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - shareProvider = new PopupShareActionProvider(getContext(), share); - - Intent emailIntent = new Intent(Intent.ACTION_SEND); - emailIntent.setType(Factory.MP4A); - emailIntent.putExtra(Intent.EXTRA_EMAIL, ""); - emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); - emailIntent.putExtra(Intent.EXTRA_SUBJECT, f.getName()); - emailIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.shared_via, getString(R.string.app_name))); - - shareProvider.setShareIntent(emailIntent); - - shareProvider.show(); - } - }); - - View trash = convertView.findViewById(R.id.recording_player_trash); - trash.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - delete.run(); - } - }); - - convertView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - select(-1); - } - }); - } else { - RecordingAnimation.apply(list, convertView, false, scrollState == SCROLL_STATE_IDLE && (int) convertView.getTag() == TYPE_EXPANDED); - convertView.setTag(TYPE_COLLAPSED); - - convertView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - select(position); - } - }); - } - - convertView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - PopupMenu popup = new PopupMenu(getContext(), v); - MenuInflater inflater = popup.getMenuInflater(); - inflater.inflate(R.menu.menu_context, popup.getMenu()); - popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - if (item.getItemId() == R.id.action_delete) { - delete.run(); - return true; - } - if (item.getItemId() == R.id.action_rename) { - rename.run(); - return true; - } - return false; - } - }); - popup.show(); - return true; - } - }); - - return convertView; - } - - void playerPlay(View v, File f) { - if (player == null) - player = MediaPlayer.create(getContext(), Uri.fromFile(f)); - if (player == null) { - Toast.makeText(MainActivity.this, R.string.file_not_found, Toast.LENGTH_SHORT).show(); - return; - } - player.start(); - - updatePlayerRun(v, f); - } - - void playerPause(View v, File f) { - if (player != null) { - player.pause(); - } - if (updatePlayer != null) { - handler.removeCallbacks(updatePlayer); - updatePlayer = null; - } - updatePlayerText(v, f); - } - - void playerStop() { - if (updatePlayer != null) { - handler.removeCallbacks(updatePlayer); - updatePlayer = null; - } - if (player != null) { - player.stop(); - player.release(); - player = null; - } - } - - void updatePlayerRun(final View v, final File f) { - boolean playing = updatePlayerText(v, f); - - if (updatePlayer != null) { - handler.removeCallbacks(updatePlayer); - updatePlayer = null; - } - - if (!playing) { - playerStop(); // clear player instance - updatePlayerText(v, f); // update length - return; - } - - updatePlayer = new Runnable() { - @Override - public void run() { - updatePlayerRun(v, f); - } - }; - handler.postDelayed(updatePlayer, 200); - } - - boolean updatePlayerText(final View v, final File f) { - ImageView i = (ImageView) v.findViewById(R.id.recording_player_play); - - final boolean playing = player != null && player.isPlaying(); - - i.setImageResource(playing ? R.drawable.pause : R.drawable.play); - - TextView start = (TextView) v.findViewById(R.id.recording_player_start); - SeekBar bar = (SeekBar) v.findViewById(R.id.recording_player_seek); - TextView end = (TextView) v.findViewById(R.id.recording_player_end); - - int c = 0; - int d = durations.get(f); - - if (player != null) { - c = player.getCurrentPosition(); - d = player.getDuration(); - } - - bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - if (!fromUser) - return; - - if (player == null) - playerPlay(v, f); - - if (player != null) { - player.seekTo(progress); - if (!player.isPlaying()) - playerPlay(v, f); - } - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); - - start.setText(MainLibrary.formatDuration(getContext(), c)); - bar.setMax(d); - bar.setKeyProgressIncrement(1); - bar.setProgress(c); - end.setText("-" + MainLibrary.formatDuration(getContext(), d - c)); - - return playing; - } - - public void select(int pos) { - selected = pos; - notifyDataSetChanged(); - playerStop(); - } - } - public void setAppTheme(int id) { super.setTheme(id); themeId = id; @@ -480,25 +74,19 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr setContentView(R.layout.activity_main); + storage = new Storage(this); + // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); - storage = new Storage(this); - handler = new Handler(); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); -// if (Build.VERSION.SDK_INT >= 16) -// toolbar.setBackground(new ColorDrawable(MainApplication.getActionbarColor(this))); -// else -// toolbar.setBackgroundDrawable(new ColorDrawable(MainApplication.getActionbarColor(this))); setSupportActionBar(toolbar); fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - fab.setClickable(false); recordings.select(-1); RecordingActivity.startActivity(MainActivity.this, false); // Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) @@ -506,10 +94,8 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr } }); - recordings = new Recordings(this); - list = (ListView) findViewById(R.id.list); - list.setOnScrollListener(this); + recordings = new Recordings(this, list); list.setAdapter(recordings); list.setEmptyView(findViewById(R.id.empty_list)); @@ -525,11 +111,6 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr } } - // load recordings - void load() { - recordings.scan(storage.getStoragePath()); - } - @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); @@ -578,16 +159,14 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr } if (permitted(PERMISSIONS)) - load(); + recordings.load(); else - load(); + recordings.load(); checkPending(); updateHeader(); - fab.setClickable(true); - final int selected = getLastRecording(); handler.post(new Runnable() { @Override @@ -631,7 +210,7 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr case 1: if (permitted(permissions)) { storage.migrateLocalStorage(); - load(); + recordings.load(); checkPending(); } else { Toast.makeText(this, R.string.not_permitted, Toast.LENGTH_SHORT).show(); @@ -666,15 +245,6 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr return true; } - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - this.scrollState = scrollState; - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - } - @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -682,7 +252,7 @@ public class MainActivity extends AppCompatActivity implements AbsListView.OnScr handler.post(new Runnable() { @Override public void run() { - list.smoothScrollToPosition(recordings.selected); + list.smoothScrollToPosition(recordings.getSelected()); } }); } 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 34abcf3..ae40150 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 @@ -38,15 +38,15 @@ import com.github.axet.androidlibrary.animations.MarginBottomAnimation; import com.github.axet.androidlibrary.app.MainLibrary; import com.github.axet.audiorecorder.R; import com.github.axet.audiorecorder.app.MainApplication; -import com.github.axet.audiorecorder.app.RawSamples; -import com.github.axet.audiorecorder.app.Sound; -import com.github.axet.audiorecorder.app.Storage; -import com.github.axet.audiorecorder.encoders.Encoder; -import com.github.axet.audiorecorder.encoders.EncoderInfo; -import com.github.axet.audiorecorder.encoders.Factory; -import com.github.axet.audiorecorder.encoders.FileEncoder; +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; +import com.github.axet.audiolibrary.encoders.FileEncoder; import com.github.axet.audiorecorder.services.RecordingService; -import com.github.axet.audiorecorder.widgets.PitchView; +import com.github.axet.audiolibrary.widgets.PitchView; import java.io.File; @@ -439,7 +439,7 @@ public class RecordingActivity extends AppCompatActivity { final ImageView playButton = (ImageView) box.findViewById(R.id.recording_play); if (show) { - playButton.setImageResource(R.drawable.pause); + playButton.setImageResource(R.drawable.ic_pause_24dp); playIndex = editSample; @@ -478,7 +478,7 @@ public class RecordingActivity extends AppCompatActivity { play = null; } pitch.play(-1); - playButton.setImageResource(R.drawable.play); + playButton.setImageResource(R.drawable.ic_play_arrow_black_24dp); } } 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 d814944..1c0075b 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 @@ -26,7 +26,7 @@ import android.widget.Toast; import com.github.axet.audiorecorder.R; import com.github.axet.audiorecorder.app.MainApplication; -import com.github.axet.audiorecorder.encoders.Factory; +import com.github.axet.audiolibrary.encoders.Factory; import java.lang.reflect.Array; import java.util.ArrayList; diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java b/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java index 8d6fdbe..6bd228d 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java +++ b/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java @@ -10,83 +10,12 @@ import com.github.axet.androidlibrary.app.MainLibrary; import com.github.axet.androidlibrary.widgets.ThemeUtils; import com.github.axet.audiorecorder.R; -public class MainApplication extends Application { - public static final String PREFERENCE_STORAGE = "storage_path"; - public static final String PREFERENCE_RATE = "sample_rate"; - public static final String PREFERENCE_CALL = "call"; - public static final String PREFERENCE_SILENT = "silence"; - public static final String PREFERENCE_ENCODING = "encoding"; - public static final String PREFERENCE_LAST = "last_recording"; - public static final String PREFERENCE_THEME = "theme"; - public static final String PREFERENCE_CHANNELS = "channels"; +public class MainApplication extends com.github.axet.audiolibrary.app.MainApplication { @Override public void onCreate() { super.onCreate(); - PreferenceManager.setDefaultValues(this, R.xml.pref_general, false); - - Context context = this; - context.setTheme(getUserTheme()); } - public static int getTheme(Context context, int light, int dark) { - final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - String theme = shared.getString(PREFERENCE_THEME, ""); - if (theme.equals("Theme_Dark")) { - return dark; - } else { - return light; - } - } - - public static int getActionbarColor(Context context) { - int colorId = MainApplication.getTheme(context, R.attr.colorPrimary, R.attr.secondBackground); - int color = ThemeUtils.getThemeColor(context, colorId); - return color; - } - - public int getUserTheme() { - return getTheme(this, R.style.AppThemeLight, R.style.AppThemeDark); - } - - public String formatFree(long free, long left) { - String str = ""; - - long diff = left; - - int diffSeconds = (int) (diff / 1000 % 60); - int diffMinutes = (int) (diff / (60 * 1000) % 60); - int diffHours = (int) (diff / (60 * 60 * 1000) % 24); - int diffDays = (int) (diff / (24 * 60 * 60 * 1000)); - - if (diffDays > 0) { - str = getResources().getQuantityString(R.plurals.days, diffDays, diffDays); - } else if (diffHours > 0) { - str = getResources().getQuantityString(R.plurals.hours, diffHours, diffHours); - } else if (diffMinutes > 0) { - str = getResources().getQuantityString(R.plurals.minutes, diffMinutes, diffMinutes); - } else if (diffSeconds > 0) { - str = getResources().getQuantityString(R.plurals.seconds, diffSeconds, diffSeconds); - } - - return getString(R.string.title_header, MainLibrary.formatSize(this, free), str); - } - - public static int getChannels(Context context) { - final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - int i = Integer.parseInt(shared.getString(MainApplication.PREFERENCE_CHANNELS, "1")); - return i; - } - - public static int getMode(Context context) { - switch (getChannels(context)) { - case 1: - return AudioFormat.CHANNEL_IN_MONO; - case 2: - return AudioFormat.CHANNEL_IN_STEREO; - default: - throw new RuntimeException("unknown mode"); - } - } } diff --git a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java index 5155167..9e6b351 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java +++ b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java @@ -68,7 +68,6 @@ public class RecordingService extends Service { public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate"); - receiver = new RecordingReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_ON); @@ -142,7 +141,7 @@ public class RecordingService extends Service { view.setOnClickPendingIntent(R.id.status_bar_latest_event_content, main); view.setTextViewText(R.id.notification_text, ".../" + targetFile); view.setOnClickPendingIntent(R.id.notification_pause, pe); - view.setImageViewResource(R.id.notification_pause, !recording ? R.drawable.play : R.drawable.pause); + view.setImageViewResource(R.id.notification_pause, !recording ? R.drawable.ic_play_arrow_black_24dp : R.drawable.ic_pause_24dp); NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setOngoing(true) diff --git a/app/src/main/res/drawable-hdpi/pause.png b/app/src/main/res/drawable-hdpi/pause.png deleted file mode 100644 index dc4457869a1cd294585fb18366f99c557c73621e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUt7*7|+kcwMxZ*1f}pupqmcr208 z?X$_6DRX@;1v@wjmiQO_oVaeOi07m)%|^!eUU!G9|K7E+U%27@!}O20Qtq35lLZ=r h1|D>+clDf9vVd`W&h9S{!bK%O@}91KF6*2UngD&zF`57X diff --git a/app/src/main/res/drawable-hdpi/share.png b/app/src/main/res/drawable-hdpi/share.png deleted file mode 100644 index fb285418b4418a45eb41363e77f4c364dd41bc8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmV;q0Y?6bP) z8^}Ni>oQa5oD*~4YbI0te@MD~wk|yEpunG6@Ww?PgXp=6! z3ob0-E~ikIY~Y}Q_>^6#;``t;gMnx0lxScvgZPwji3V137?_f1U@3=zVM)RVU_ayf zPdJAr3Br4li~?_#xI1`nApQkLB^0W4c(Q~&nnIO~O*=&_C{6y6G}aBGQrg&pX2 z{_QY(VjH$#{?`ha$=@}Yfx$ZCC0KwfOZW%uL4T1mT7{!Jo9_gM%s&%m)7j(4FjDk7 zu9!9X(`I`xM(l5Ag|1=8z+sM@eF?K7QlB;ZS#$OVv`DL%lR0L8Sz^goZ$S4FQoo6< z8lX3gsxM?-93}qvFgGWr8=>|%?ahV8n=7R^mwKPtD(V|sx?79to4dw=yX1C jI7W0nF@*>bB1H5J3MMdn676Tz00000NkvXXu0mjfDwV=% diff --git a/app/src/main/res/drawable-hdpi/trash.png b/app/src/main/res/drawable-hdpi/trash.png deleted file mode 100644 index 1c0d4a070846fb9907fa8ef327d1989971f6ae43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmV+c0{;DpP)7+w7E$p~AV{!CK?e_BiVhw;S_B0d)IkV5^$mg!Qm2ZJUWCxPd5Hz_pdfT< zt*q~4zk&A<(w~iH-Wg+FcrLp;FTV$wopCl4vSrJbt$$OK$z&cRzaatUObx#R9>CiV zT$?IT2@qcJ45B6q>{CDwEPcZEtO(qEaesAY1V9)#AVrhcF-`y>;$Q06*ZQ4T4WST@C?HV(@7^4uOF}fdPj=PoY4ML!ba|6@(W(3!IZV z3wFT?Xwok;3J`Qe&o*hS=#e#LEr`;4KSOV;Wx}OvNmJGUv2k0F*l$sYatc(z3uuE= zPy>6Q3`(F#3)Dx7bgxX$)@W>-dR0x_dH#k9r@*EHfh|sfk^+Ger@)#5fpt!SyaItd zr$A1DK#o%&qd*|TDUebikm3}Gfw9E!qF0PlAOapG3W#12?)}hEqQFqchOR47psPcm zBT=BEL!c#5pru2gAyJ^AL*PoHz@-j>Lx}`{Qv(y zojpm^X2x8ZtxGHzmVD%qTjSJsE0Dd%D&Y#_Vm^t|11p%_WDQ<5C_Zgy%$?NR6ljpd Z!0ktVM6jRe*R45T8N9EkMjd56hW=cnzB6FdRn@2WaB39E6wB z!vThP9I%eomMa7C1UwF?rj^AKK->Vtr-1k<5O+Y?$d+#cVi9UvEC9p>Kzs~pVLiw( zP&r*7t_9+LAWj2fesU~e0b+NkC2>G3j+Dm}f%pK_cYUDXr?&67fOsBSFdhQpY#`nN z<VO|k)Rln#n!`6w82001$>>tsc{$i4so002ovPDHLkV1j&qa>@Vz diff --git a/app/src/main/res/drawable-mdpi/trash.png b/app/src/main/res/drawable-mdpi/trash.png deleted file mode 100644 index f26fc3b13a0bfc806b3136b4e657c0de36a8e12a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)z1p46if`T6cL$H%C@gO4tMZW~rAOd1S z`fmc}TtNj1RRfs?{F9brym4P41q4VDw>;`E^7|rAP+1V!U>qm z@i_84k$0Bl#+ied@}tIUvolzMF&M~{w?R{A%i2J4Ozwp#a8S&^fhn+22yB=FONGFa zDX>roESLgQg}{_4Fj5GNm;$y!z-9{c6aqb_KuaOeVhUIa0gEY6RtS`s0%6bq+YcI> voVuy`*PSp4vgZB=Dne1#lEIHl5Z}ff56ew*%18ck00000NkvXXu0mjfhwO?7 diff --git a/app/src/main/res/drawable-xhdpi/pause.png b/app/src/main/res/drawable-xhdpi/pause.png deleted file mode 100644 index 3a434724a345183647a498f7fe87f4af37b5844d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=*`6+rAr-gY-nz)iARy8fn0({J zr?Oo)7+g>Od{w{qm5sOOBo)s|CgCnm_HEi(^ZOlV!^ecXF*|F;fqIDnry1(&CxMJu Zay^@AL!U+Tgv0zGeV(pbhL<=Eh3Lljy_-G6$)+vk;EETa;5fw}m#L6P5h=q^FN6xV3Mx2xYOXyU?i^#VA%6~pIY90jGu$JOXf$wg~7-xSO(2yKHCW7{r_#I z1$3#lHNdmOdMjIMTot@^(B{f77zHcf)??xeGh3)hhK_O zPQR)hV9RG8p9Mp%RqVkEmZ^L2?h{TtwOAWP_DtGs{XEaXk(VfpLE3zyWX2` zS_UvjWoMSP3?L-|5D9?&U%<8qK2j-yyq7`tjgYj$)o+IONoJ1hqxHF+d<=4@eQ zdnjrMg6FZgAqbuqBZeTVxf)AQSuOZpj_Lr|UyrjNkYGO|!+S_dhroAC&eJmU9hB4| q@Ew&kG)Me~r9~o1dWsaVWkms}pfd;4Ru{0Jr|qEC1?=W&+h=(JpbFHQSspYJ=Cjih0`SFa zKsOi%3*g{OQLo^wz)A29?0|VN2D(h&Qj2zh05}5AMb7$#@I>ngGnPwA@m_FW!lJWb z#`H=Ma8ZWhKe><~;Hr!Qu2g^k0kJX)h)ED&?%!c>%UJj=jp>whE35{+U<&Mk%U|5{ zbMZ!f?NQ%mjOt2R6gfaE=m$O!q$@WEqF|Yb(y=hL@zFWvT!-$cRLIp1a_r*Jb3;&~ zfCrGK<*<1Mm;gh-LqFvv&_D$^vQS5Dn&=!4^S>| zQ9x3nfCQs}ghTU_ zfJ6a)Mge|_0!A1Gj7StPz$joqq5u!00FOigZHxliBnogd3UEslP|ql!L81UVqX4_q zjnOni@h_5hhEogzQj!I5>(2ugk^3F%hR@o7Bd%9X99MG#ZUYqtR$IrO5|66&zrtmT4yd0000< KMNUMnLSTZ9R0_@j diff --git a/app/src/main/res/drawable-xxhdpi/pause.png b/app/src/main/res/drawable-xxhdpi/pause.png deleted file mode 100644 index 5a6d71b714f587867ffe68e786ea4989e8f3d46d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoD?MEtLn>~)y|a;%L4n8Bar-Hs zn^)&9%1cnzy3>50eVu>yBo$8>$_)!OoX#$0f44w5LG~8EPW>)Mpb<0y9~2t4PleeF bbii3Q^~41NC)P7Q0$Jzj>gTe~DWM4fHJdG} diff --git a/app/src/main/res/drawable-xxhdpi/share.png b/app/src/main/res/drawable-xxhdpi/share.png deleted file mode 100644 index 6000077d11b60dc3aedeba795a632d8811a6a41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 893 zcmV-@1A_dCP)*@4@d9W-9PrPjyv&)zx)%2qANV_;k{Ublhv6&OT4SW{Denh0*+=6;A{@&C+xw|Z066XvFj=2rD(ue z_W*Y0Xnw*PoOKVN+d}{caMnG5J01c!gR|}dJoFGiH_o~TaN9!wr*YOjfO8%K*oU)j z<}VP}Jp|B%yXj;9&MMb^(s&}q<8pc9CyB%2lLzAyw&V0j;~T{;@z$g9#!asN;l^8G zWwUsmV%&FeL42&i{8wT&t`C{NPTX@a?y6WGe`j@-tD?`uLR=p-vB_~{bGKYcQGc5w zE{dNHZP+j8l$e6?QM5?(h#x7YJr$d*drE0!p`x}zb!k4&>JM$EUXUDRWI6ipRJD(qS)-NA6khM<@hMRRSO9AB}$;*zZ#irr$d zV;d8#>f|t_v`N+pF&*OvH#7C7RG#dncS|(?r7PGL_sIh(?Q~gpf$@W;?ax^9`xXB} z8sawU#fG@xo%X#ewu_Ci;E-{hHB4+SixzRi;j>m$Y31fPJb=BPr~SzUs6A~+Iad4p zevih#j)#=2yHp6E$CL3kq&#RlmT|eV`L@>nC1>NUz2gii-2&L+;mSXXv+e*2F-9U~_IDLA0?wJ&bt>4`>7s1dk{M z5(E$F1rh|0sRj}R4{8Sx0!I}T8~}%P6dVA@)f5~62R0QP07sS;8~}&*1u!Sz*vf)K z;NaGR1K{Z507BsK?f^pI`1$}s-~|o=gup9I0t$nd_#lK3LI@#*5JCtcG+Ol=hB`!s T-G#2400000NkvXXu0mjfC+wF^ diff --git a/app/src/main/res/drawable-xxhdpi/trash.png b/app/src/main/res/drawable-xxhdpi/trash.png deleted file mode 100644 index f32286d02bc8863db550402566669fce8a622be6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 976 zcmV;>126oEP)!*402%`TSzpEhG>!$vKSf=u@;gd=t2yP z6e=7Djmm7y|H!<8^PcB{-$w7f=gj-l`*H5QXCe`XVHk#C7=~dOhG7_n zVf@b4)>fHNBOD7sy-?0-1~2{*;kB?KY=+>cFfW{7Rf7o_4q5nordZWr0_F=W;ES-I zmEF65Hw6~(RXD)P{<{G4A8{@KuPC6f0v-okzmEb6E8t$h^>0!@X$4%T01D72z!Xt9 zj4R{@bAbgK@Uuf$h5`Z(IaCX$h08dAe#$H04;ksxa+9;iu8p3awYf zX5j3GkQUyT_yR45KBUp71|J9F>V#H|4JCy!+=9#sYXvCs8n!i$Z70!|X|vYL0l5IX ztr(sWiVJ6i7U8_mAzaC$1HWs*vT>{%Q@cB19NguwkEOpR=(6!4Dbpw1NgLBFU=;_( zRh)U;7S0OCg{orgt8r|pLYuAVLwZ}^K5G{6;V)+^-*L9GfOGMeLPmIsA?*~-U=q8K z#Il1}H-iVYrm^iT+WJ#JK57=Q;J}60f@T3T4hWdlEMUR`0TY@9j5;7-RI`8)2Lz00 z7Lam4KuWWKgaZN+ng#SbAfR8ffL;d#^lBE+?SO!8%>p_d5YVYvK)VA1+BFMkc0fS0 zW&uqO2x!tQAnt&GxMl%$4hX2%ETGx}0o9rX#0vDR&;P>oEv8vO<+gjTHe&i#sab$| zLvq<-0n6%V*pd&pXt99Bi1t|i!p58r0;Vh$Fy(^)o8Ooj_d!6~VgYF%1Poa$V8{mn z4=fgt^g+OY#R3L=5YT6_fIB`2=&@Kpj}HR6EEdq^gMf<`3%KBefJRFvZ_25fDQg!A z!xjp767eONS~6o%@n3j1t)+b6eK;VOa(MckaLx23;%o4FXd8A**&-A@i?-VM2K`PM zWta)qOs;wtFLX@eFLg!uhWS2od0%g`fuF5onH8)viEZ>_Dg%C%Nk}hH+$=b?~IE80000j6#adl5DTp3mo1X7HNslU$}AsgBATyHM{0WvCKRYy=~%LXE~Le0?W(&r zwmnQN8Qh}Q9$S_ux;~<$%uUhtu~BK5rlc(yYDo`u>Hp@=Ip@y#=bpJU_x`ep6=_Ry zBmn?y(WtP^R>eN!t2tI~VkA7Y%ACZQ$S^Sbxyl;;IAwK+f~f660Lb>A0fDonRI5o4 zp|RnFejB3Qx69?0j(-8b#i3y#Tg6XI=h_R3wo#jd+gsaqclWAp9-1bG6p+|emyfNz zOOIY!wS-CzxzxS(9^}x;>(;wzNjH_NwRQgwcyi-ZLQ_}n=+^Q(*v${T5{OuFps*=QcMdcJPm zsHs0Rtlr(j+accuH3s48myF!|ukQ|Xpw>WgKBY3iFOu#2m!;(4A3SW!NT?x?H~3bA zZ=6zzJ9Y1#=;78%ioe^4_|n}DnA`5yk4HaxGI!?YumgN@@DEx7u1w&LZ^wF9jNjCm zZ{ddl797)NXLWWF}> z&!dL9o|^H;%#1}Dt4`0FG_Z(gUwT?pF=?GBYIp1Tx%;1!?iHZHAvce1T2>WkZ7UIR zLpP^|QWmVj*zTrkAR%7a;J&fA+a(U0@#fyZ4PIQ3ODUVZMwlBDunM2zV{9?$rpMm;W)A!}DG3BSP>s=5w`xQ7uPfND*BCK~p4A+Kp;;|wk zPt$ibC_5cm-sCJ`6Q6Ui8OB@SkP}H8Nb|5!gXyc2QYbS*o8@lX3r`wHW?jY0Xslvi zF}WkKQZtipDc9cNV9yjY`w;Wt%k}~%eUKEISN!3H)wI~?osm7!ihMOTBy3!1(XCDJ zrtl?PIJ3Ckm_>fssIP<9+aWx^ltc=Dq?gm_#7Kvx2d6%?1V7cbNbqslEyw@re@a0V zz8U9tLX;(#0yD+VHNc*_aQ?=TRT59;kE)y#`4+dPT{~>Jx5vme!8C@>JB94kZqNiF z=6#pYEV9fn;kSoufLo{DFJ4Guklz@BW(il4xMRDf?Y$oXp=J$YmJAQAdPNcxje13n zzNsV$7V76CYgS6fiGu5g#|;^i?{OAeJ%T9w-(|zxIT4lB2TSSz^a%SCG59APX1478f9WHSI diff --git a/app/src/main/res/layout/activity_recording.xml b/app/src/main/res/layout/activity_recording.xml index 0fc1ab9..b2812c4 100644 --- a/app/src/main/res/layout/activity_recording.xml +++ b/app/src/main/res/layout/activity_recording.xml @@ -34,7 +34,7 @@ - + android:src="@drawable/ic_play_arrow_black_24dp" /> 8 kHz (телефон) - - .wav (по умолчанию) - - Моно (по умолчанию) Стерео @@ -28,13 +24,6 @@ Настройки Доступ запрещен Программа для просмотра папок не установлена - Файл не найден - "Создано с помощью: %1$s" - Переименовать запись - Нет - Да - Вы уверены? - Удалить запись пауза (звонок) кодировка пауза @@ -44,10 +33,6 @@ запись Кодирование... Запись - дБ - %1$s свободно ~ %2$s - Переименовать - Удалить Открыть папку с записями Список записей пуст.\n\nНажмите на \'Микрофон\' чтобы начать запись. diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 4a34715..045e125 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -1,6 +1,3 @@ - - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cb49d2e..045e125 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,8 +1,3 @@ - #3F51B5 - #303F9F - #33333333 - #FF4081 - #a4a4a4 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eb7e5e8..8017c1f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,14 +21,6 @@ 8000 - - .wav (default) - - - - wav - - Theme White (default) Theme Dark @@ -52,13 +44,6 @@ Settings Not permitted No folder view application installed - File not found - "Shared via %1$s" - Rename Recording - No - Yes - "Are you sure ? " - Delete Recording pause (hold by call) encoding pause @@ -68,10 +53,6 @@ recording Encoding... Recording - %1$s free ~ %2$s left - dB - Rename - Delete Open Recording Folder Recording List is Empty\n\nClick Record to Start Recording diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a86375b..8542005 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,48 +1,2 @@ - - - - - - - - - - - - - - - - - diff --git a/settings.gradle b/settings.gradle index 9b5374c..5a0bf98 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':android-library', ':jebml' \ No newline at end of file +include ':app', ':android-library', ':jebml', ':android-audio-library' \ No newline at end of file From 0cb3283e54ff10cb54002c314864a60404ae8fca Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 24 Feb 2017 14:28:22 +0300 Subject: [PATCH 05/12] fix sort --- .../com/github/axet/audiolibrary/app/Recordings.java | 8 ++++++-- .../java/com/github/axet/audiolibrary/app/Storage.java | 4 ++-- .../src/main/res/drawable-xxxhdpi/ic_pause_24dp.xml | 9 --------- .../src/main/res/layout/notifictaion_recording.xml | 4 ++-- .../axet/audiorecorder/activities/RecordingActivity.java | 4 ++-- .../axet/audiorecorder/services/RecordingService.java | 2 +- app/src/main/res/layout/activity_recording.xml | 2 +- 7 files changed, 14 insertions(+), 19 deletions(-) delete mode 100644 android-audio-library/src/main/res/drawable-xxxhdpi/ic_pause_24dp.xml diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java index c2dd900..5300cf7 100644 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java @@ -112,10 +112,14 @@ public class Recordings extends ArrayAdapter implements AbsListView.OnScro } } - sort(new SortFiles()); + sort(); notifyDataSetChanged(); } + public void sort() { + sort(new SortFiles()); + } + public void close() { if (player != null) { player.release(); @@ -387,7 +391,7 @@ public class Recordings extends ArrayAdapter implements AbsListView.OnScro final boolean playing = player != null && player.isPlaying(); - i.setImageResource(playing ? R.drawable.ic_pause_24dp : R.drawable.ic_play_arrow_black_24dp); + i.setImageResource(playing ? R.drawable.ic_pause_black_24dp : R.drawable.ic_play_arrow_black_24dp); TextView start = (TextView) v.findViewById(R.id.recording_player_start); SeekBar bar = (SeekBar) v.findViewById(R.id.recording_player_seek); diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java index 0319f30..37c0379 100644 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java @@ -26,7 +26,7 @@ public class Storage { public static final String TMP_REC = "recorind.data"; public static final String RECORDINGS = "recordings"; - Context context; + protected Context context; public Storage(Context context) { this.context = context; @@ -144,7 +144,7 @@ public class Storage { return getNextFile(parent, fileName, extension); } - File getNextFile(File parent, String name, String ext) { + protected File getNextFile(File parent, String name, String ext) { String fileName; if (ext.isEmpty()) fileName = name; diff --git a/android-audio-library/src/main/res/drawable-xxxhdpi/ic_pause_24dp.xml b/android-audio-library/src/main/res/drawable-xxxhdpi/ic_pause_24dp.xml deleted file mode 100644 index 09beb87..0000000 --- a/android-audio-library/src/main/res/drawable-xxxhdpi/ic_pause_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android-audio-library/src/main/res/layout/notifictaion_recording.xml b/android-audio-library/src/main/res/layout/notifictaion_recording.xml index 02e7083..3faf37f 100644 --- a/android-audio-library/src/main/res/layout/notifictaion_recording.xml +++ b/android-audio-library/src/main/res/layout/notifictaion_recording.xml @@ -32,14 +32,14 @@ android:id="@+id/notification_title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="Audio Recorder" + android:text="@string/app_name" android:textColor="?android:attr/colorForeground" /> 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 ae40150..a18b3e1 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 @@ -439,7 +439,7 @@ public class RecordingActivity extends AppCompatActivity { final ImageView playButton = (ImageView) box.findViewById(R.id.recording_play); if (show) { - playButton.setImageResource(R.drawable.ic_pause_24dp); + playButton.setImageResource(R.drawable.ic_pause_black_24dp); playIndex = editSample; @@ -563,7 +563,7 @@ public class RecordingActivity extends AppCompatActivity { sound.silent(); - pause.setImageResource(R.drawable.ic_pause_24dp); + pause.setImageResource(R.drawable.ic_pause_black_24dp); pitch.record(); diff --git a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java index 9e6b351..eccdf03 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java +++ b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java @@ -141,7 +141,7 @@ public class RecordingService extends Service { view.setOnClickPendingIntent(R.id.status_bar_latest_event_content, main); view.setTextViewText(R.id.notification_text, ".../" + targetFile); view.setOnClickPendingIntent(R.id.notification_pause, pe); - view.setImageViewResource(R.id.notification_pause, !recording ? R.drawable.ic_play_arrow_black_24dp : R.drawable.ic_pause_24dp); + view.setImageViewResource(R.id.notification_pause, !recording ? R.drawable.ic_play_arrow_black_24dp : R.drawable.ic_pause_black_24dp); NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setOngoing(true) diff --git a/app/src/main/res/layout/activity_recording.xml b/app/src/main/res/layout/activity_recording.xml index b2812c4..5ea4b9a 100644 --- a/app/src/main/res/layout/activity_recording.xml +++ b/app/src/main/res/layout/activity_recording.xml @@ -110,7 +110,7 @@ android:layout_width="40dp" android:layout_height="40dp" android:background="?attr/roundButton" - android:src="@drawable/ic_pause_24dp" /> + android:src="@drawable/ic_pause_black_24dp" /> Date: Fri, 24 Feb 2017 15:19:56 +0300 Subject: [PATCH 06/12] cleanups --- .../audiolibrary/app/MainApplication.java | 1 - .../axet/audiolibrary/app/RawSamples.java | 20 +++--------------- .../github/axet/audiolibrary/app/Sound.java | 9 +++++--- .../axet/audiolibrary/encoders/Factory.java | 3 ++- .../audiolibrary/widgets/FFTChartView.java | 3 ++- .../axet/audiolibrary/widgets/PitchView.java | 11 +++++----- .../ic_create_black_24dp.xml | 0 .../ic_mic_24dp.xml | 0 .../round_button_dark.xml | 0 .../round_button_light.xml | 0 .../activities/RecordingActivity.java | 9 ++++---- app/src/main/res/drawable-hdpi/ic_done.png | Bin 376 -> 0 bytes .../res/drawable-hdpi/ic_info_black_24dp.png | Bin 321 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 233 -> 0 bytes .../res/drawable-hdpi/ic_sync_black_24dp.png | Bin 368 -> 0 bytes app/src/main/res/drawable-mdpi/ic_done.png | Bin 296 -> 0 bytes .../res/drawable-mdpi/ic_info_black_24dp.png | Bin 222 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 182 -> 0 bytes .../res/drawable-mdpi/ic_sync_black_24dp.png | Bin 250 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_done.png | Bin 415 -> 0 bytes .../res/drawable-xhdpi/ic_info_black_24dp.png | Bin 412 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 278 -> 0 bytes .../res/drawable-xhdpi/ic_sync_black_24dp.png | Bin 467 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_done.png | Bin 686 -> 0 bytes .../drawable-xxhdpi/ic_info_black_24dp.png | Bin 579 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 383 -> 0 bytes .../drawable-xxhdpi/ic_sync_black_24dp.png | Bin 669 -> 0 bytes .../drawable-xxxhdpi/ic_info_black_24dp.png | Bin 766 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 497 -> 0 bytes .../drawable-xxxhdpi/ic_sync_black_24dp.png | Bin 875 -> 0 bytes .../main/res/drawable/ic_done_black_24dp.xml | 9 ++++++++ .../ic_info_black_24dp.xml | 0 .../ic_notifications_black_24dp.xml | 0 .../ic_sync_black_24dp.xml | 0 .../main/res/layout/activity_recording.xml | 3 ++- 35 files changed, 34 insertions(+), 34 deletions(-) rename android-audio-library/src/main/res/{drawable-xxxhdpi => drawable}/ic_create_black_24dp.xml (100%) rename android-audio-library/src/main/res/{drawable-xxxhdpi => drawable}/ic_mic_24dp.xml (100%) rename android-audio-library/src/main/res/{drawable-xxxhdpi => drawable}/round_button_dark.xml (100%) rename android-audio-library/src/main/res/{drawable-xxxhdpi => drawable}/round_button_light.xml (100%) delete mode 100644 app/src/main/res/drawable-hdpi/ic_done.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_done.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_sync_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_done.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_done.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png create mode 100644 app/src/main/res/drawable/ic_done_black_24dp.xml rename app/src/main/res/{drawable-v21 => drawable}/ic_info_black_24dp.xml (100%) rename app/src/main/res/{drawable-v21 => drawable}/ic_notifications_black_24dp.xml (100%) rename app/src/main/res/{drawable-v21 => drawable}/ic_sync_black_24dp.xml (100%) diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java index b5494f8..9884783 100644 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java @@ -19,7 +19,6 @@ public class MainApplication extends Application { public static final String PREFERENCE_THEME = "theme"; public static final String PREFERENCE_CHANNELS = "channels"; - @Override public void onCreate() { super.onCreate(); diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java index bd565da..e5ae92d 100644 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java @@ -1,13 +1,6 @@ package com.github.axet.audiolibrary.app; import android.media.AudioFormat; -import android.util.Log; - -import org.apache.commons.math3.complex.Complex; -import org.apache.commons.math3.transform.DftNormalization; -import org.apache.commons.math3.transform.FastFourierTransformer; -import org.apache.commons.math3.transform.TransformType; -import org.apache.commons.math3.util.MathArrays; import java.io.BufferedOutputStream; import java.io.File; @@ -21,13 +14,6 @@ import java.nio.ByteOrder; import java.nio.channels.FileChannel; public class RawSamples { - public static int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - - // quite root gives me 20db - public static int NOISE_DB = 20; - // max 90 dB detection for android mic - public static int MAXIMUM_DB = 90; - File in; InputStream is; @@ -69,7 +55,7 @@ public class RawSamples { try { readBuffer = new byte[(int) getBufferLen(bufReadSize)]; is = new FileInputStream(in); - is.skip(offset * (AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1)); + is.skip(offset * (Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1)); } catch (IOException e) { throw new RuntimeException(e); } @@ -109,11 +95,11 @@ public class RawSamples { } public static long getSamples(long len) { - return len / (AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1); + return len / (Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1); } public static long getBufferLen(long samples) { - return samples * (AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1); + return samples * (Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1); } public void trunk(long pos) { diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java index c8934c9..543b3e5 100644 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java @@ -8,6 +8,11 @@ import android.media.AudioTrack; import android.preference.PreferenceManager; public class Sound extends com.github.axet.androidlibrary.sound.Sound { + public static int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; + // quite root gives me 20db + public static int NOISE_DB = 20; + // max 90 dB detection for android mic + public static int MAXIMUM_DB = 90; public Sound(Context context) { super(context); @@ -47,9 +52,7 @@ public class Sound extends com.github.axet.androidlibrary.sound.Sound { // http://stackoverflow.com/questions/27602492 // // with MODE_STATIC setNotificationMarkerPosition not called - AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, - c, RawSamples.AUDIO_FORMAT, - len * (Short.SIZE / 8), AudioTrack.MODE_STREAM); + AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, c, AUDIO_FORMAT, len * (Short.SIZE / 8), AudioTrack.MODE_STREAM); track.write(buf, 0, len); if (track.setNotificationMarkerPosition(end) != AudioTrack.SUCCESS) throw new RuntimeException("unable to set marker"); diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java index bcaa45f..7f281b7 100644 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java @@ -6,6 +6,7 @@ import android.os.Build; import com.github.axet.audiolibrary.R; import com.github.axet.audiolibrary.app.RawSamples; +import com.github.axet.audiolibrary.app.Sound; import java.io.File; import java.util.ArrayList; @@ -89,7 +90,7 @@ public class Factory { } // default raw - int c = RawSamples.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1; + int c = Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1; return c * rate; } } diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java index 86d60e7..fa98488 100644 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java @@ -6,6 +6,7 @@ import android.graphics.Color; import android.util.AttributeSet; import com.github.axet.audiolibrary.app.RawSamples; +import com.github.axet.audiolibrary.app.Sound; public class FFTChartView extends FFTView { public static final String TAG = FFTChartView.class.getSimpleName(); @@ -66,7 +67,7 @@ public class FFTChartView extends FFTView { min = Math.min(v, min); max = Math.max(v, max); - v = (RawSamples.MAXIMUM_DB + v) / RawSamples.MAXIMUM_DB; + v = (Sound.MAXIMUM_DB + v) / Sound.MAXIMUM_DB; float endX = startX; float endY = (float) (h - h * v); diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java index f0e04d7..680f4f5 100644 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java @@ -13,6 +13,7 @@ import android.view.ViewGroup; import com.github.axet.androidlibrary.widgets.ThemeUtils; import com.github.axet.audiolibrary.R; import com.github.axet.audiolibrary.app.RawSamples; +import com.github.axet.audiolibrary.app.Sound; import java.util.LinkedList; import java.util.List; @@ -338,7 +339,7 @@ public class PitchView extends ViewGroup { } void update(int end) { - dB = getDB(end) / RawSamples.MAXIMUM_DB; + dB = getDB(end) / Sound.MAXIMUM_DB; String str = ""; @@ -420,7 +421,7 @@ public class PitchView extends ViewGroup { if (isInEditMode()) { for (int i = 0; i < 3000; i++) { - data.add(-Math.sin(i) * RawSamples.MAXIMUM_DB); + data.add(-Math.sin(i) * Sound.MAXIMUM_DB); } } @@ -495,7 +496,7 @@ public class PitchView extends ViewGroup { public double getDB(int i) { double db = data.get(i); - db = RawSamples.MAXIMUM_DB + db; + db = Sound.MAXIMUM_DB + db; return db; } @@ -504,12 +505,12 @@ public class PitchView extends ViewGroup { double db = getDB(i); // do not show below NOISE_DB - db = db - RawSamples.NOISE_DB; + db = db - Sound.NOISE_DB; if (db < 0) db = 0; - int rest = RawSamples.MAXIMUM_DB - RawSamples.NOISE_DB; + int rest = Sound.MAXIMUM_DB - Sound.NOISE_DB; db = db / rest; diff --git a/android-audio-library/src/main/res/drawable-xxxhdpi/ic_create_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_create_black_24dp.xml similarity index 100% rename from android-audio-library/src/main/res/drawable-xxxhdpi/ic_create_black_24dp.xml rename to android-audio-library/src/main/res/drawable/ic_create_black_24dp.xml diff --git a/android-audio-library/src/main/res/drawable-xxxhdpi/ic_mic_24dp.xml b/android-audio-library/src/main/res/drawable/ic_mic_24dp.xml similarity index 100% rename from android-audio-library/src/main/res/drawable-xxxhdpi/ic_mic_24dp.xml rename to android-audio-library/src/main/res/drawable/ic_mic_24dp.xml diff --git a/android-audio-library/src/main/res/drawable-xxxhdpi/round_button_dark.xml b/android-audio-library/src/main/res/drawable/round_button_dark.xml similarity index 100% rename from android-audio-library/src/main/res/drawable-xxxhdpi/round_button_dark.xml rename to android-audio-library/src/main/res/drawable/round_button_dark.xml diff --git a/android-audio-library/src/main/res/drawable-xxxhdpi/round_button_light.xml b/android-audio-library/src/main/res/drawable/round_button_light.xml similarity index 100% rename from android-audio-library/src/main/res/drawable-xxxhdpi/round_button_light.xml rename to android-audio-library/src/main/res/drawable/round_button_light.xml 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 a18b3e1..830d779 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 @@ -426,7 +426,7 @@ public class RecordingActivity extends AppCompatActivity { int rate = Integer.parseInt(shared.getString(MainApplication.PREFERENCE_RATE, "")); int m = MainApplication.getChannels(this); - int c = RawSamples.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1; + int c = Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1; long perSec = (c * m * rate); long sec = free / perSec * 1000; @@ -588,12 +588,12 @@ public class RecordingActivity extends AppCompatActivity { rs.open(samplesTime); - int min = AudioRecord.getMinBufferSize(sampleRate, MainApplication.getMode(RecordingActivity.this), RawSamples.AUDIO_FORMAT); + int min = AudioRecord.getMinBufferSize(sampleRate, MainApplication.getMode(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), RawSamples.AUDIO_FORMAT, min * 2); + recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, MainApplication.getMode(RecordingActivity.this), Sound.AUDIO_FORMAT, min * 2); if (recorder.getState() != AudioRecord.STATE_INITIALIZED) { throw new RuntimeException("Unable to initialize AudioRecord"); } @@ -723,7 +723,6 @@ public class RecordingActivity extends AppCompatActivity { @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - switch (requestCode) { case 1: if (permitted(permissions)) { @@ -764,7 +763,7 @@ public class RecordingActivity extends AppCompatActivity { EncoderInfo getInfo() { final int channels = MainApplication.getChannels(this); - final int bps = RawSamples.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 16 : 8; + final int bps = Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 16 : 8; return new EncoderInfo(channels, sampleRate, bps); } diff --git a/app/src/main/res/drawable-hdpi/ic_done.png b/app/src/main/res/drawable-hdpi/ic_done.png deleted file mode 100644 index 2254355ffbb5312278aec984b6fb881ca0c8ad72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmV-;0f+vHP)zzXu*k{zB5q+mpxOJ0Y+91Ib@* zQvL{x!9fUP?SgxfZ){S&2tNFY-qtB$UEZIx0)CAN-$5>*{D9<}who+E;wNZ{NaYQQ zlOQGVO%n7;{wk`g?{qLt^A)$T6DHkQ%Nr$1U`p~m5%N^x)0e*%B~K+Bk@6aiMx)Va{&VIt WP2CU{uahH-qjnO!mZF74z`KYHotZQj~G9OBG_t^ED_kIXRP z8;w~~Qsa5P=BYWdU__EBJMKte9gdtxYdq4khJueW&Pc>cvi{6361huX>Wn1p1Yv6= zaRmWW!dHC7;kXjM_MA66Bsd3vLxS6)G3IUxb&OD!2oiZTy*WyW7pRP32C|k0wldT1B8Lp22U5qkP61PXEvTZ6d>a8@UZ?1 zA+c-66fgaBRuc>lIKkqWwEBhLN~4B^=^YF1?lx0w{jkHlvNhq4U%kY(4%UYj${gxU zt{#`?C=^ypw+}YdKA#S3~g6)IW)n6udaq z+)GOiED3ODRoiN{EBVotiHBXj>?{2uy>wZi)V_=1zmDyj)K|Gw_IHc)r4T`te0NDl hwI^3XQhFp;iAM+Z&9%(1ZU(xY!PC{xWt~$(698`;Th;&o diff --git a/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png deleted file mode 100644 index a5ebdbd072989517b8c6230f65f7064d7c2ac017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmV-$0gwKPP)Bnh6NK+0$5`HOv#KS=tYj%F$hmx(`HEa6MGCz zVd+xXR3C*q>XmoYu)EvRqLNoKN9vrWebtl-5=snnb1q-WxnL6Px!}^N1m!(NUU2JwCcw_A z1jhWJ%Wtlr==PyfORPZjMcz^5rC*)wIM`COwn|Xm=GYCCe|^1TFD2}4zk`a@9k)ts uD7NKQ>6gu52}@q{>TNf~wp~X@M=DR-%z#nHR7;Zp0000hoS^g9uF~&xlN*)H`W{wZ;U+{TXN|u|AX!W%Mvu1 zCO7Tl*uo`~E>@u<#XBj|^}>ul|6C>19PJEUR$ER;nAhbpt#9Vs*Ef&3bU%Gs$9S4s WW8+=f3r;`>GkCiCxvXjCCUMHOLgs0@uOIM+hc=c_OeCtYY$lmfH>|_qY(a5Lp zBC`?BMt+0`nYqvz>4i$B5_%&SVO?^iM%c@|3GYT~gU&Mf*o80860LBx0>q!>QEKKS zbPhJ=;$MP1X$|6brX|#l&bsLVpmeTu&enbW0-8ozYX{n?_5c6?07*qoM6N<$f=D}Y AIRF3v diff --git a/app/src/main/res/drawable-xhdpi/ic_done.png b/app/src/main/res/drawable-xhdpi/ic_done.png deleted file mode 100644 index a068d7a1f57518ad5ced1b069e17216788931306..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu@#P)2zg^j)BB|?fz6Vmt?_BJ945!6D&6wwfT10m`2PUkGFaD-XU zViWgf{tx~}#GUU)&K;u&0000000000C_P!0RW!>dlno`-D*sOTu}L+{AJWk*-=|zk zmyaoLjQjxdke4gppsX1Ap%(cCBR>*<0fM|@`5I-;$WJI&n&qpI7c5_;%ozFU+2rZq z3(D<3$xj%0^KGb|Q@%&pQSP+LABOpp5`vVsgWWSjnG#wa&!|ww%sJ+_zaGLvsml!a z<)Z{EKXS-7LV7a4_%5L|^0|SZeU)G~H;4Q(NO_+nSos0-IcCR?%WzR~mCzP1Ur@sL zu@c0{=Y*b4Ey2q7nfIH2bg#>NZ%>O#D3DJiEHBOy#LJ&h!YlLoT9kZ23BU6}X-eMZ zAJxj|N_b%8w<_cvB^ddeNE^0k7>D5($61se024W16Y9PdLry5vdn5qWG7(8}rf#0;i^i3`Bz)3@LmB1SV3Ir;F zXA1R55y$7>4m@$40i?z@(7tAuhqf9h{9DK(kS9VPYq@pj?P({$*j*$70e+edaK1ul_2NP&A~Pg39!*_#v? zkeRk$7|4Mf$N?t@T-x(e!eI;N(w!F)7P$0*|EtF)>xk}V7O04Biy9mEOaUnp*K{AN cD9HYhcl4RW{G`P`$^ZZW07*qoM6N<$f+&V{8UO$Q diff --git a/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png deleted file mode 100644 index 860a5db38b393009a7407ced8d9fec8da0b460e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmV;^0WAKBP)Y8m235b4thfjq5s2xGL-&my=8Y}rO#iqNL_sAt7# zbGQi8aPN&dD}Q(UKmQ-YoO`)AM%MLWT`$)4VqGuR^3-I(3JalY4Vwc%W0i@p9B?ix{5h)DbUhjrRWQ zC$I66YjjKu6StQJ zPo5IU6w&jpC@59DAecvdaf&5rK~PjglW}m0Jwp-{q$)-COd;&Jrcaw1Qk^1WgA`Ad ziaHZcwhG9|xiJ$cDFbG#IB*wVAB%B4*7aD|V_lDRJ&d?8{sN$?X^Ds6w;2Ec002ov JPDHLkV1g1j%<2FD diff --git a/app/src/main/res/drawable-xxhdpi/ic_done.png b/app/src/main/res/drawable-xxhdpi/ic_done.png deleted file mode 100644 index a375a37685f32ef6d96fe9aef6431fc367148599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmV;f0#W^mP)meOP)nne^hx)R-pNGQR*anUSni_t(VY7h$z z?nJcJ{}j)_j10kJ;@SA?8?6)8AyKn`Na_I%HIvi58~~Fn;0@*JA;475AscN7E^X= zXEfg>3z#w^|58Nl1oWlXt|@15_jV9JdA)5xFh z+Ce_GlRx<3# z`KUZ>&DO*ED_@ge&xQPvA$-t=U`hUFq2!O8t-NUAf+aLddsWNAej*C2i$84+|xK!a7P^3;xP)v-1CcC)_t!J2R!CllBm(o#elm zJK7L5Y4ZAE$t&e^9w9&aRI-zFC;0MTD(`Qco8JjhdFK5q6pQH$;Y|YhW$dLl1n)F+V@&zaS@~v$;2kf# zR^&I3Z+-|-JE18#ge5n1^n%WJS4U0cyBoqiY6k!S00000000000000003hr90S(CY UZE8>v#sB~S07*qoM6N<$f}q?&KmY&$ diff --git a/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png deleted file mode 100644 index a81eeb9ee7ef8ab1662b5b6bc88cf74912e4cb5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmV-J0=)f+P)YDX|Txx7F9T)MSz5C z%me$p#<(@Ec}8Mx!WA`)S?3W+u@6bG_Q+CN{iWZ6iFpgn8im7?Un+GeL)QF6AA4ghWDNXmU%KBG@?RmKM)K1 zMojBSqWw=2twt=5)`ISdVGXesBvgrXZ8hkU2o;{K22Jn?b%0n667~qyLM-o&5Jdv( zL4TP?X$x_%4U`&Af{svXIte;OspBN5jZz=6{@DvXl!i`%1}Ftig2q!9G`&wY{XgoC zlb|+AO(#JoC^eh}9ip`9BT! zt3hvwp=B+|Cze%9K`*Qj(>Y>cXT-L|$au~Wj|A$*gSJWNv(cQ7Bv#Y(JK#w*j9P*Yqa=F};`Uf%+Z6V(b RSUCUy002ovPDHLkV1jt6`k4R# diff --git a/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png deleted file mode 100644 index ab8a9c464c6c30f54a49d18e1d48b3b8637a9295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmV-_0f7FAP)z9Eb5|s``^)CE_}yje)z64pu{@M5;_j>;{9|U?dVTN(BQGf?Y^x(n#9o)!|G% zjU4BEPu~u|&vOG0CJAFqk!rUBLt&b8T-X^?co*)3o#I&$*V6)CRU<=Ncojs30vigA zQsRV0WT?S0E94odF?RXD{n0zygPU6B6&Ist78!sYI=Gm%sgSV)+&|kVLp5B2*2%~c zokT+|3ZOU68!lmw`W^j}en-C~ z-w`ZncLYl=0<4vB2$j%)(JeuRaXJ-b_M%dt*X16+J datt|R%rC40J4*F-*<%0z002ovPDHLkV1n31phf@y diff --git a/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png deleted file mode 100644 index f7990080d1d7d7e30b1844c18be8928128af147c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmV;O0%HA%P)Ri)#A+rN#ZV}M#KrnQ=uoUdx&}e)B(84V)X*Zhb`j|=Sg}(VanQLY z)jde5NeBw@b}N@>BJX?O$-+X_Zyy1Q~JX9W8v!)}~bi|sDSkn<}I$}*ntm%j~ z9kHe(+;B;meM-zT*nOQ~j#(ySLPw>+CRr0gDs@&#*-{ct8MUTVV>WrE=cE~@z!sG@ zN-c^>D`}?Kp%s)$S}DjF2Y0^GOt&A`B27f)iji)gA9<>X$_XjF_`tB|ftCv>t>D2c zYFva=>dYif^r{>pGMfkzQt3Vx5tVf!(nkXct#m(!=r=AyBtEK=GClZ^L+_;}B5|xL zzT(TSYC9qVSwtm|FVm{+mI0huPzAs6=LzSkaSmrbtML+Xu&o+5aOQ^^e@7hXZ@z~! zzt#9_;$T8Gp5aVQjlU!g`c-2UXKvN_Q{tdkHD2S)4f-04gC6v4WI#|=enhvb-FnQ!32goiP%3qR|00000NkvXXu0mjf DBY7@j diff --git a/app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png deleted file mode 100644 index c8f86b925366485cef1f43c089f785ab8415068d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmVDuaOF?qdkw!ZaV?`>xjy6gVLBv5If;S){v5mCXA=Y@H1rfw?2k|s36`TsO zNHkbQ$!A*+5eLd!$4>T2_S$>D#r=D(;16rBEP_R$P$(1%^^m2=ItNs!^UUj8&(x`~ z&l*LtbfZ#|309~g2Axu3oCHcl$g<57(qs*`7$HKSIw(*>Ty)MH?F1shPyB;e=#~ZI z_$<#QVzCQy_@bx0J~enA3k6_=)wfSbaFejbp3yC+S{ z_7DY?X;B_gQjQiRTt1lJbNASe)3hHEH3Nk2X;KG&s~Yf`BuyzGss;$NVD1ZQ>IR$< z!B`eiH$cc>Y+L1kO$;S@QaRv}I7TKArHx@^1yR}(MyiO?PB74eD6Y%=3f0*#j*5ul z=5e%+D6WK~14MDVII194dQYr$jH9~h0XH~$Rz0ABqgT}fUjFw3KEM%D{t z0UH<_Q90l{j72zCH=xQV%rU2Kzzj`k=T_B#ItiMzplU#Yrp38XGoVI{7UU2mP12$= zqM+YsSs!;u!2L@vF65Db%i+>05@0{$T9iX1pnj(f3sO{(06L`;O9r??eD0Do77h74 z;V-_%vH{L~JUnSU(9NMwpKd1}iL!=x+!AegYKnUge|2;CAWhk$H%~9V$#H>L?3_t_ z7Uu^(BNnPtAVwgP%(}c>tIUufP!Te0^4P-PR2zKDCzOaY#u9%b231&Olo%?d7-pUl wyBu>vgO|4&+;Gee%M{4ag*Bm2C=?3)2UQ-CT`xs~ZvX%Q07*qoM6N<$g2UHD;{X5v diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png deleted file mode 100644 index 86f89d75000ada881e4c14891ceec47c27c7fb0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmVtWS;T; zaYBz`tPu^nL@|bq0naE#)fn)NVnp*CkjTQsfCVzQ#5%jgl8xP!>8N(0U!w=NC1j@$!jz5g diff --git a/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png deleted file mode 100644 index b9f56f327d6346a39fa6f69d8827ff0be7a4337d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 875 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z-;8{;uuoF_;%J_Z=H0J_W3g( z>AlH{ab;?9Jg@dus zS3Fj^r{zaz$Fn8&d}%W(?;Egx`}y_xAGvkbzxP>-ufMV)F!@|n?Z&wHHP^*oe?5wo z*(xr#vgi7N3?sowUJv(kS~`R% zow7(}bPUo|SvZet(WVAxsUOmwD<|~i{SA0Jjcv|H-KHfW9;dh#88sV!vHwuMW4TLc z?n;3NEp{$XwQCG|SA2Qc5^DNw7L%QZ&`RIc7LN4~*FWgi-TG35eT$OT-5-m@12Ywk z4`)4*|DpUKDpy*`xI61f|BsaL+}Y~JzxMp#wVN4q``d{#ol-yL=JTw|J)YuLzqh8z z|JK!Q+(w^QxJ~=ux%t*NhqQlz%FH!E0k`L!Jj4B~TyB2LueVLV?H8)me44mVe)oTY z?GGoLeV0%ADLma@Wb+3-&*@0 zm+`E+S*O?kbK^c8_wV_OIqO#k&$L$k;39r3-p+pV|bchu(99KY6clnh~I|v&r15vZHo?-24CqcCN)9K3XN}A}1OT zxve=QtUaZ}y=d`*_!BEbW-dFCt&-2h$|v|pc%!R+qu7c0hwMJNt-G1p<#;P|S;Lb+ z#T4F?6J#_FaD2ZeYGtu$oq&;BN;IQX6N%zUvB3!n~xic v+kD7bYbW*k>&7^F?8L|D{cgQd|C!2ftO$D&n7s#>i5NUx{an^LB{Ts5h>e~y diff --git a/app/src/main/res/drawable/ic_done_black_24dp.xml b/app/src/main/res/drawable/ic_done_black_24dp.xml new file mode 100644 index 0000000..7affe9b --- /dev/null +++ b/app/src/main/res/drawable/ic_done_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-v21/ic_info_black_24dp.xml b/app/src/main/res/drawable/ic_info_black_24dp.xml similarity index 100% rename from app/src/main/res/drawable-v21/ic_info_black_24dp.xml rename to app/src/main/res/drawable/ic_info_black_24dp.xml diff --git a/app/src/main/res/drawable-v21/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications_black_24dp.xml similarity index 100% rename from app/src/main/res/drawable-v21/ic_notifications_black_24dp.xml rename to app/src/main/res/drawable/ic_notifications_black_24dp.xml diff --git a/app/src/main/res/drawable-v21/ic_sync_black_24dp.xml b/app/src/main/res/drawable/ic_sync_black_24dp.xml similarity index 100% rename from app/src/main/res/drawable-v21/ic_sync_black_24dp.xml rename to app/src/main/res/drawable/ic_sync_black_24dp.xml diff --git a/app/src/main/res/layout/activity_recording.xml b/app/src/main/res/layout/activity_recording.xml index 5ea4b9a..46a0ffb 100644 --- a/app/src/main/res/layout/activity_recording.xml +++ b/app/src/main/res/layout/activity_recording.xml @@ -117,7 +117,8 @@ android:layout_width="40dp" android:layout_height="40dp" android:background="?attr/roundButton" - android:src="@drawable/ic_done" /> + android:tint="@android:color/white" + android:src="@drawable/ic_done_black_24dp" /> From baedcf023004b0703bce3df3527649d1262a1d21 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 24 Feb 2017 16:03:17 +0300 Subject: [PATCH 07/12] cleanups --- .../github/axet/audiorecorder/services/RecordingService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java index eccdf03..1343248 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java +++ b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java @@ -138,14 +138,17 @@ public class RecordingService extends Service { R.layout.notifictaion_recording_light, R.layout.notifictaion_recording_dark)); + String text = ".../" + targetFile; + view.setOnClickPendingIntent(R.id.status_bar_latest_event_content, main); - view.setTextViewText(R.id.notification_text, ".../" + targetFile); + view.setTextViewText(R.id.notification_text, text); view.setOnClickPendingIntent(R.id.notification_pause, pe); view.setImageViewResource(R.id.notification_pause, !recording ? R.drawable.ic_play_arrow_black_24dp : R.drawable.ic_pause_black_24dp); NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setOngoing(true) .setContentTitle(getString(R.string.recording_title)) + .setContentText(text) .setSmallIcon(R.drawable.ic_mic_24dp) .setContent(view); From 8118eb8d8aab3ebd8f86003ab4b2663dd66d173d Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 24 Feb 2017 16:11:25 +0300 Subject: [PATCH 08/12] fix title --- .../github/axet/audiorecorder/services/RecordingService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java index 1343248..46f7ad2 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java +++ b/app/src/main/java/com/github/axet/audiorecorder/services/RecordingService.java @@ -138,6 +138,7 @@ public class RecordingService extends Service { R.layout.notifictaion_recording_light, R.layout.notifictaion_recording_dark)); + String title = getString(R.string.recording_title); String text = ".../" + targetFile; view.setOnClickPendingIntent(R.id.status_bar_latest_event_content, main); @@ -147,8 +148,9 @@ public class RecordingService extends Service { NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setOngoing(true) - .setContentTitle(getString(R.string.recording_title)) + .setContentTitle(title) .setContentText(text) + .setTicker(title) .setSmallIcon(R.drawable.ic_mic_24dp) .setContent(view); From b51acd730fdbced36d5efd9b20c9601e11fac263 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 24 Feb 2017 16:47:52 +0300 Subject: [PATCH 09/12] split repo --- android-audio-library/build.gradle | 96 ++++++++++++++++++- app/build.gradle | 2 +- .../activities/RecordingActivity.java | 2 - 3 files changed, 95 insertions(+), 5 deletions(-) diff --git a/android-audio-library/build.gradle b/android-audio-library/build.gradle index 23c150a..958994c 100644 --- a/android-audio-library/build.gradle +++ b/android-audio-library/build.gradle @@ -1,4 +1,22 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + } +} + +repositories { + jcenter() + mavenLocal() +} + apply plugin: 'com.android.library' +apply plugin: 'maven' +apply plugin: 'signing' +apply plugin: 'com.github.dcendents.android-maven' // 'gradle install' task android { compileSdkVersion 25 @@ -8,7 +26,7 @@ android { minSdkVersion 9 targetSdkVersion 25 versionCode 1 - versionName "1.0" + versionName "0.0.1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -21,6 +39,81 @@ android { } } +task javadoc(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(project.android.getBootClasspath().join(File.pathSeparator)) + android.libraryVariants.all { variant -> + classpath += files(variant.javaCompile.classpath.files) + } +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} + +task sourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.srcDirs +} + +artifacts { + archives javadocJar, sourcesJar +} + +signing { + sign configurations.archives +} + +group = "com.github.axet" +archivesBaseName = "android-audio-library" +version = android.defaultConfig.versionName + +uploadArchives { + repositories { + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + + repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { + authentication(userName: ossrhUsername, password: ossrhPassword) + } + + snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { + authentication(userName: ossrhUsername, password: ossrhPassword) + } + + pom.project { + name 'Android Library' + packaging 'jar' + // optionally artifactId can be defined here + description 'Android Simple Widgets and Support classes.' + url 'https://gitlab.com/axet/android-audio-library' + + scm { + connection 'scm:git:https://gitlab.com/axet/android-library' + developerConnection 'scm:git:https://gitlab.com/axet/android-library' + url 'https://gitlab.com/axet/android-audio-library' + } + + licenses { + license { + name 'GNU LESSER GENERAL PUBLIC LICENSE 3.0' + url 'http://www.gnu.org/copyleft/lesser.html' + } + } + + developers { + developer { + id 'axet' + name 'Alexey Kuznetsov' + email 'axet@me.com' + } + } + } + } + } +} + dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { @@ -34,5 +127,4 @@ dependencies { compile 'com.github.axet:jebml:0.0.2' // compile project(':jebml') compile 'com.github.axet:vorbis:1.0.0' // compile project(':vorbis') testCompile 'junit:junit:4.12' - compile project(path: ':android-library') } diff --git a/app/build.gradle b/app/build.gradle index 95db191..83db4da 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,5 +45,5 @@ dependencies { testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.2.0' compile 'com.android.support:support-v4:25.2.0' - compile project(':android-audio-library') + compile 'com.github.axet:android-audio-library:0.0.1' // compile project(':android-audio-library') } 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 830d779..781184b 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 @@ -764,7 +764,6 @@ public class RecordingActivity extends AppCompatActivity { EncoderInfo getInfo() { final int channels = MainApplication.getChannels(this); final int bps = Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 16 : 8; - return new EncoderInfo(channels, sampleRate, bps); } @@ -859,7 +858,6 @@ public class RecordingActivity extends AppCompatActivity { @Override public void finish() { super.finish(); - MainActivity.startActivity(this); } } From 9898238e212b1f8a10b09d69324a9ea949c5164f Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 24 Feb 2017 18:09:46 +0300 Subject: [PATCH 10/12] fix readsize --- android-audio-library/build.gradle | 4 ++-- .../java/com/github/axet/audiolibrary/app/RawSamples.java | 4 ++-- app/build.gradle | 2 +- .../axet/audiorecorder/activities/RecordingActivity.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android-audio-library/build.gradle b/android-audio-library/build.gradle index 958994c..aef4c41 100644 --- a/android-audio-library/build.gradle +++ b/android-audio-library/build.gradle @@ -25,8 +25,8 @@ android { defaultConfig { minSdkVersion 9 targetSdkVersion 25 - versionCode 1 - versionName "0.0.1" + versionCode 2 + versionName "0.0.2" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java index e5ae92d..4b4d943 100644 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java +++ b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java @@ -84,8 +84,8 @@ public class RawSamples { } } - public void write(short[] buf) { - for (int i = 0; i < buf.length; i++) { + public void write(short[] buf, int len) { + for (int i = 0; i < len; i++) { write(buf[i]); } } diff --git a/app/build.gradle b/app/build.gradle index 83db4da..0a96ec5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,5 +45,5 @@ dependencies { testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.2.0' compile 'com.android.support:support-v4:25.2.0' - compile 'com.github.axet:android-audio-library:0.0.1' // compile project(':android-audio-library') + compile 'com.github.axet:android-audio-library:0.0.2' // compile project(':android-audio-library') } 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 781184b..36e9653 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 @@ -630,7 +630,7 @@ public class RecordingActivity extends AppCompatActivity { if (stableRefresh || diff >= s) { stableRefresh = true; - rs.write(buffer); + rs.write(buffer, readSize); int ps = samplesUpdate * MainApplication.getChannels(RecordingActivity.this); for (int i = 0; i < readSize; i += ps) { From 3234a8e01f96f29c4a58cf3ef6fdae70ddb47dc1 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 24 Feb 2017 18:10:14 +0300 Subject: [PATCH 11/12] drop library --- android-audio-library/.gitignore | 1 - android-audio-library/build.gradle | 130 ---- android-audio-library/proguard-rules.pro | 17 - .../audiolibrary/ExampleInstrumentedTest.java | 26 - .../src/main/AndroidManifest.xml | 9 - .../animations/RecordingAnimation.java | 113 --- .../audiolibrary/app/MainApplication.java | 82 --- .../axet/audiolibrary/app/RawSamples.java | 145 ---- .../axet/audiolibrary/app/Recordings.java | 451 ------------ .../github/axet/audiolibrary/app/Sound.java | 61 -- .../github/axet/audiolibrary/app/Storage.java | 283 ------- .../axet/audiolibrary/encoders/Encoder.java | 7 - .../audiolibrary/encoders/EncoderInfo.java | 13 - .../axet/audiolibrary/encoders/Factory.java | 96 --- .../audiolibrary/encoders/FileEncoder.java | 89 --- .../axet/audiolibrary/encoders/Format3GP.java | 36 - .../axet/audiolibrary/encoders/FormatM4A.java | 24 - .../axet/audiolibrary/encoders/FormatMKA.java | 187 ----- .../axet/audiolibrary/encoders/FormatOGG.java | 43 -- .../axet/audiolibrary/encoders/FormatWAV.java | 133 ---- .../axet/audiolibrary/encoders/MuxerMP4.java | 182 ----- .../axet/audiolibrary/widgets/FFTBarView.java | 100 --- .../audiolibrary/widgets/FFTChartView.java | 89 --- .../axet/audiolibrary/widgets/FFTView.java | 146 ---- .../axet/audiolibrary/widgets/PitchView.java | 693 ------------------ .../res/drawable/ic_create_black_24dp.xml | 9 - .../res/drawable/ic_delete_black_24dp.xml | 9 - .../src/main/res/drawable/ic_mic_24dp.xml | 9 - .../main/res/drawable/ic_pause_black_24dp.xml | 9 - .../res/drawable/ic_play_arrow_black_24dp.xml | 9 - .../main/res/drawable/ic_share_black_24dp.xml | 9 - .../main/res/drawable/round_button_dark.xml | 12 - .../main/res/drawable/round_button_light.xml | 12 - .../res/layout/notifictaion_recording.xml | 60 -- .../layout/notifictaion_recording_dark.xml | 8 - .../layout/notifictaion_recording_light.xml | 8 - .../src/main/res/layout/recording.xml | 166 ----- .../src/main/res/menu/menu_context.xml | 15 - .../src/main/res/values-ru/strings.xml | 17 - .../src/main/res/values/attrs.xml | 6 - .../src/main/res/values/colors.xml | 8 - .../src/main/res/values/strings.xml | 23 - .../src/main/res/values/styles.xml | 48 -- .../axet/audiolibrary/ExampleUnitTest.java | 17 - 44 files changed, 3610 deletions(-) delete mode 100644 android-audio-library/.gitignore delete mode 100644 android-audio-library/build.gradle delete mode 100644 android-audio-library/proguard-rules.pro delete mode 100644 android-audio-library/src/androidTest/java/com/github/axet/audiolibrary/ExampleInstrumentedTest.java delete mode 100644 android-audio-library/src/main/AndroidManifest.xml delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/animations/RecordingAnimation.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Encoder.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/EncoderInfo.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FileEncoder.java delete mode 100755 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Format3GP.java delete mode 100755 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatM4A.java delete mode 100755 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatMKA.java delete mode 100755 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatOGG.java delete mode 100755 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatWAV.java delete mode 100755 android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/MuxerMP4.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTBarView.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTView.java delete mode 100644 android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java delete mode 100644 android-audio-library/src/main/res/drawable/ic_create_black_24dp.xml delete mode 100644 android-audio-library/src/main/res/drawable/ic_delete_black_24dp.xml delete mode 100644 android-audio-library/src/main/res/drawable/ic_mic_24dp.xml delete mode 100644 android-audio-library/src/main/res/drawable/ic_pause_black_24dp.xml delete mode 100644 android-audio-library/src/main/res/drawable/ic_play_arrow_black_24dp.xml delete mode 100644 android-audio-library/src/main/res/drawable/ic_share_black_24dp.xml delete mode 100644 android-audio-library/src/main/res/drawable/round_button_dark.xml delete mode 100644 android-audio-library/src/main/res/drawable/round_button_light.xml delete mode 100644 android-audio-library/src/main/res/layout/notifictaion_recording.xml delete mode 100644 android-audio-library/src/main/res/layout/notifictaion_recording_dark.xml delete mode 100644 android-audio-library/src/main/res/layout/notifictaion_recording_light.xml delete mode 100644 android-audio-library/src/main/res/layout/recording.xml delete mode 100644 android-audio-library/src/main/res/menu/menu_context.xml delete mode 100644 android-audio-library/src/main/res/values-ru/strings.xml delete mode 100644 android-audio-library/src/main/res/values/attrs.xml delete mode 100644 android-audio-library/src/main/res/values/colors.xml delete mode 100644 android-audio-library/src/main/res/values/strings.xml delete mode 100644 android-audio-library/src/main/res/values/styles.xml delete mode 100644 android-audio-library/src/test/java/com/github/axet/audiolibrary/ExampleUnitTest.java diff --git a/android-audio-library/.gitignore b/android-audio-library/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/android-audio-library/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/android-audio-library/build.gradle b/android-audio-library/build.gradle deleted file mode 100644 index aef4c41..0000000 --- a/android-audio-library/build.gradle +++ /dev/null @@ -1,130 +0,0 @@ -buildscript { - repositories { - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' - } -} - -repositories { - jcenter() - mavenLocal() -} - -apply plugin: 'com.android.library' -apply plugin: 'maven' -apply plugin: 'signing' -apply plugin: 'com.github.dcendents.android-maven' // 'gradle install' task - -android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" - - defaultConfig { - minSdkVersion 9 - targetSdkVersion 25 - versionCode 2 - versionName "0.0.2" - - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -task javadoc(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(project.android.getBootClasspath().join(File.pathSeparator)) - android.libraryVariants.all { variant -> - classpath += files(variant.javaCompile.classpath.files) - } -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -task sourcesJar(type: Jar) { - classifier = 'sources' - from android.sourceSets.main.java.srcDirs -} - -artifacts { - archives javadocJar, sourcesJar -} - -signing { - sign configurations.archives -} - -group = "com.github.axet" -archivesBaseName = "android-audio-library" -version = android.defaultConfig.versionName - -uploadArchives { - repositories { - mavenDeployer { - beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { - authentication(userName: ossrhUsername, password: ossrhPassword) - } - - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { - authentication(userName: ossrhUsername, password: ossrhPassword) - } - - pom.project { - name 'Android Library' - packaging 'jar' - // optionally artifactId can be defined here - description 'Android Simple Widgets and Support classes.' - url 'https://gitlab.com/axet/android-audio-library' - - scm { - connection 'scm:git:https://gitlab.com/axet/android-library' - developerConnection 'scm:git:https://gitlab.com/axet/android-library' - url 'https://gitlab.com/axet/android-audio-library' - } - - licenses { - license { - name 'GNU LESSER GENERAL PUBLIC LICENSE 3.0' - url 'http://www.gnu.org/copyleft/lesser.html' - } - } - - developers { - developer { - id 'axet' - name 'Alexey Kuznetsov' - email 'axet@me.com' - } - } - } - } - } -} - -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - compile 'com.android.support:design:25.2.0' - compile 'com.android.support:appcompat-v7:25.2.0' - compile 'com.google.android.gms:play-services-appindexing:9.8.0' - compile 'org.apache.commons:commons-math3:3.6.1' - compile 'com.github.axet:android-library:1.9.9' //compile project(':android-library') - compile 'com.github.axet:jebml:0.0.2' // compile project(':jebml') - compile 'com.github.axet:vorbis:1.0.0' // compile project(':vorbis') - testCompile 'junit:junit:4.12' -} diff --git a/android-audio-library/proguard-rules.pro b/android-audio-library/proguard-rules.pro deleted file mode 100644 index f45cfad..0000000 --- a/android-audio-library/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Users/axet/Library/Android/sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/android-audio-library/src/androidTest/java/com/github/axet/audiolibrary/ExampleInstrumentedTest.java b/android-audio-library/src/androidTest/java/com/github/axet/audiolibrary/ExampleInstrumentedTest.java deleted file mode 100644 index 886cace..0000000 --- a/android-audio-library/src/androidTest/java/com/github/axet/audiolibrary/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.axet.audiolibrary; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumentation test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.github.axet.audiolibrary.test", appContext.getPackageName()); - } -} diff --git a/android-audio-library/src/main/AndroidManifest.xml b/android-audio-library/src/main/AndroidManifest.xml deleted file mode 100644 index dbe8071..0000000 --- a/android-audio-library/src/main/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/animations/RecordingAnimation.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/animations/RecordingAnimation.java deleted file mode 100644 index d7d8f93..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/animations/RecordingAnimation.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.github.axet.audiolibrary.animations; - -import android.annotation.TargetApi; -import android.os.Build; -import android.os.Handler; -import android.view.View; -import android.view.animation.Transformation; -import android.widget.ListView; - -import com.github.axet.androidlibrary.animations.MarginAnimation; -import com.github.axet.audiolibrary.R; - -public class RecordingAnimation extends MarginAnimation { - ListView list; - - View convertView; - - boolean partial; - Handler handler; - - // if we have two concurrent animations on the same listview - // the only one 'expand' should have control of showChild function. - static RecordingAnimation atomicExpander; - - public static void apply(final ListView list, final View v, final boolean expand, boolean animate) { - apply(new LateCreator() { - @Override - public MarginAnimation create() { - RecordingAnimation a = new RecordingAnimation(list, v, expand); - if (expand) - atomicExpander = a; - return a; - } - }, v, expand, animate); - } - - public RecordingAnimation(ListView list, View v, boolean expand) { - super(v.findViewById(R.id.recording_player), expand); - - handler = new Handler(); - - this.convertView = v; - this.list = list; - } - - @Override - public void init() { - super.init(); - - { - final int paddedTop = list.getListPaddingTop(); - final int paddedBottom = list.getHeight() - list.getListPaddingTop() - list.getListPaddingBottom(); - - partial = false; - - partial |= convertView.getTop() < paddedTop; - partial |= convertView.getBottom() > paddedBottom; - } - } - - @Override - public void calc(final float i, Transformation t) { - super.calc(i, t); - - float ii = expand ? i : 1 - i; - - // ViewGroup will crash on null pointer without this post pone. - // seems like some views are removed by RecyvingView when they - // gone off screen. - if (Build.VERSION.SDK_INT >= 19) { - if (!expand && atomicExpander != null && !atomicExpander.hasEnded()) { - // do not showChild; - } else { - handler.post(new Runnable() { - @Override - public void run() { - showChild(i); - } - }); - } - } - } - - @TargetApi(19) - void showChild(float i) { - final int paddedTop = list.getListPaddingTop(); - final int paddedBottom = list.getHeight() - list.getListPaddingTop() - list.getListPaddingBottom(); - - if (convertView.getTop() < paddedTop) { - int off = convertView.getTop() - paddedTop; - if (partial) - off = (int) (off * i); - list.scrollListBy(off); - } - - if (convertView.getBottom() > paddedBottom) { - int off = convertView.getBottom() - paddedBottom; - if (partial) - off = (int) (off * i); - list.scrollListBy(off); - } - } - - @Override - public void restore() { - super.restore(); - } - - @Override - public void end() { - super.end(); - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java deleted file mode 100644 index 9884783..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/MainApplication.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.github.axet.audiolibrary.app; - -import android.app.Application; -import android.content.Context; -import android.content.SharedPreferences; -import android.media.AudioFormat; -import android.preference.PreferenceManager; - -import com.github.axet.androidlibrary.app.MainLibrary; -import com.github.axet.audiolibrary.R; - -public class MainApplication extends Application { - public static final String PREFERENCE_STORAGE = "storage_path"; - public static final String PREFERENCE_RATE = "sample_rate"; - public static final String PREFERENCE_CALL = "call"; - public static final String PREFERENCE_SILENT = "silence"; - public static final String PREFERENCE_ENCODING = "encoding"; - public static final String PREFERENCE_LAST = "last_recording"; - public static final String PREFERENCE_THEME = "theme"; - public static final String PREFERENCE_CHANNELS = "channels"; - - @Override - public void onCreate() { - super.onCreate(); - Context context = this; - context.setTheme(getUserTheme()); - } - - public int getUserTheme() { - return getTheme(this, R.style.AppThemeLight, R.style.AppThemeDark); - } - - public static int getTheme(Context context, int light, int dark) { - final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - String theme = shared.getString(PREFERENCE_THEME, ""); - if (theme.equals("Theme_Dark")) { - return dark; - } else { - return light; - } - } - - public String formatFree(long free, long left) { - String str = ""; - - long diff = left; - - int diffSeconds = (int) (diff / 1000 % 60); - int diffMinutes = (int) (diff / (60 * 1000) % 60); - int diffHours = (int) (diff / (60 * 60 * 1000) % 24); - int diffDays = (int) (diff / (24 * 60 * 60 * 1000)); - - if (diffDays > 0) { - str = getResources().getQuantityString(R.plurals.days, diffDays, diffDays); - } else if (diffHours > 0) { - str = getResources().getQuantityString(R.plurals.hours, diffHours, diffHours); - } else if (diffMinutes > 0) { - str = getResources().getQuantityString(R.plurals.minutes, diffMinutes, diffMinutes); - } else if (diffSeconds > 0) { - str = getResources().getQuantityString(R.plurals.seconds, diffSeconds, diffSeconds); - } - - return getString(R.string.title_header, MainLibrary.formatSize(this, free), str); - } - - public static int getChannels(Context context) { - final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - int i = Integer.parseInt(shared.getString(MainApplication.PREFERENCE_CHANNELS, "1")); - return i; - } - - public static int getMode(Context context) { - switch (getChannels(context)) { - case 1: - return AudioFormat.CHANNEL_IN_MONO; - case 2: - return AudioFormat.CHANNEL_IN_STEREO; - default: - throw new RuntimeException("unknown mode"); - } - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java deleted file mode 100644 index 4b4d943..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/RawSamples.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.github.axet.audiolibrary.app; - -import android.media.AudioFormat; - -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.channels.FileChannel; - -public class RawSamples { - File in; - - InputStream is; - byte[] readBuffer; - - OutputStream os; - - public RawSamples(File in) { - this.in = in; - } - - // open for writing with specified offset to truncate file - public void open(long writeOffset) { - trunk(writeOffset); - try { - os = new BufferedOutputStream(new FileOutputStream(in, true)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - // open for reading - // - // bufReadSize - samples count - public void open(int bufReadSize) { - try { - readBuffer = new byte[(int) getBufferLen(bufReadSize)]; - is = new FileInputStream(in); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - // open for read with initial offset and buffer read size - // - // offset - samples offset - // bufReadSize - samples size - public void open(long offset, int bufReadSize) { - try { - readBuffer = new byte[(int) getBufferLen(bufReadSize)]; - is = new FileInputStream(in); - is.skip(offset * (Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public int read(short[] buf) { - try { - int len = is.read(readBuffer); - if (len <= 0) - return 0; - ByteBuffer.wrap(readBuffer, 0, len).order(ByteOrder.BIG_ENDIAN).asShortBuffer().get(buf, 0, (int) getSamples(len)); - return (int) getSamples(len); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public void write(short val) { - try { - ByteBuffer bb = ByteBuffer.allocate(Short.SIZE / Byte.SIZE); - bb.order(ByteOrder.BIG_ENDIAN); - bb.putShort(val); - os.write(bb.array(), 0, bb.limit()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public void write(short[] buf, int len) { - for (int i = 0; i < len; i++) { - write(buf[i]); - } - } - - public long getSamples() { - return getSamples(in.length()); - } - - public static long getSamples(long len) { - return len / (Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1); - } - - public static long getBufferLen(long samples) { - return samples * (Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1); - } - - public void trunk(long pos) { - try { - FileChannel outChan = new FileOutputStream(in, true).getChannel(); - outChan.truncate(getBufferLen(pos)); - outChan.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static double getAmplitude(short[] buffer, int offset, int len) { - double sum = 0; - for (int i = offset; i < offset + len; i++) { - sum += buffer[i] * buffer[i]; - } - return Math.sqrt(sum / len); - } - - public static double getDB(short[] buffer, int offset, int len) { - return getDB(getAmplitude(buffer, offset, len)); - } - - public static double getDB(double amplitude) { - // https://en.wikipedia.org/wiki/Sound_pressure - return 20.0 * Math.log10(amplitude / 0x7FFF); - } - - public void close() { - try { - if (is != null) - is.close(); - is = null; - - if (os != null) - os.close(); - os = null; - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java deleted file mode 100644 index 5300cf7..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Recordings.java +++ /dev/null @@ -1,451 +0,0 @@ -package com.github.axet.audiolibrary.app; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.media.MediaPlayer; -import android.net.Uri; -import android.os.Handler; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.PopupMenu; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AbsListView; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.SeekBar; -import android.widget.TextView; -import android.widget.Toast; - -import com.github.axet.androidlibrary.animations.RemoveItemAnimation; -import com.github.axet.androidlibrary.app.MainLibrary; -import com.github.axet.androidlibrary.widgets.OpenFileDialog; -import com.github.axet.androidlibrary.widgets.PopupShareActionProvider; -import com.github.axet.audiolibrary.R; -import com.github.axet.audiolibrary.animations.RecordingAnimation; -import com.github.axet.audiolibrary.encoders.Factory; - -import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -public class Recordings extends ArrayAdapter implements AbsListView.OnScrollListener { - public static String TAG = Recordings.class.getSimpleName(); - - static final int TYPE_COLLAPSED = 0; - static final int TYPE_EXPANDED = 1; - static final int TYPE_DELETED = 2; - - public static class SortFiles implements Comparator { - @Override - public int compare(File file, File file2) { - if (file.isDirectory() && file2.isFile()) - return -1; - else if (file.isFile() && file2.isDirectory()) - return 1; - else - return file.getPath().compareTo(file2.getPath()); - } - } - - Handler handler; - Storage storage; - MediaPlayer player; - Runnable updatePlayer; - int selected = -1; - ListView list; - PopupShareActionProvider shareProvider; - int scrollState; - - Map durations = new TreeMap<>(); - - public Recordings(Context context, ListView list) { - super(context, 0); - this.list = list; - this.handler = new Handler(); - this.storage = new Storage(context); - this.list.setOnScrollListener(this); - } - - - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - this.scrollState = scrollState; - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - } - - public void scan(File dir) { - setNotifyOnChange(false); - clear(); - durations.clear(); - - List ff = storage.scan(dir); - - for (File f : ff) { - if (f.isFile()) { - MediaPlayer mp = null; - try { - mp = MediaPlayer.create(getContext(), Uri.fromFile(f)); - } catch (IllegalStateException e) { - Log.d(TAG, f.toString(), e); - } - if (mp != null) { - int d = mp.getDuration(); - mp.release(); - durations.put(f, d); - add(f); - } else { - Log.e(TAG, f.toString()); - } - } - } - - sort(); - notifyDataSetChanged(); - } - - public void sort() { - sort(new SortFiles()); - } - - public void close() { - if (player != null) { - player.release(); - player = null; - } - if (updatePlayer != null) { - handler.removeCallbacks(updatePlayer); - updatePlayer = null; - } - } - - public void load() { - scan(storage.getStoragePath()); - } - - @Override - public View getView(final int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(getContext()); - - if (convertView == null) { - convertView = inflater.inflate(R.layout.recording, parent, false); - convertView.setTag(-1); - } - - final View view = convertView; - final View base = convertView.findViewById(R.id.recording_base); - - if ((int) convertView.getTag() == TYPE_DELETED) { - RemoveItemAnimation.restore(base); - convertView.setTag(-1); - } - - final File f = getItem(position); - - TextView title = (TextView) convertView.findViewById(R.id.recording_title); - title.setText(f.getName()); - - SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - TextView time = (TextView) convertView.findViewById(R.id.recording_time); - time.setText(s.format(new Date(f.lastModified()))); - - TextView dur = (TextView) convertView.findViewById(R.id.recording_duration); - dur.setText(MainLibrary.formatDuration(getContext(), durations.get(f))); - - TextView size = (TextView) convertView.findViewById(R.id.recording_size); - size.setText(MainLibrary.formatSize(getContext(), f.length())); - - final View playerBase = convertView.findViewById(R.id.recording_player); - playerBase.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - } - }); - - final Runnable delete = new Runnable() { - @Override - public void run() { - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(R.string.delete_recording); - builder.setMessage("...\\" + f.getName() + "\n\n" + getContext().getString(R.string.are_you_sure)); - builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - playerStop(); - dialog.cancel(); - RemoveItemAnimation.apply(list, base, new Runnable() { - @Override - public void run() { - f.delete(); - view.setTag(TYPE_DELETED); - select(-1); - load(); - } - }); - } - }); - builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }); - builder.show(); - } - }; - - final Runnable rename = new Runnable() { - @Override - public void run() { - final OpenFileDialog.EditTextDialog e = new OpenFileDialog.EditTextDialog(getContext()); - e.setTitle(getContext().getString(R.string.rename_recording)); - e.setText(Storage.getNameNoExt(f)); - e.setPositiveButton(new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String ext = Storage.getExt(f); - String s = String.format("%s.%s", e.getText(), ext); - File ff = new File(f.getParent(), s); - f.renameTo(ff); - load(); - } - }); - e.show(); - - } - }; - - if (selected == position) { - RecordingAnimation.apply(list, convertView, true, scrollState == SCROLL_STATE_IDLE && (int) convertView.getTag() == TYPE_COLLAPSED); - convertView.setTag(TYPE_EXPANDED); - - updatePlayerText(convertView, f); - - final View play = convertView.findViewById(R.id.recording_player_play); - play.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (player == null) { - playerPlay(playerBase, f); - } else if (player.isPlaying()) { - playerPause(playerBase, f); - } else { - playerPlay(playerBase, f); - } - } - }); - - final View edit = convertView.findViewById(R.id.recording_player_edit); - edit.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - rename.run(); - } - }); - - final View share = convertView.findViewById(R.id.recording_player_share); - share.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - shareProvider = new PopupShareActionProvider(getContext(), share); - - Intent emailIntent = new Intent(Intent.ACTION_SEND); - emailIntent.setType(Factory.MP4A); - emailIntent.putExtra(Intent.EXTRA_EMAIL, ""); - emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); - emailIntent.putExtra(Intent.EXTRA_SUBJECT, f.getName()); - emailIntent.putExtra(Intent.EXTRA_TEXT, getContext().getString(R.string.shared_via, getContext().getString(R.string.app_name))); - - shareProvider.setShareIntent(emailIntent); - - shareProvider.show(); - } - }); - - View trash = convertView.findViewById(R.id.recording_player_trash); - trash.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - delete.run(); - } - }); - - convertView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - select(-1); - } - }); - } else { - RecordingAnimation.apply(list, convertView, false, scrollState == SCROLL_STATE_IDLE && (int) convertView.getTag() == TYPE_EXPANDED); - convertView.setTag(TYPE_COLLAPSED); - - convertView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - select(position); - } - }); - } - - convertView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - PopupMenu popup = new PopupMenu(getContext(), v); - MenuInflater inflater = popup.getMenuInflater(); - inflater.inflate(R.menu.menu_context, popup.getMenu()); - popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - if (item.getItemId() == R.id.action_delete) { - delete.run(); - return true; - } - if (item.getItemId() == R.id.action_rename) { - rename.run(); - return true; - } - return false; - } - }); - popup.show(); - return true; - } - }); - - return convertView; - } - - void playerPlay(View v, File f) { - if (player == null) - player = MediaPlayer.create(getContext(), Uri.fromFile(f)); - if (player == null) { - Toast.makeText(getContext(), R.string.file_not_found, Toast.LENGTH_SHORT).show(); - return; - } - player.start(); - - updatePlayerRun(v, f); - } - - void playerPause(View v, File f) { - if (player != null) { - player.pause(); - } - if (updatePlayer != null) { - handler.removeCallbacks(updatePlayer); - updatePlayer = null; - } - updatePlayerText(v, f); - } - - void playerStop() { - if (updatePlayer != null) { - handler.removeCallbacks(updatePlayer); - updatePlayer = null; - } - if (player != null) { - player.stop(); - player.release(); - player = null; - } - } - - void updatePlayerRun(final View v, final File f) { - boolean playing = updatePlayerText(v, f); - - if (updatePlayer != null) { - handler.removeCallbacks(updatePlayer); - updatePlayer = null; - } - - if (!playing) { - playerStop(); // clear player instance - updatePlayerText(v, f); // update length - return; - } - - updatePlayer = new Runnable() { - @Override - public void run() { - updatePlayerRun(v, f); - } - }; - handler.postDelayed(updatePlayer, 200); - } - - boolean updatePlayerText(final View v, final File f) { - ImageView i = (ImageView) v.findViewById(R.id.recording_player_play); - - final boolean playing = player != null && player.isPlaying(); - - i.setImageResource(playing ? R.drawable.ic_pause_black_24dp : R.drawable.ic_play_arrow_black_24dp); - - TextView start = (TextView) v.findViewById(R.id.recording_player_start); - SeekBar bar = (SeekBar) v.findViewById(R.id.recording_player_seek); - TextView end = (TextView) v.findViewById(R.id.recording_player_end); - - int c = 0; - int d = durations.get(f); - - if (player != null) { - c = player.getCurrentPosition(); - d = player.getDuration(); - } - - bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - if (!fromUser) - return; - - if (player == null) - playerPlay(v, f); - - if (player != null) { - player.seekTo(progress); - if (!player.isPlaying()) - playerPlay(v, f); - } - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); - - start.setText(MainLibrary.formatDuration(getContext(), c)); - bar.setMax(d); - bar.setKeyProgressIncrement(1); - bar.setProgress(c); - end.setText("-" + MainLibrary.formatDuration(getContext(), d - c)); - - return playing; - } - - public void select(int pos) { - selected = pos; - notifyDataSetChanged(); - playerStop(); - } - - public int getSelected() { - return selected; - } -} \ No newline at end of file diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java deleted file mode 100644 index 543b3e5..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Sound.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.github.axet.audiolibrary.app; - -import android.content.Context; -import android.content.SharedPreferences; -import android.media.AudioFormat; -import android.media.AudioManager; -import android.media.AudioTrack; -import android.preference.PreferenceManager; - -public class Sound extends com.github.axet.androidlibrary.sound.Sound { - public static int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; - // quite root gives me 20db - public static int NOISE_DB = 20; - // max 90 dB detection for android mic - public static int MAXIMUM_DB = 90; - - public Sound(Context context) { - super(context); - } - - public void silent() { - SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - if (shared.getBoolean(MainApplication.PREFERENCE_SILENT, false)) { - super.silent(); - } - } - - public void unsilent() { - SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - if (shared.getBoolean(MainApplication.PREFERENCE_SILENT, false)) { - super.unsilent(); - } - } - - public AudioTrack generateTrack(int sampleRate, short[] buf, int len) { - int end = len; - - int c = 0; - - switch (MainApplication.getChannels(context)) { - case 1: - c = AudioFormat.CHANNEL_OUT_MONO; - break; - case 2: - c = AudioFormat.CHANNEL_OUT_STEREO; - break; - default: - throw new RuntimeException("unknown mode"); - } - - // old phones bug. - // http://stackoverflow.com/questions/27602492 - // - // with MODE_STATIC setNotificationMarkerPosition not called - AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, c, AUDIO_FORMAT, len * (Short.SIZE / 8), AudioTrack.MODE_STREAM); - track.write(buf, 0, len); - if (track.setNotificationMarkerPosition(end) != AudioTrack.SUCCESS) - throw new RuntimeException("unable to set marker"); - return track; - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java deleted file mode 100644 index 37c0379..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/app/Storage.java +++ /dev/null @@ -1,283 +0,0 @@ -package com.github.axet.audiolibrary.app; - -import android.Manifest; -import android.content.Context; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.os.Build; -import android.os.StatFs; -import android.preference.PreferenceManager; -import android.support.v4.content.ContextCompat; - -import com.github.axet.audiolibrary.encoders.Factory; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -public class Storage { - public static final String TMP_REC = "recorind.data"; - public static final String RECORDINGS = "recordings"; - - protected Context context; - - public Storage(Context context) { - this.context = context; - } - - public static final String[] PERMISSIONS = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; - - public boolean permitted(String[] ss) { - if (Build.VERSION.SDK_INT < 11) - return true; - for (String s : ss) { - if (ContextCompat.checkSelfPermission(context, s) != PackageManager.PERMISSION_GRANTED) { - return false; - } - } - return true; - } - - public File getLocalStorage() { - return new File(context.getApplicationInfo().dataDir, RECORDINGS); - } - - public boolean isLocalStorageEmpty() { - return getLocalStorage().listFiles().length == 0; - } - - public boolean isExternalStoragePermitted() { - return permitted(PERMISSIONS); - } - - public boolean recordingPending() { - return getTempRecording().exists(); - } - - public File getStoragePath() { - SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - String path = shared.getString(MainApplication.PREFERENCE_STORAGE, ""); - if (permitted(PERMISSIONS)) { - return new File(path); - } else { - return getLocalStorage(); - } - } - - public void migrateLocalStorage() { - if (!permitted(PERMISSIONS)) { - return; - } - - SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - String path = shared.getString(MainApplication.PREFERENCE_STORAGE, ""); - - File l = getLocalStorage(); - File t = new File(path); - - t.mkdirs(); - - File[] ff = l.listFiles(); - - if (ff == null) - return; - - for (File f : ff) { - File tt = getNextFile(t, f); - move(f, tt); - } - } - - public File getNewFile() { - SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss"); - - SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - String ext = shared.getString(MainApplication.PREFERENCE_ENCODING, ""); - - File parent = getStoragePath(); - if (!parent.exists()) { - if (!parent.mkdirs()) - throw new RuntimeException("Unable to create: " + parent); - } - - return getNextFile(parent, s.format(new Date()), ext); - } - - public static String getNameNoExt(File f) { - String fileName = f.getName(); - - int i = fileName.lastIndexOf('.'); - if (i > 0) { - fileName = fileName.substring(0, i); - } - return fileName; - } - - public static String getExt(File f) { - String fileName = f.getName(); - - int i = fileName.lastIndexOf('.'); - if (i > 0) { - return fileName.substring(i + 1); - } - return ""; - } - - File getNextFile(File parent, File f) { - String fileName = f.getName(); - - String extension = ""; - - int i = fileName.lastIndexOf('.'); - if (i > 0) { - extension = fileName.substring(i + 1); - fileName = fileName.substring(0, i); - } - - return getNextFile(parent, fileName, extension); - } - - protected File getNextFile(File parent, String name, String ext) { - String fileName; - if (ext.isEmpty()) - fileName = name; - else - fileName = String.format("%s.%s", name, ext); - - File file = new File(parent, fileName); - - int i = 1; - while (file.exists()) { - fileName = String.format("%s (%d).%s", name, i, ext); - file = new File(parent, fileName); - i++; - } - -// try { -// file.createNewFile(); -// } catch (IOException e) { -// throw new RuntimeException("Unable to create: " + file, e); -// } - - return file; - } - - public List scan(File dir) { - ArrayList list = new ArrayList<>(); - - File[] ff = dir.listFiles(); - if (ff == null) - return list; - - for (File f : ff) { - if (f.length() > 0) { - String[] ee = Factory.getEncodingValues(context); - String n = f.getName().toLowerCase(); - for (String e : ee) { - if (n.endsWith("." + e)) - list.add(f); - } - } - } - - return list; - } - - // get average recording miliseconds based on compression format - public long average(long free) { - final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - int rate = Integer.parseInt(shared.getString(MainApplication.PREFERENCE_RATE, "")); - String ext = shared.getString(MainApplication.PREFERENCE_ENCODING, ""); - - int m = MainApplication.getChannels(context); - long perSec = Factory.getEncoderRate(ext, rate) * m; - return free / perSec * 1000; - } - - public long getFree(File f) { - while (!f.exists()) - f = f.getParentFile(); - - StatFs fsi = new StatFs(f.getPath()); - if (Build.VERSION.SDK_INT < 18) - return fsi.getBlockSize() * (long) fsi.getAvailableBlocks(); - else - return fsi.getBlockSizeLong() * fsi.getAvailableBlocksLong(); - } - - public File getTempRecording() { - File internal = new File(context.getApplicationInfo().dataDir, TMP_REC); - - if (internal.exists()) - return internal; - - // Starting in KITKAT, no permissions are required to read or write to the returned path; - // it's always accessible to the calling app. - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - if (!permitted(PERMISSIONS)) - return internal; - } - - File c = context.getExternalCacheDir(); - if (c == null) // some old phones 11 with disabled sdcard return null - return internal; - - File external = new File(c, TMP_REC); - - if (external.exists()) - return external; - - long freeI = getFree(internal); - long freeE = getFree(external); - - if (freeI > freeE) - return internal; - else - return external; - } - - public FileOutputStream open(File f) { - File tmp = f; - File parent = tmp.getParentFile(); - if (!parent.exists() && !parent.mkdirs()) { - throw new RuntimeException("unable to create: " + parent); - } - if (!parent.isDirectory()) - throw new RuntimeException("target is not a dir: " + parent); - try { - return new FileOutputStream(tmp, true); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public void delete(File f) { - f.delete(); - } - - public void move(File f, File to) { - try { - InputStream in = new FileInputStream(f); - OutputStream out = new FileOutputStream(to); - - byte[] buf = new byte[1024]; - int len; - while ((len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - in.close(); - out.close(); - f.delete(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Encoder.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Encoder.java deleted file mode 100644 index 69620fb..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Encoder.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -public interface Encoder { - void encode(short[] buf, int len); - - void close(); -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/EncoderInfo.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/EncoderInfo.java deleted file mode 100644 index 3213f8a..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/EncoderInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -public class EncoderInfo { - public int channels; - public int sampleRate; - public int bps; - - public EncoderInfo(int channels, int sampleRate, int bps) { - this.channels = channels; - this.sampleRate = sampleRate; - this.bps = bps; - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java deleted file mode 100644 index 7f281b7..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Factory.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -import android.content.Context; -import android.media.AudioFormat; -import android.os.Build; - -import com.github.axet.audiolibrary.R; -import com.github.axet.audiolibrary.app.RawSamples; -import com.github.axet.audiolibrary.app.Sound; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; - -public class Factory { - - public static String MP4 = "audio/mp4"; - public static String MP4A = "audio/mp4a-latm"; - - public static CharSequence[] getEncodingTexts(Context context) { - String[] aa = context.getResources().getStringArray(R.array.encodings_text); - ArrayList ll = new ArrayList<>(Arrays.asList(aa)); - if (Build.VERSION.SDK_INT >= 18) - ll.add(".m4a"); - if (Build.VERSION.SDK_INT >= 16) - ll.add(".mka"); - ll.add(".ogg"); - return ll.toArray(new String[]{}); - } - - public static String[] getEncodingValues(Context context) { - String[] aa = context.getResources().getStringArray(R.array.encodings_values); - ArrayList ll = new ArrayList<>(Arrays.asList(aa)); - if (Build.VERSION.SDK_INT >= 18) - ll.add("m4a"); - if (Build.VERSION.SDK_INT >= 16) - ll.add("mka"); - ll.add("ogg"); - return ll.toArray(new String[]{}); - } - - public static Encoder getEncoder(String ext, EncoderInfo info, File out) { - if (ext.equals("wav")) { - return new FormatWAV(info, out); - } - if (ext.equals("3gp")) { - return new Format3GP(info, out); - } - if (ext.equals("m4a")) { - return new FormatM4A(info, out); - } - if (ext.equals("mka")) { - return new FormatMKA(info, out); - } - if (ext.equals("ogg")) { - return new FormatOGG(info, out); - } - return null; - } - - public static long getEncoderRate(String ext, int rate) { - if (ext.equals("m4a")) { - long y1 = 365723; // one minute sample 16000Hz - long x1 = 16000; // at 16000 - long y2 = 493743; // one minute sample - long x2 = 44000; // at 44000 - long x = rate; - long y = (x - x1) * (y2 - y1) / (x2 - x1) + y1; - return y / 60; - } - - if (ext.equals("mka")) { // same codec as m4a, but different container - long y1 = 365723; // one minute sample 16000Hz - long x1 = 16000; // at 16000 - long y2 = 493743; // one minute sample - long x2 = 44000; // at 44000 - long x = rate; - long y = (x - x1) * (y2 - y1) / (x2 - x1) + y1; - return y / 60; - } - - if (ext.equals("ogg")) { - long y1 = 174892; // one minute sample 16000Hz - long x1 = 16000; // at 16000 - long y2 = 405565; // one minute sample - long x2 = 44000; // at 44000 - long x = rate; - long y = (x - x1) * (y2 - y1) / (x2 - x1) + y1; - return y / 60; - } - - // default raw - int c = Sound.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1; - return c * rate; - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FileEncoder.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FileEncoder.java deleted file mode 100644 index a3f538e..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FileEncoder.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -import android.content.Context; -import android.os.Handler; -import android.util.Log; - -import com.github.axet.audiolibrary.app.RawSamples; - -import java.io.File; - -public class FileEncoder { - public static final String TAG = FileEncoder.class.getSimpleName(); - - Context context; - Handler handler; - - File in; - Encoder encoder; - Thread thread; - long samples; - long cur; - Throwable t; - - public FileEncoder(Context context, File in, Encoder encoder) { - this.context = context; - this.in = in; - this.encoder = encoder; - handler = new Handler(); - } - - public void run(final Runnable progress, final Runnable done, final Runnable error) { - thread = new Thread(new Runnable() { - @Override - public void run() { - cur = 0; - - RawSamples rs = new RawSamples(in); - - samples = rs.getSamples(); - - short[] buf = new short[1000]; - - rs.open(buf.length); - - try { - while (!Thread.currentThread().isInterrupted()) { - int len = rs.read(buf); - if (len <= 0) { - break; - } else { - encoder.encode(buf, len); - handler.post(progress); - synchronized (thread) { - cur += len; - } - } - } - encoder.close(); - if (rs != null) { - rs.close(); - } - handler.post(done); - } catch (RuntimeException e) { - Log.e(TAG, "Exception", e); - t = e; - handler.post(error); - } - } - }); - thread.start(); - } - - public int getProgress() { - synchronized (thread) { - return (int) (cur * 100 / samples); - } - } - - public Throwable getException() { - return t; - } - - public void close() { - if (thread != null) { - thread.interrupt(); - thread = null; - } - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Format3GP.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Format3GP.java deleted file mode 100755 index dd77c0a..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/Format3GP.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -import android.annotation.TargetApi; -import android.media.MediaFormat; - -import java.io.File; - -@TargetApi(21) -public class Format3GP extends MuxerMP4 { - - public Format3GP(EncoderInfo info, File out) { - MediaFormat format = new MediaFormat(); - - // for high bitrate AMR_WB - { -// final int kBitRates[] = {6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850}; - -// format.setString(MediaFormat.KEY_MIME, "audio/amr-wb"); -// format.setInteger(MediaFormat.KEY_SAMPLE_RATE, info.sampleRate); -// format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, info.channels); -// format.setInteger(MediaFormat.KEY_BIT_RATE, 23850); // set maximum - } - - // for low bitrate, AMR_NB - { -// final int kBitRates[] = {4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200}; - - format.setString(MediaFormat.KEY_MIME, "audio/3gpp"); - format.setInteger(MediaFormat.KEY_SAMPLE_RATE, info.sampleRate); // 8000 only supported - format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, info.channels); - format.setInteger(MediaFormat.KEY_BIT_RATE, 12200); // set maximum - } - - create(info, format, out); - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatM4A.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatM4A.java deleted file mode 100755 index f03eff4..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatM4A.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -import android.annotation.TargetApi; -import android.media.MediaCodecInfo; -import android.media.MediaFormat; - -import java.io.File; -import java.util.Map; - -@TargetApi(18) -public class FormatM4A extends MuxerMP4 { - - public FormatM4A(EncoderInfo info, File out) { - Map map = MuxerMP4.findEncoder(Factory.MP4); - if (map.isEmpty()) - throw new RuntimeException("mp4 not supported"); - MediaFormat format = MuxerMP4.getDefault(Factory.MP4A, map); - format.setInteger(MediaFormat.KEY_SAMPLE_RATE, info.sampleRate); - format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, info.channels); - format.setInteger(MediaFormat.KEY_BIT_RATE, 64000); - create(info, format, out); - } - -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatMKA.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatMKA.java deleted file mode 100755 index 80f86a9..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatMKA.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -import android.annotation.TargetApi; -import android.media.MediaCodec; -import android.media.MediaCodecInfo; -import android.media.MediaFormat; -import android.os.Build; - -import org.ebml.io.FileDataWriter; -import org.ebml.matroska.MatroskaFileFrame; -import org.ebml.matroska.MatroskaFileTrack; -import org.ebml.matroska.MatroskaFileWriter; - -import java.io.File; -import java.io.IOException; -import java.nio.ByteBuffer; - -@TargetApi(16) // mp4/aac codec -public class FormatMKA implements Encoder { - public static final String KEY_AAC_SBR_MODE = "aac-sbr-mode"; // MediaFormat.KEY_AAC_SBR_MODE - - EncoderInfo info; - MediaCodec encoder; - long NumSamples; - ByteBuffer input; - int inputIndex; - MatroskaFileWriter writer; - MatroskaFileTrack track; - MatroskaFileTrack.MatroskaAudioTrack audio; - - MatroskaFileFrame old; - - public FormatMKA(EncoderInfo info, File out) { - MediaFormat format = new MediaFormat(); - format.setString(MediaFormat.KEY_MIME, Factory.MP4A); - format.setInteger(MediaFormat.KEY_SAMPLE_RATE, info.sampleRate); - format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, info.channels); - format.setInteger(MediaFormat.KEY_BIT_RATE, 64000); - format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE); - format.setInteger(KEY_AAC_SBR_MODE, 0); - create(info, format, out); - } - - public void create(EncoderInfo info, MediaFormat format, File out) { - this.info = info; - try { - encoder = MediaCodec.createEncoderByType(format.getString(MediaFormat.KEY_MIME)); - encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); - encoder.start(); - writer = new MatroskaFileWriter(new FileDataWriter(out.getAbsolutePath())); - audio = new MatroskaFileTrack.MatroskaAudioTrack(); - audio.setSamplingFrequency(info.sampleRate); - audio.setOutputSamplingFrequency(info.sampleRate); - audio.setBitDepth(info.bps); - audio.setChannels((short) info.channels); - track = new MatroskaFileTrack(); - track.setCodecID("A_AAC"); - track.setAudio(audio); - track.setTrackType(MatroskaFileTrack.TrackType.AUDIO); - writer.addTrack(track); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void encode(short[] buf, int len) { - for (int offset = 0; offset < len; offset++) { - if (input == null) { - inputIndex = encoder.dequeueInputBuffer(-1); - if (inputIndex < 0) - throw new RuntimeException("unable to open encoder input buffer"); - if (Build.VERSION.SDK_INT >= 21) - input = encoder.getInputBuffer(inputIndex); - else - input = encoder.getInputBuffers()[inputIndex]; - input.clear(); - } - input.putShort(buf[offset]); - if (!input.hasRemaining()) { - queue(); - } - } - } - - void queue() { - if (input == null) - return; - encoder.queueInputBuffer(inputIndex, 0, input.position(), getCurrentTimeStamp(), 0); - NumSamples += input.position() / info.channels / (Short.SIZE / 8); - input = null; - while (encode()) - ;// do encode() - } - - public static ByteBuffer clone(ByteBuffer original) { - ByteBuffer clone = ByteBuffer.allocate(original.capacity()); - original.rewind();//copy from the beginning - clone.put(original); - original.rewind(); - clone.flip(); - return clone; - } - - public static final int BUFFER_FLAG_KEY_FRAME = 1; // MediaCodec.BUFFER_FLAG_KEY_FRAME - - boolean encode() { - MediaCodec.BufferInfo outputInfo = new MediaCodec.BufferInfo(); - int outputIndex = encoder.dequeueOutputBuffer(outputInfo, 0); - if (outputIndex == MediaCodec.INFO_TRY_AGAIN_LATER) - return false; - - if (outputIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { // never get called on API 16 - return true; - } - - if (outputIndex >= 0) { - ByteBuffer output; - if (Build.VERSION.SDK_INT >= 21) - output = encoder.getOutputBuffer(outputIndex); - else - output = encoder.getOutputBuffers()[outputIndex]; - output.position(outputInfo.offset); - output.limit(outputInfo.offset + outputInfo.size); - old(outputInfo.presentationTimeUs / 1000); - if ((outputInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == MediaCodec.BUFFER_FLAG_CODEC_CONFIG) { - track.setCodecPrivate(clone(output)); - writer.flush(); - encoder.releaseOutputBuffer(outputIndex, false); - } else { - MatroskaFileFrame frame = new MatroskaFileFrame(); - frame.setKeyFrame((outputInfo.flags & BUFFER_FLAG_KEY_FRAME) == BUFFER_FLAG_KEY_FRAME); - frame.setTimecode(outputInfo.presentationTimeUs / 1000); - frame.setTrackNo(track.getTrackNo()); - frame.setData(clone(output)); - encoder.releaseOutputBuffer(outputIndex, false); - old = frame; - } - } - - return true; - } - - void old(long cur) { - if (old != null) { - old.setDuration(cur - old.getTimecode()); - writer.addFrame(old); - writer.flush(); - old = null; - } - } - - public void close() { - end(); - encoder.release(); - writer.close(); - } - - long getCurrentTimeStamp() { - return NumSamples * 1000 * 1000 / info.sampleRate; - } - - public void end() { - if (input != null) { - queue(); - } - int inputIndex = encoder.dequeueInputBuffer(-1); - if (inputIndex >= 0) { - ByteBuffer input; - if (Build.VERSION.SDK_INT >= 21) - input = encoder.getInputBuffer(inputIndex); - else - input = encoder.getInputBuffers()[inputIndex]; - input.clear(); - encoder.queueInputBuffer(inputIndex, 0, 0, getCurrentTimeStamp(), MediaCodec.BUFFER_FLAG_END_OF_STREAM); - } - while (encode()) - ;// do encode() - old(getCurrentTimeStamp() / 1000); - writer.setDuration(getCurrentTimeStamp() / 1000); - encoder.stop(); - } - - public EncoderInfo getInfo() { - return info; - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatOGG.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatOGG.java deleted file mode 100755 index 3a94ac0..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatOGG.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -import com.github.axet.vorbisjni.Vorbis; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; - -public class FormatOGG implements Encoder { - FileOutputStream writer; - Vorbis vorbis; - - public FormatOGG(EncoderInfo info, File out) { - vorbis = new Vorbis(); - vorbis.open(info.channels, info.sampleRate, 0.4f); - try { - writer = new FileOutputStream(out); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void encode(short[] buf, int len) { - byte[] bb = vorbis.encode(buf, len); - try { - writer.write(bb); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void close() { - try { - byte[] bb = vorbis.encode(null, 0); - writer.write(bb); - } catch (IOException e) { - throw new RuntimeException(e); - } - vorbis.close(); - } -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatWAV.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatWAV.java deleted file mode 100755 index 4dad027..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/FormatWAV.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -// based on http://soundfile.sapp.org/doc/WaveFormat/ - -import java.io.*; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -public class FormatWAV implements Encoder { - int NumSamples; - EncoderInfo info; - int BytesPerSample; - RandomAccessFile outFile; - - ByteOrder order = ByteOrder.LITTLE_ENDIAN; - - public FormatWAV(EncoderInfo info, File out) { - this.info = info; - NumSamples = 0; - - BytesPerSample = info.bps / 8; - - try { - outFile = new RandomAccessFile(out, "rw"); - } catch (IOException e) { - throw new RuntimeException(e); - } - - save(); - } - - public void save() { - int SubChunk1Size = 16; - int SubChunk2Size = NumSamples * info.channels * BytesPerSample; - int ChunkSize = 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size); - - write("RIFF", ByteOrder.BIG_ENDIAN); - write(ChunkSize, order); - write("WAVE", ByteOrder.BIG_ENDIAN); - - int ByteRate = info.sampleRate * info.channels * BytesPerSample; - short AudioFormat = 1; // PCM = 1 (i.e. Linear quantization) - int BlockAlign = BytesPerSample * info.channels; - - write("fmt ", ByteOrder.BIG_ENDIAN); - write(SubChunk1Size, order); - write((short)AudioFormat, order); //short - write((short) info.channels, order); // short - write(info.sampleRate, order); - write(ByteRate, order); - write((short)BlockAlign, order); // short - write((short)info.bps, order); // short - - write("data", ByteOrder.BIG_ENDIAN); - write(SubChunk2Size, order); - } - - void write(String str, ByteOrder order) { - try { - byte[] cc = str.getBytes("UTF-8"); - ByteBuffer bb = ByteBuffer.allocate(cc.length); - bb.order(order); - bb.put(cc); - bb.flip(); - - outFile.write(bb.array()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - void write(int i, ByteOrder order) { - ByteBuffer bb = ByteBuffer.allocate(Integer.SIZE / Byte.SIZE); - bb.order(order); - bb.putInt(i); - bb.flip(); - - try { - outFile.write(bb.array()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - void write(short i, ByteOrder order) { - ByteBuffer bb = ByteBuffer.allocate(Short.SIZE / Byte.SIZE); - bb.order(order); - bb.putShort(i); - bb.flip(); - - try { - outFile.write(bb.array()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public void encode(short[] buf, int buflen) { - NumSamples += buflen / info.channels; - try { - ByteBuffer bb = ByteBuffer.allocate(buflen * (Short.SIZE / Byte.SIZE)); - bb.order(order); - for (int i = 0; i < buflen; i++) - bb.putShort(buf[i]); - bb.flip(); - outFile.write(bb.array()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public void end() { - try { - outFile.seek(0); - save(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public void close() { - try { - outFile.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public EncoderInfo getInfo() { - return info; - } - -} \ No newline at end of file diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/MuxerMP4.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/MuxerMP4.java deleted file mode 100755 index e460a34..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/encoders/MuxerMP4.java +++ /dev/null @@ -1,182 +0,0 @@ -package com.github.axet.audiolibrary.encoders; - -import android.annotation.TargetApi; -import android.media.MediaCodec; -import android.media.MediaCodecInfo; -import android.media.MediaCodecList; -import android.media.MediaFormat; -import android.media.MediaMuxer; -import android.os.Build; - -import java.io.File; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -@TargetApi(18) // depends on MediaMuxer -public class MuxerMP4 implements Encoder { - EncoderInfo info; - MediaCodec encoder; - MediaMuxer muxer; - int audioTrackIndex; - long NumSamples; - ByteBuffer input; - int inputIndex; - - public static Map findEncoder(String mime) { - Map map = new HashMap<>(); - - mime = mime.toLowerCase(); - - int numCodecs = MediaCodecList.getCodecCount(); - for (int i = 0; i < numCodecs; i++) { - MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i); - - if (!codecInfo.isEncoder()) { - continue; - } - - String[] types = codecInfo.getSupportedTypes(); - for (int j = 0; j < types.length; j++) { - String t = types[j].toLowerCase(); - if (t.startsWith(mime)) { - map.put(t, codecInfo); - } - } - } - return map; - } - - public static String prefered(String pref, Map map) { - pref = pref.toLowerCase(); - Iterator i = map.keySet().iterator(); - while (i.hasNext()) { - String m = (String) i.next(); - m = m.toLowerCase(); - if (m.startsWith(pref)) - return m; - } - i = map.keySet().iterator(); - if (i.hasNext()) { - return (String) i.next(); - } - return null; - } - - public static MediaFormat getDefault(String pref, Map map) { - String p = prefered(pref, map); - if (Build.VERSION.SDK_INT >= 21) { - return map.get(p).getCapabilitiesForType(p).getDefaultFormat(); - } else { - MediaFormat format = new MediaFormat(); - format.setString(MediaFormat.KEY_MIME, pref); - return format; - } - } - - public void create(EncoderInfo info, MediaFormat format, File out) { - this.info = info; - try { - encoder = MediaCodec.createEncoderByType(format.getString(MediaFormat.KEY_MIME)); - encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); - encoder.start(); - muxer = new MediaMuxer(out.getAbsolutePath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void encode(short[] buf, int len) { - for (int offset = 0; offset < len; offset++) { - if (input == null) { - inputIndex = encoder.dequeueInputBuffer(-1); - if (inputIndex < 0) - throw new RuntimeException("unable to open encoder input buffer"); - if (Build.VERSION.SDK_INT >= 21) - input = encoder.getInputBuffer(inputIndex); - else - input = encoder.getInputBuffers()[inputIndex]; - input.clear(); - } - input.putShort(buf[offset]); - if (!input.hasRemaining()) { - queue(); - } - } - } - - void queue() { - if (input == null) - return; - encoder.queueInputBuffer(inputIndex, 0, input.position(), getCurrentTimeStamp(), 0); - NumSamples += input.position() / info.channels / (Short.SIZE / 8); - input = null; - while (encode()) - ;// do encode() - } - - boolean encode() { - MediaCodec.BufferInfo outputInfo = new MediaCodec.BufferInfo(); - int outputIndex = encoder.dequeueOutputBuffer(outputInfo, 0); - if (outputIndex == MediaCodec.INFO_TRY_AGAIN_LATER) - return false; - - if (outputIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { - audioTrackIndex = muxer.addTrack(encoder.getOutputFormat()); - muxer.start(); - return true; - } - - if (outputIndex >= 0) { - ByteBuffer output; - if (Build.VERSION.SDK_INT >= 21) - output = encoder.getOutputBuffer(outputIndex); - else - output = encoder.getOutputBuffers()[outputIndex]; - output.position(outputInfo.offset); - output.limit(outputInfo.offset + outputInfo.size); - muxer.writeSampleData(audioTrackIndex, output, outputInfo); - encoder.releaseOutputBuffer(outputIndex, false); - } - - return true; - } - - public void close() { - end(); - encoder.release(); - muxer.release(); - } - - long getCurrentTimeStamp() { - return NumSamples * 1000 * 1000 / info.sampleRate; - } - - public void end() { - if (input != null) { - queue(); - } - int inputIndex = encoder.dequeueInputBuffer(-1); - if (inputIndex >= 0) { - ByteBuffer input; - if (Build.VERSION.SDK_INT >= 21) - input = encoder.getInputBuffer(inputIndex); - else - input = encoder.getInputBuffers()[inputIndex]; - input.clear(); - encoder.queueInputBuffer(inputIndex, 0, 0, getCurrentTimeStamp(), MediaCodec.BUFFER_FLAG_END_OF_STREAM); - } - while (encode()) - ;// do encode() - encoder.stop(); - muxer.stop(); - } - - public EncoderInfo getInfo() { - return info; - } - -} \ No newline at end of file diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTBarView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTBarView.java deleted file mode 100644 index 63aad5c..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTBarView.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.github.axet.audiolibrary.widgets; - -import android.content.Context; -import android.graphics.Canvas; -import android.util.AttributeSet; - -import com.github.axet.androidlibrary.widgets.ThemeUtils; - -public class FFTBarView extends FFTView { - public static final String TAG = FFTBarView.class.getSimpleName(); - - int barCount; - float barWidth; - float barDeli; - - public FFTBarView(Context context) { - this(context, null); - } - - public FFTBarView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public FFTBarView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - create(); - } - - void create() { - super.create(); - } - - public void setBuffer(double[] buf) { - super.setBuffer(buf); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - // set initial width - int w = ThemeUtils.dp2px(getContext(), 15); - int d = ThemeUtils.dp2px(getContext(), 4); - int s = w + d; - - int mw = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); - - // get count of bars and delimeters - int dc = (mw - w) / s; - int bc = dc + 1; - - // get rate - float k = w / d; - - // get one part of (bar+del) size - float e = mw / (bc * k + dc); - - barCount = bc; - barWidth = e * k; - barDeli = e; - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - } - - @Override - public void onDraw(Canvas canvas) { - if (barCount == 0) - return; - - int h = getHeight() - getPaddingTop() - getPaddingBottom(); - - float left = getPaddingLeft(); - - for (int i = 0; i < barCount; i++) { - double max = 0; - - if (buffer != null) { - int step = buffer.length / barCount; - int offset = i * step; - int end = Math.min(offset + step, buffer.length); - for (int k = offset; k < end; k++) { - double s = buffer[k]; - max = Math.max(max, s); - } - } - - float y = getPaddingTop() + h - h * ((float) max / 0x7fff) - ThemeUtils.dp2px(getContext(), 1); - - if (y < getPaddingTop()) - y = getPaddingTop(); - - canvas.drawRect(left, y, left + barWidth, getPaddingTop() + h, paint); - left += barWidth + barDeli; - } - } - -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java deleted file mode 100644 index fa98488..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTChartView.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.github.axet.audiolibrary.widgets; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.util.AttributeSet; - -import com.github.axet.audiolibrary.app.RawSamples; -import com.github.axet.audiolibrary.app.Sound; - -public class FFTChartView extends FFTView { - public static final String TAG = FFTChartView.class.getSimpleName(); - - public FFTChartView(Context context) { - this(context, null); - } - - public FFTChartView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public FFTChartView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - create(); - } - - void create() { - super.create(); - } - - public void setBuffer(double[] buf) { - super.setBuffer(buf); - } - - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - } - - @Override - public void onDraw(Canvas canvas) { - if (buffer == null) - return; - - canvas.drawColor(Color.RED); - - int h = getHeight(); - - float startX = 0, startY = h; - - int w = getWidth() - getPaddingLeft() - getPaddingRight(); - - float step = w / (float) buffer.length; - - double min = Integer.MAX_VALUE; - double max = Integer.MIN_VALUE; - - for (int i = 0; i < buffer.length; i++) { - double v = buffer[i]; - - min = Math.min(v, min); - max = Math.max(v, max); - - v = (Sound.MAXIMUM_DB + v) / Sound.MAXIMUM_DB; - - float endX = startX; - float endY = (float) (h - h * v); - - canvas.drawLine(startX, startY, endX, endY, paint); - - startX = endX + step; - startY = endY; - } - - String tMin = "" + min; - canvas.drawText(tMin, 0, getHeight(), textPaint); - - String tMax = "" + max; - textPaint.getTextBounds(tMax, 0, tMax.length(), textBounds); - canvas.drawText("" + max, w - textBounds.width(), getHeight(), textPaint); - } - -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTView.java deleted file mode 100644 index 508eabd..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/FFTView.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.github.axet.audiolibrary.widgets; - -import android.content.Context; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.util.AttributeSet; -import android.view.View; - -import com.github.axet.androidlibrary.widgets.ThemeUtils; - -import org.apache.commons.math3.complex.Complex; -import org.apache.commons.math3.transform.DftNormalization; -import org.apache.commons.math3.transform.FastFourierTransformer; -import org.apache.commons.math3.transform.TransformType; - -public class FFTView extends View { - public static final String TAG = FFTView.class.getSimpleName(); - - Paint paint; - double[] buffer; - - Paint textPaint; - Rect textBounds; - - public FFTView(Context context) { - this(context, null); - } - - public FFTView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public FFTView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - create(); - } - - void create() { - paint = new Paint(); - paint.setColor(0xff0433AE); - paint.setStrokeWidth(ThemeUtils.dp2px(getContext(), 1)); - - textBounds = new Rect(); - - textPaint = new Paint(); - textPaint.setColor(Color.GRAY); - textPaint.setAntiAlias(true); - textPaint.setTextSize(20f); - - if (isInEditMode()) { - short[] b = simple(); - b = generateSound(16000, 4000, 100); - buffer = fft(b, 0, b.length); - //buffer = RawSamples.generateSound(16000, 4000, 100); - //buffer = RawSamples.fft(buffer, 0, buffer.length); - } - } - - public void setBuffer(double[] buf) { - buffer = buf; - } - - public static short[] generateSound(int sampleRate, int freqHz, int durationMs) { - int count = sampleRate * durationMs / 1000; - short[] samples = new short[count]; - for (int i = 0; i < count; i++) { - short sample = (short) (Math.sin(2 * Math.PI * i / (sampleRate / freqHz)) * 0x7FFF); - samples[i] = sample; - } - return samples; - } - - public static double[] asDouble(short[] buffer, int offset, int len) { - double[] dd = new double[len]; - for (int i = 0; i < len; i++) { - dd[i] = buffer[offset + i] / (float) 0x7fff; - } - return dd; - } - - public static double[] fft(short[] buffer, int offset, int len) { - int len2 = (int) Math.pow(2, Math.ceil(Math.log(len) / Math.log(2))); - - final double[][] dataRI = new double[][]{ - new double[len2], new double[len2] - }; - - double[] dataR = dataRI[0]; - double[] dataI = dataRI[1]; - - double powerInput = 0; - for (int i = 0; i < len; i++) { - dataR[i] = buffer[offset + i] / (float) 0x7fff; - powerInput += dataR[i] * dataR[i]; - } - powerInput = Math.sqrt(powerInput / len); - - FastFourierTransformer.transformInPlace(dataRI, DftNormalization.STANDARD, TransformType.FORWARD); - - double[] data = new double[len2 / 2]; - - data[0] = 10 * Math.log10(Math.pow(new Complex(dataR[0], dataI[0]).abs() / len2, 2)); - - double powerOutput = 0; - for (int i = 1; i < data.length; i++) { - Complex c = new Complex(dataR[i], dataI[i]); - double p = c.abs(); - p = p / len2; - p = p * p; - p = p * 2; - double dB = 10 * Math.log10(p); - - powerOutput += p; - data[i] = dB; - } - powerOutput = Math.sqrt(powerOutput); - -// if(powerInput != powerOutput) { -// throw new RuntimeException("in " + powerInput + " out " + powerOutput); -// } - - return data; - } - - public static short[] simple() { - int sampleRate = 1000; - int count = sampleRate; - short[] samples = new short[count]; - for (int i = 0; i < count; i++) { - double x = i / (double) count; - double y = 0; - //y += 0.6 * Math.sin(20 * 2 * Math.PI * x); - //y += 0.4 * Math.sin(50 * 2 * Math.PI * x); - //y += 0.2 * Math.sin(80 * 2 * Math.PI * x); - y += Math.sin(100 * 2 * Math.PI * x); - y += Math.sin(200 * 2 * Math.PI * x); - y += Math.sin(300 * 2 * Math.PI * x); - // max = 2.2; - samples[i] = (short) (y / 3 * 0x7fff); - } - return samples; - } - -} diff --git a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java b/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java deleted file mode 100644 index 680f4f5..0000000 --- a/android-audio-library/src/main/java/com/github/axet/audiolibrary/widgets/PitchView.java +++ /dev/null @@ -1,693 +0,0 @@ -package com.github.axet.audiolibrary.widgets; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.os.Handler; -import android.util.AttributeSet; -import android.view.View; -import android.view.ViewGroup; - -import com.github.axet.androidlibrary.widgets.ThemeUtils; -import com.github.axet.audiolibrary.R; -import com.github.axet.audiolibrary.app.RawSamples; -import com.github.axet.audiolibrary.app.Sound; - -import java.util.LinkedList; -import java.util.List; - -public class PitchView extends ViewGroup { - public static final String TAG = PitchView.class.getSimpleName(); - - // pitch delimiter length in dp - public static final float PITCH_DELIMITER = 1f; - // pitch length in dp - public static final float PITCH_WIDTH = 2f; - - // update pitchview in milliseconds - public static final int UPDATE_SPEED = 10; - - // edit update time - public static final int EDIT_UPDATE_SPEED = 250; - - // 'pitch length' in milliseconds (100ms) - // - // in other words how many milliseconds do we need to show whole pitch. - int pitchTime; - - List data = new LinkedList<>(); - - // how many pitches we can fit on screen - int pitchScreenCount; - // how many pitches we should fit in memory - int pitchMemCount; - // pitch delimiter length in px - int pitchDlimiter; - // pitch length in px - int pitchWidth; - // pitch length in pn + pitch delimiter length in px - int pitchSize; - - PitchGraphView graph; - PitchCurrentView current; - - long time = 0; - - // how many samples were cut from begining of 'data' list - long samples = 0; - - Runnable edit; - // index - int editPos = -1; - boolean editFlash = false; - // current playing position in samples - float playPos = -1; - Runnable play; - - Runnable draw; - float offset = 0; - - Handler handler; - - public static class HandlerUpdate implements Runnable { - long start; - long updateSpeed; - Handler handler; - Runnable run; - - public static HandlerUpdate start(HandlerUpdate r, Handler handler, Runnable run, long updateSpeed) { - r.run = run; - r.start = System.currentTimeMillis(); - r.updateSpeed = updateSpeed; - r.handler = handler; - // post instead of draw.run() so 'start' will measure actual queue time - handler.postDelayed(r, updateSpeed); - return r; - } - - public static HandlerUpdate start(Handler handler, Runnable run, long updateSpeed) { - HandlerUpdate r = new HandlerUpdate(); - return start(r, handler, run, updateSpeed); - } - - - public static void stop(Handler handler, Runnable run) { - handler.removeCallbacks(run); - } - - @Override - public void run() { - long cur = System.currentTimeMillis(); - - long diff = cur - start; - - start = cur; - - long delay = updateSpeed + (updateSpeed - diff); - if (delay > updateSpeed) - delay = updateSpeed; - - post(delay); - } - - void post(long delay) { - this.run.run(); - - if (delay > 0) - this.handler.postDelayed(this, delay); - else - this.handler.post(this); - } - } - - // if CPU speed not enough skip frames - public static class FallbackUpdate extends HandlerUpdate { - Runnable fallback; - long slow; - - public static FallbackUpdate start(Handler handler, Runnable run, Runnable fallback, long updateSpeed) { - FallbackUpdate r = new FallbackUpdate(); - r.fallback = fallback; - r.slow = updateSpeed / 4; - return (FallbackUpdate) start(r, handler, run, updateSpeed); - } - - @Override - void post(long delay) { - if (delay < slow) { - this.fallback.run(); - } else { - this.run.run(); - } - if (delay > 0) - this.handler.postDelayed(this, delay); - else - this.handler.post(this); - } - } - - public class PitchGraphView extends View { - Paint paint; - Paint paintRed; - Paint editPaint; - Paint playPaint; - Paint cutColor; - - public PitchGraphView(Context context) { - this(context, null); - } - - public PitchGraphView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PitchGraphView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - paint = new Paint(); - paint.setColor(getThemeColor(R.attr.colorPrimary)); - paint.setStrokeWidth(pitchWidth); - - paintRed = new Paint(); - paintRed.setColor(Color.RED); - paintRed.setStrokeWidth(pitchWidth); - - cutColor = new Paint(); - cutColor.setColor(getThemeColor(android.R.attr.textColorHint)); - cutColor.setStrokeWidth(pitchWidth); - - editPaint = new Paint(); - editPaint.setColor(getThemeColor(R.attr.colorPrimaryDark)); - editPaint.setStrokeWidth(pitchWidth); - - playPaint = new Paint(); - playPaint.setColor(getThemeColor(R.attr.colorPrimaryDark)); - playPaint.setStrokeWidth(pitchWidth / 2); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - int w = MeasureSpec.getSize(widthMeasureSpec); - - pitchScreenCount = w / pitchSize + 1; - - pitchMemCount = pitchScreenCount + 1; - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - - fit(pitchScreenCount); - } - - public void calc() { - if (data.size() >= pitchMemCount) { - long cur = System.currentTimeMillis(); - - float tick = (cur - time) / (float) pitchTime; - - // force clear queue - if (data.size() > pitchMemCount + 1) { - tick = 0; - time = cur; - fit(pitchMemCount); - } - - if (tick > 1) { - if (data.size() > pitchMemCount) { - tick -= 1; - time += pitchTime; - } else if (data.size() == pitchMemCount) { - tick = 0; - time = cur; - } - fit(data.size() - 1); - } - - offset = pitchSize * tick; - } - } - - @Override - public void onDraw(Canvas canvas) { - int m = Math.min(pitchMemCount, data.size()); - -// if (edit != null) { -// float x = editPos * pitchSize + pitchSize / 2f; -// canvas.drawRect(x, 0, getWidth(), getHeight(), bg_cut); -// } - - for (int i = 0; i < m; i++) { - double dB = filterDB(i); - - float left = (float) dB; - float right = (float) dB; - - float mid = getHeight() / 2f; - - float x = -offset + i * pitchSize + pitchSize / 2f; - - Paint p = paint; - - if (getDB(i) < 0) { - p = paintRed; - left = 1; - right = 1; - } - - if (editPos != -1 && i >= editPos) - p = cutColor; - - // left channel pitch - canvas.drawLine(x, mid, x, mid - mid * left - 1, p); - // right channel pitch - canvas.drawLine(x, mid, x, mid + mid * right + 1, p); - } - - // paint edit mark - if (editPos != -1 && editFlash) { - float x = editPos * pitchSize + pitchSize / 2f; - canvas.drawLine(x, 0, x, getHeight(), editPaint); - } - - // paint play mark - if (playPos > 0) { - float x = playPos * pitchSize + pitchSize / 2f; - canvas.drawLine(x, 0, x, getHeight(), playPaint); - } - } - } - - public class PitchCurrentView extends View { - Paint paint; - Paint textPaint; - String text; - Rect textBounds; - - double dB; - - public PitchCurrentView(Context context) { - this(context, null); - } - - public PitchCurrentView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PitchCurrentView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - text = "100 " + getContext().getString(R.string.db); - textBounds = new Rect(); - - textPaint = new Paint(); - textPaint.setColor(Color.GRAY); - textPaint.setAntiAlias(true); - textPaint.setTextSize(20f); - - paint = new Paint(); - paint.setColor(getThemeColor(R.attr.colorPrimary)); - paint.setStrokeWidth(pitchWidth); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int w = MeasureSpec.getSize(widthMeasureSpec); - textPaint.getTextBounds(this.text, 0, this.text.length(), textBounds); - - int h = getPaddingTop(); - h += textBounds.height(); - h += ThemeUtils.dp2px(getContext(), 2); - h += pitchWidth + getPaddingBottom(); - - setMeasuredDimension(w, h); - } - - public void setText(String text) { - this.text = text; - textPaint.getTextBounds(this.text, 0, this.text.length(), textBounds); - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - } - - void update(int end) { - dB = getDB(end) / Sound.MAXIMUM_DB; - - String str = ""; - - str = Integer.toString((int) getDB(end)) + " " + getContext().getString(R.string.db); - - setText(str); - } - - @Override - public void onDraw(Canvas canvas) { - if (data.size() > 0) { - current.update(getEnd()); - } - - float y = getPaddingTop() + textBounds.height(); - - int x = getWidth() / 2 - textBounds.width() / 2; - canvas.drawText(text, x, y, textPaint); - - y += ThemeUtils.dp2px(getContext(), 2); - - float left = (float) dB; - float right = (float) dB; - - float mid = getWidth() / 2f; - - y += pitchWidth / 2; - - canvas.drawLine(mid, y, mid - mid * left - 1, y, paint); - canvas.drawLine(mid, y, mid + mid * right + 1, y, paint); - } - } - - public PitchView(Context context) { - this(context, null); - } - - public PitchView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PitchView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - create(); - } - - void create() { - handler = new Handler(); - - pitchDlimiter = ThemeUtils.dp2px(getContext(), PITCH_DELIMITER); - pitchWidth = ThemeUtils.dp2px(getContext(), PITCH_WIDTH); - pitchSize = pitchWidth + pitchDlimiter; - - pitchTime = pitchSize * UPDATE_SPEED; - - graph = new PitchGraphView(getContext()); - addView(graph); - -// fft = new FFTChartView(getContext()) { -// @Override -// public void onDraw(Canvas canvas) { -// if (data.size() > 0) { -// short[] buf = dataSamples.get(getEnd()); -// double[] d = FFTView.fft(buf, 0, buf.length); -// //double[] d = asDouble(buf, 0, buf.length); -// fft.setBuffer(d); -// } -// -// super.onDraw(canvas); -// } -// }; -// fft.setPadding(0, ThemeUtils.dp2px(2), 0, 0); -// addView(fft); - - current = new PitchCurrentView(getContext()); - current.setPadding(0, ThemeUtils.dp2px(getContext(), 2), 0, 0); - addView(current); - - if (isInEditMode()) { - for (int i = 0; i < 3000; i++) { - data.add(-Math.sin(i) * Sound.MAXIMUM_DB); - } - } - - time = System.currentTimeMillis(); - } - - public int getThemeColor(int id) { - return ThemeUtils.getThemeColor(getContext(), id); - } - - public int getMaxPitchCount(int width) { - int pitchScreenCount = width / pitchSize + 1; - - int pitchMemCount = pitchScreenCount + 1; - - return pitchMemCount; - } - - public void clear(long s) { - data.clear(); - samples = s; - offset = 0; - edit = null; - draw = null; - play = null; - } - - public void fit(int max) { - if (max < 0) // -1 - return; - if (data.size() > max) { - int cut = data.size() - max; - data.subList(0, cut).clear(); - samples += cut; - int m = data.size() - 1; - // screen rotate may cause play/edit offsets off screen - if (editPos > m) - editPos = m; - if (playPos > m) - playPos = m; - } - } - - public void add(double a) { - data.add(a); - } - - public void drawCalc() { - graph.calc(); - draw(); - } - - public void drawEnd() { - fit(pitchMemCount); - offset = 0; - draw(); - } - - public int getEnd() { - int end = data.size() - 1; - - if (editPos != -1) { - end = editPos; - } - if (playPos > 0) { - end = (int) playPos; - } - - return end; - } - - public double getDB(int i) { - double db = data.get(i); - - db = Sound.MAXIMUM_DB + db; - - return db; - } - - public double filterDB(int i) { - double db = getDB(i); - - // do not show below NOISE_DB - db = db - Sound.NOISE_DB; - - if (db < 0) - db = 0; - - int rest = Sound.MAXIMUM_DB - Sound.NOISE_DB; - - db = db / rest; - - return db; - } - - public void draw() { - graph.invalidate(); - current.invalidate(); - } - - public int getPitchTime() { - return pitchTime; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - int ww = getMeasuredWidth() - getPaddingRight() - getPaddingLeft(); - int hh = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); - - current.measure(MeasureSpec.makeMeasureSpec(ww, MeasureSpec.AT_MOST), - MeasureSpec.makeMeasureSpec(hh, MeasureSpec.AT_MOST)); - - hh = hh - current.getMeasuredHeight(); - - graph.measure(MeasureSpec.makeMeasureSpec(ww, MeasureSpec.AT_MOST), - MeasureSpec.makeMeasureSpec(hh, MeasureSpec.AT_MOST)); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - graph.layout(getPaddingLeft(), getPaddingTop(), - getPaddingLeft() + graph.getMeasuredWidth(), getPaddingTop() + graph.getMeasuredHeight()); - - current.layout(getPaddingLeft(), graph.getBottom(), - getPaddingLeft() + current.getMeasuredWidth(), graph.getBottom() + current.getMeasuredHeight()); - } - - public void stop() { - if (edit != null) - HandlerUpdate.stop(handler, edit); - edit = null; - - if (draw != null) - HandlerUpdate.stop(handler, draw); - draw = null; - - if (play != null) - HandlerUpdate.stop(handler, play); - play = null; - - draw(); - } - - public long edit(float offset) { - if (offset < 0) - editPos = -1; - else - editPos = ((int) offset) / pitchSize; - - playPos = -1; - - if (editPos >= pitchScreenCount) - editPos = pitchScreenCount - 1; - - if (editPos >= data.size()) - editPos = data.size() - 1; - - if (draw != null) { - HandlerUpdate.stop(handler, draw); - draw = null; - } - - if (play != null) { - HandlerUpdate.stop(handler, play); - play = null; - } - - draw(); - - edit(); - - return samples + editPos; - } - - public void edit() { - if (edit == null) { - editFlash = true; - edit = FallbackUpdate.start(handler, new Runnable() { - @Override - public void run() { - draw(); - editFlash = !editFlash; - } - }, new Runnable() { - @Override - public void run() { - graph.calc(); - editFlash = !editFlash; - } - }, EDIT_UPDATE_SPEED); - } - } - - public void record() { - if (edit != null) - HandlerUpdate.stop(handler, edit); - edit = null; - editPos = -1; - - if (play != null) - HandlerUpdate.stop(handler, play); - play = null; - playPos = -1; - - if (draw == null) { - time = System.currentTimeMillis(); - draw = FallbackUpdate.start(handler, new Runnable() { - @Override - public void run() { - drawCalc(); - } - }, new Runnable() { - @Override - public void run() { - graph.calc(); - } - }, UPDATE_SPEED); - } - } - - // current paying pos in actual samples - public void play(float pos) { - if (pos < 0) { - playPos = -1; - if (play != null) { - HandlerUpdate.stop(handler, play); - play = null; - } - if (edit == null) { - edit(); - } - return; - } - - playPos = pos - samples; - - editFlash = true; - - int max = data.size() - 1; - - if (playPos > max) - playPos = max; - - if (edit != null) - HandlerUpdate.stop(handler, edit); - edit = null; - - if (draw != null) - HandlerUpdate.stop(handler, draw); - draw = null; - - if (play == null) { - time = System.currentTimeMillis(); - play = FallbackUpdate.start(handler, new Runnable() { - @Override - public void run() { - draw(); - } - }, new Runnable() { - @Override - public void run() { - graph.calc(); - } - }, UPDATE_SPEED); - } - } -} diff --git a/android-audio-library/src/main/res/drawable/ic_create_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_create_black_24dp.xml deleted file mode 100644 index 2ab2fb7..0000000 --- a/android-audio-library/src/main/res/drawable/ic_create_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android-audio-library/src/main/res/drawable/ic_delete_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_delete_black_24dp.xml deleted file mode 100644 index 39e64d6..0000000 --- a/android-audio-library/src/main/res/drawable/ic_delete_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android-audio-library/src/main/res/drawable/ic_mic_24dp.xml b/android-audio-library/src/main/res/drawable/ic_mic_24dp.xml deleted file mode 100644 index 351c058..0000000 --- a/android-audio-library/src/main/res/drawable/ic_mic_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android-audio-library/src/main/res/drawable/ic_pause_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_pause_black_24dp.xml deleted file mode 100644 index 8356ff5..0000000 --- a/android-audio-library/src/main/res/drawable/ic_pause_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android-audio-library/src/main/res/drawable/ic_play_arrow_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_play_arrow_black_24dp.xml deleted file mode 100644 index 81a8f74..0000000 --- a/android-audio-library/src/main/res/drawable/ic_play_arrow_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android-audio-library/src/main/res/drawable/ic_share_black_24dp.xml b/android-audio-library/src/main/res/drawable/ic_share_black_24dp.xml deleted file mode 100644 index e3fe874..0000000 --- a/android-audio-library/src/main/res/drawable/ic_share_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android-audio-library/src/main/res/drawable/round_button_dark.xml b/android-audio-library/src/main/res/drawable/round_button_dark.xml deleted file mode 100644 index 0c2a26c..0000000 --- a/android-audio-library/src/main/res/drawable/round_button_dark.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/android-audio-library/src/main/res/drawable/round_button_light.xml b/android-audio-library/src/main/res/drawable/round_button_light.xml deleted file mode 100644 index 33a8bec..0000000 --- a/android-audio-library/src/main/res/drawable/round_button_light.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/android-audio-library/src/main/res/layout/notifictaion_recording.xml b/android-audio-library/src/main/res/layout/notifictaion_recording.xml deleted file mode 100644 index 3faf37f..0000000 --- a/android-audio-library/src/main/res/layout/notifictaion_recording.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/android-audio-library/src/main/res/layout/notifictaion_recording_dark.xml b/android-audio-library/src/main/res/layout/notifictaion_recording_dark.xml deleted file mode 100644 index e573589..0000000 --- a/android-audio-library/src/main/res/layout/notifictaion_recording_dark.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/android-audio-library/src/main/res/layout/notifictaion_recording_light.xml b/android-audio-library/src/main/res/layout/notifictaion_recording_light.xml deleted file mode 100644 index 1a71872..0000000 --- a/android-audio-library/src/main/res/layout/notifictaion_recording_light.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/android-audio-library/src/main/res/layout/recording.xml b/android-audio-library/src/main/res/layout/recording.xml deleted file mode 100644 index 6348a79..0000000 --- a/android-audio-library/src/main/res/layout/recording.xml +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android-audio-library/src/main/res/menu/menu_context.xml b/android-audio-library/src/main/res/menu/menu_context.xml deleted file mode 100644 index 84b9fb5..0000000 --- a/android-audio-library/src/main/res/menu/menu_context.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/android-audio-library/src/main/res/values-ru/strings.xml b/android-audio-library/src/main/res/values-ru/strings.xml deleted file mode 100644 index 42ea624..0000000 --- a/android-audio-library/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - .wav (по умолчанию) - - - %1$s свободно ~ %2$s - дБ - Нет - Да - Вы уверены? - Удалить запись - Переименовать запись - "Создано с помощью: %1$s" - Файл не найден - Переименовать - Удалить - diff --git a/android-audio-library/src/main/res/values/attrs.xml b/android-audio-library/src/main/res/values/attrs.xml deleted file mode 100644 index 4a34715..0000000 --- a/android-audio-library/src/main/res/values/attrs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/android-audio-library/src/main/res/values/colors.xml b/android-audio-library/src/main/res/values/colors.xml deleted file mode 100644 index cb49d2e..0000000 --- a/android-audio-library/src/main/res/values/colors.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - #3F51B5 - #303F9F - #33333333 - #FF4081 - #a4a4a4 - diff --git a/android-audio-library/src/main/res/values/strings.xml b/android-audio-library/src/main/res/values/strings.xml deleted file mode 100644 index 11b27e9..0000000 --- a/android-audio-library/src/main/res/values/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ - - Audio Library - - - .wav (default) - - - - wav - - - %1$s free ~ %2$s left - dB - No - Yes - "Are you sure ? " - Delete Recording - Rename Recording - "Shared via %1$s" - File not found - Rename - Delete - diff --git a/android-audio-library/src/main/res/values/styles.xml b/android-audio-library/src/main/res/values/styles.xml deleted file mode 100644 index a86375b..0000000 --- a/android-audio-library/src/main/res/values/styles.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/android-audio-library/src/test/java/com/github/axet/audiolibrary/ExampleUnitTest.java b/android-audio-library/src/test/java/com/github/axet/audiolibrary/ExampleUnitTest.java deleted file mode 100644 index 7e1eec6..0000000 --- a/android-audio-library/src/test/java/com/github/axet/audiolibrary/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.axet.audiolibrary; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file From 0327b9295320081538d57b5274f96dadc135be4b Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 24 Feb 2017 18:10:25 +0300 Subject: [PATCH 12/12] Bump version audiorecorder-1.4.4 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0a96ec5..a73f758 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.github.axet.audiorecorder" minSdkVersion 9 targetSdkVersion 23 - versionCode 105 - versionName "1.4.3" + versionCode 106 + versionName "1.4.4" } signingConfigs { release {