summaryrefslogtreecommitdiff
path: root/LoopbackApp/app/src
diff options
context:
space:
mode:
authorDon Turner <don@chonk.co.uk>2015-10-05 22:13:56 +0100
committerDon Turner <don@chonk.co.uk>2015-10-05 22:13:56 +0100
commitd307d0809b4dac2fbaf4968480bac092f2288345 (patch)
tree8e9c679116cf493beaa116854e76328e98b221bc /LoopbackApp/app/src
parentf2168be23479c8c86fccec368669381f1fdf56c3 (diff)
downloaddrrickorang-d307d0809b4dac2fbaf4968480bac092f2288345.tar.gz
Updating app for new permissions model in Android Marshmallow (API 23)
Diffstat (limited to 'LoopbackApp/app/src')
-rw-r--r--LoopbackApp/app/src/main/java/org/drrickorang/loopback/LoopbackActivity.java67
1 files changed, 64 insertions, 3 deletions
diff --git a/LoopbackApp/app/src/main/java/org/drrickorang/loopback/LoopbackActivity.java b/LoopbackApp/app/src/main/java/org/drrickorang/loopback/LoopbackActivity.java
index 437db6e..fc1e001 100644
--- a/LoopbackApp/app/src/main/java/org/drrickorang/loopback/LoopbackActivity.java
+++ b/LoopbackApp/app/src/main/java/org/drrickorang/loopback/LoopbackActivity.java
@@ -21,11 +21,13 @@ import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.util.Arrays;
+import android.Manifest;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.media.AudioManager;
@@ -37,6 +39,8 @@ import android.os.IBinder;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.Gravity;
@@ -63,6 +67,7 @@ public class LoopbackActivity extends Activity {
private static final int SAVE_PLAYER_BUFFER_PERIOD_TO_TXT_REQUEST = 46;
private static final int SETTINGS_ACTIVITY_REQUEST_CODE = 54;
private static final int THREAD_SLEEP_DURATION_MS = 200;
+ private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 201;
LoopbackAudioThread mAudioThread = null;
NativeAudioThread mNativeAudioThread = null;
@@ -699,11 +704,18 @@ public class LoopbackActivity extends Activity {
/** Start the latency test. */
public void onButtonLatencyTest(View view) {
- startLatencyTest();
- }
+ // Ensure we have RECORD_AUDIO permissions
+ // On Android M (API 23) we must request dangerous permissions each time we use them
+ if (hasRecordAudioPermission()){
+ startLatencyTest();
+ } else {
+ requestRecordAudioPermission();
+ }
+ }
private void startLatencyTest() {
+
if (!isBusy()) {
mBarMasterLevel.setEnabled(false);
resetBufferPeriodRecord(mRecorderBufferPeriod, mPlayerBufferPeriod);
@@ -735,11 +747,17 @@ public class LoopbackActivity extends Activity {
/** Start the Buffer (Glitch Detection) Test. */
public void onButtonBufferTest(View view) {
- startBufferTest();
+
+ if (hasRecordAudioPermission()){
+ startBufferTest();
+ } else {
+ requestRecordAudioPermission();
+ }
}
private void startBufferTest() {
+
if (!isBusy()) {
mBarMasterLevel.setEnabled(false);
resetBufferPeriodRecord(mRecorderBufferPeriod, mPlayerBufferPeriod);
@@ -1596,4 +1614,47 @@ public class LoopbackActivity extends Activity {
}
return count;
}
+
+ /**
+ * Check whether we have the RECORD_AUDIO permission
+ * @return true if we do
+ */
+ private boolean hasRecordAudioPermission(){
+ boolean hasPermission = (ContextCompat.checkSelfPermission(this,
+ Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED);
+
+ log("Has RECORD_AUDIO permission? " + hasPermission);
+ return hasPermission;
+ }
+
+ /**
+ * Requests the RECORD_AUDIO permission from the user
+ */
+ private void requestRecordAudioPermission(){
+
+ String requiredPermission = Manifest.permission.RECORD_AUDIO;
+
+ // If the user previously denied this permission then show a message explaining why
+ // this permission is needed
+ if (ActivityCompat.shouldShowRequestPermissionRationale(this,
+ requiredPermission)) {
+
+ showToast("This app needs to record audio through the microphone to test the device's performance");
+ }
+
+ // request the permission.
+ ActivityCompat.requestPermissions(this,
+ new String[]{requiredPermission},
+ PERMISSIONS_REQUEST_RECORD_AUDIO);
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+
+ // We can ignore this call since we'll check for RECORD_AUDIO each time the
+ // user does anything which requires that permission. We can't, however, delete
+ // this method as this will cause ActivityCompat.requestPermissions to fail.
+ }
+
}