From 1208b29847bd685013d32121c9c71bf985c9d290 Mon Sep 17 00:00:00 2001 From: Paul Peavyhouse Date: Thu, 5 May 2016 15:13:47 -0700 Subject: [PATCH 1/9] checkActivity returns the Activity; avoids multiple mActivity.get()s --- .../com/greysonparrelli/permiso/Permiso.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java index 59584bd..73634bb 100644 --- a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java +++ b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java @@ -96,13 +96,13 @@ public void setActivity(@NonNull Activity activity) { */ @MainThread public void requestPermissions(@NonNull IOnPermissionResult callback, String... permissions) { - checkActivity(); + Activity activity = checkActivity(); final RequestData requestData = new RequestData(callback, permissions); // Mark any permissions that are already granted for (String permission : permissions) { - if (ContextCompat.checkSelfPermission(mActivity.get(), permission) == PackageManager.PERMISSION_GRANTED) { + if (ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED) { requestData.resultSet.grantPermissions(permission); } } @@ -122,7 +122,7 @@ public void requestPermissions(@NonNull IOnPermissionResult callback, String... final int requestCode = markRequestAsActive(requestData); // First check if there's any permissions for which we need to provide a rationale for using - String[] permissionsThatNeedRationale = requestData.resultSet.getPermissionsThatNeedRationale(mActivity.get()); + String[] permissionsThatNeedRationale = requestData.resultSet.getPermissionsThatNeedRationale(activity); // If there are some that need a rationale, show that rationale, then continue with the request if (permissionsThatNeedRationale.length > 0) { @@ -153,9 +153,10 @@ public void onRationaleProvided() { */ @MainThread public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) { + Activity activity = checkActivity(); if (mCodesToRequests.containsKey(requestCode)) { RequestData requestData = mCodesToRequests.get(requestCode); - requestData.resultSet.parsePermissionResults(permissions, grantResults, mActivity.get()); + requestData.resultSet.parsePermissionResults(permissions, grantResults, activity); requestData.onResultListener.onPermissionResult(requestData.resultSet); mCodesToRequests.remove(requestCode); } else { @@ -178,7 +179,7 @@ public void onRequestPermissionResult(int requestCode, String[] permissions, int */ @MainThread public void showRationaleInDialog(@Nullable String title, @NonNull String message, @Nullable String buttonText, @NonNull final IOnRationaleProvided rationaleCallback) { - checkActivity(); + Activity activity = checkActivity(); PermisoDialogFragment dialogFragment = PermisoDialogFragment.newInstance(title, message, buttonText); @@ -190,7 +191,7 @@ public void onClose() { rationaleCallback.onRationaleProvided(); } }); - dialogFragment.show(mActivity.get().getFragmentManager(), PermisoDialogFragment.TAG); + dialogFragment.show(activity.getFragmentManager(), PermisoDialogFragment.TAG); } @@ -257,18 +258,21 @@ private int markRequestAsActive(RequestData requestData) { * @param requestCode The request code of the request you want to run. */ private void makePermissionRequest(int requestCode) { + Activity activity = checkActivity(); RequestData requestData = mCodesToRequests.get(requestCode); - ActivityCompat.requestPermissions(mActivity.get(), requestData.resultSet.getUngrantedPermissions(), requestCode); + ActivityCompat.requestPermissions(activity, requestData.resultSet.getUngrantedPermissions(), requestCode); } /** * Ensures that our WeakReference to the Activity is still valid. If it isn't, throw an exception saying that the * Activity needs to be set. */ - private void checkActivity() { - if (mActivity.get() == null) { + private Activity checkActivity() { + Activity activity = mActivity.get(); + if (activity == null) { throw new IllegalStateException("No activity set. Either subclass PermisoActivity or call Permiso.setActivity() in onCreate() and onResume() of your Activity."); } + return activity; } From 7908841188f215cf044bf7bf37e925341c64fcfe Mon Sep 17 00:00:00 2001 From: Paul Peavyhouse Date: Thu, 5 May 2016 15:16:13 -0700 Subject: [PATCH 2/9] Prevent multiple PermisoDialogFragment in showRationaleInDialog --- .../java/com/greysonparrelli/permiso/Permiso.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java index 73634bb..cca7005 100644 --- a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java +++ b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java @@ -1,6 +1,7 @@ package com.greysonparrelli.permiso; import android.app.Activity; +import android.app.FragmentManager; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.MainThread; @@ -181,7 +182,15 @@ public void onRequestPermissionResult(int requestCode, String[] permissions, int public void showRationaleInDialog(@Nullable String title, @NonNull String message, @Nullable String buttonText, @NonNull final IOnRationaleProvided rationaleCallback) { Activity activity = checkActivity(); - PermisoDialogFragment dialogFragment = PermisoDialogFragment.newInstance(title, message, buttonText); + FragmentManager fm = activity.getFragmentManager(); + + PermisoDialogFragment dialogFragment = (PermisoDialogFragment) fm.findFragmentByTag(PermisoDialogFragment.TAG); + if (dialogFragment != null) + { + dialogFragment.dismiss(); + } + + dialogFragment = PermisoDialogFragment.newInstance(title, message, buttonText); // We show the rationale after the dialog is closed. We use setRetainInstance(true) in the dialog to ensure that // it retains the listener after an app rotation. From fe800d4278257efcb36a5993eaed5e08e05c3036 Mon Sep 17 00:00:00 2001 From: Paul Peavyhouse Date: Thu, 5 May 2016 15:16:44 -0700 Subject: [PATCH 3/9] Updating to latest build tools and dependencies --- app/build.gradle | 6 +++--- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- permiso/build.gradle | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a5e58cd..c100a9c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion "23.0.1" + buildToolsVersion "23.0.3" defaultConfig { applicationId "com.greysonparrelli.permisodemo" @@ -22,7 +22,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:design:23.1.1' + compile 'com.android.support:appcompat-v7:23.3.0' + compile 'com.android.support:design:23.3.0' compile project(':permiso') } diff --git a/build.gradle b/build.gradle index 6e9f8d2..9ca9021 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.3.0' + classpath 'com.android.tools.build:gradle:2.1.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0dd6551..0bcd3d4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip diff --git a/permiso/build.gradle b/permiso/build.gradle index 88b799f..6857e77 100644 --- a/permiso/build.gradle +++ b/permiso/build.gradle @@ -26,7 +26,7 @@ ext { android { compileSdkVersion 23 - buildToolsVersion "23.0.1" + buildToolsVersion "23.0.3" defaultConfig { minSdkVersion 11 @@ -45,7 +45,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.1.1' + compile 'com.android.support:appcompat-v7:23.3.0' } // Only add in the bintray stuff if we're building locally From 1c9f6193e8fccda97efd3a89098f66e9a9ea1cc9 Mon Sep 17 00:00:00 2001 From: Paul Peavyhouse Date: Thu, 5 May 2016 15:21:10 -0700 Subject: [PATCH 4/9] Fixing toast message when multiple permissions are denied --- .../java/com/greysonparrelli/permisodemo/MainActivity.java | 3 ++- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/greysonparrelli/permisodemo/MainActivity.java b/app/src/main/java/com/greysonparrelli/permisodemo/MainActivity.java index 4120a4e..5b987fe 100644 --- a/app/src/main/java/com/greysonparrelli/permisodemo/MainActivity.java +++ b/app/src/main/java/com/greysonparrelli/permisodemo/MainActivity.java @@ -96,7 +96,8 @@ public void onPermissionResult(Permiso.ResultSet resultSet) { if (resultSet.isPermissionGranted(Manifest.permission.READ_CALENDAR)) { numGranted++; } - Toast.makeText(MainActivity.this, numGranted + R.string.two_permission_granted, Toast.LENGTH_SHORT).show(); + String message = getString(R.string.X_permissions_granted, numGranted); + Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show(); } @Override diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cc7fa89..6a1ba7d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,5 +6,5 @@ Permission Granted! Permission Permanently Denied. Permission Denied. - 2 Permissions Granted. + %1$d Permissions Granted. From 9fc2cae937cac4782575612ec9ca19d2cf23791e Mon Sep 17 00:00:00 2001 From: Paul Peavyhouse Date: Thu, 5 May 2016 15:28:45 -0700 Subject: [PATCH 5/9] Missed a line --- permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java index cca7005..1727e86 100644 --- a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java +++ b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java @@ -200,7 +200,7 @@ public void onClose() { rationaleCallback.onRationaleProvided(); } }); - dialogFragment.show(activity.getFragmentManager(), PermisoDialogFragment.TAG); + dialogFragment.show(fm, PermisoDialogFragment.TAG); } From 670217694121901197d7336a233e7e318aa3bc06 Mon Sep 17 00:00:00 2001 From: Paul Peavyhouse Date: Thu, 5 May 2016 15:39:47 -0700 Subject: [PATCH 6/9] android.app.DialogFragment -> android.support.v4.app.DialogFragment --- .../com/greysonparrelli/permiso/Permiso.java | 25 ++++++++++--------- .../permiso/PermisoActivity.java | 15 ++++++++--- .../permiso/PermisoDialogFragment.java | 2 +- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java index 1727e86..526f3c9 100644 --- a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java +++ b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java @@ -1,13 +1,14 @@ package com.greysonparrelli.permiso; import android.app.Activity; -import android.app.FragmentManager; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.MainThread; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; import android.util.Log; @@ -35,9 +36,9 @@ public class Permiso { /** * The active activity. Used to make permissions requests. This must be set by the library-user through - * {@link Permiso#setActivity(Activity)} or else bad things will happen. + * {@link Permiso#setActivity(FragmentActivity)} or else bad things will happen. */ - private WeakReference mActivity; + private WeakReference mActivity; /** * This is just a value we increment to generate new request codes for use with @@ -82,13 +83,13 @@ private Permiso() { * Important: If your activity subclasses {@link PermisoActivity}, this is already handled for you. * @param activity The activity that is currently active. */ - public void setActivity(@NonNull Activity activity) { + public void setActivity(@NonNull FragmentActivity activity) { mActivity = new WeakReference<>(activity); } /** * Request one or more permissions from the system. Make sure that you are either subclassing {@link PermisoActivity} - * or that you have set your current activity using {@link Permiso#setActivity(Activity)}! + * or that you have set your current activity using {@link Permiso#setActivity(FragmentActivity)}! * @param callback * A callback that will be triggered when the results of your permission request are available. * @param permissions @@ -97,7 +98,7 @@ public void setActivity(@NonNull Activity activity) { */ @MainThread public void requestPermissions(@NonNull IOnPermissionResult callback, String... permissions) { - Activity activity = checkActivity(); + FragmentActivity activity = checkActivity(); final RequestData requestData = new RequestData(callback, permissions); @@ -154,7 +155,7 @@ public void onRationaleProvided() { */ @MainThread public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) { - Activity activity = checkActivity(); + FragmentActivity activity = checkActivity(); if (mCodesToRequests.containsKey(requestCode)) { RequestData requestData = mCodesToRequests.get(requestCode); requestData.resultSet.parsePermissionResults(permissions, grantResults, activity); @@ -180,9 +181,9 @@ public void onRequestPermissionResult(int requestCode, String[] permissions, int */ @MainThread public void showRationaleInDialog(@Nullable String title, @NonNull String message, @Nullable String buttonText, @NonNull final IOnRationaleProvided rationaleCallback) { - Activity activity = checkActivity(); + FragmentActivity activity = checkActivity(); - FragmentManager fm = activity.getFragmentManager(); + FragmentManager fm = activity.getSupportFragmentManager(); PermisoDialogFragment dialogFragment = (PermisoDialogFragment) fm.findFragmentByTag(PermisoDialogFragment.TAG); if (dialogFragment != null) @@ -267,7 +268,7 @@ private int markRequestAsActive(RequestData requestData) { * @param requestCode The request code of the request you want to run. */ private void makePermissionRequest(int requestCode) { - Activity activity = checkActivity(); + FragmentActivity activity = checkActivity(); RequestData requestData = mCodesToRequests.get(requestCode); ActivityCompat.requestPermissions(activity, requestData.resultSet.getUngrantedPermissions(), requestCode); } @@ -276,8 +277,8 @@ private void makePermissionRequest(int requestCode) { * Ensures that our WeakReference to the Activity is still valid. If it isn't, throw an exception saying that the * Activity needs to be set. */ - private Activity checkActivity() { - Activity activity = mActivity.get(); + private FragmentActivity checkActivity() { + FragmentActivity activity = mActivity.get(); if (activity == null) { throw new IllegalStateException("No activity set. Either subclass PermisoActivity or call Permiso.setActivity() in onCreate() and onResume() of your Activity."); } diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java index 32a417b..a1379a3 100644 --- a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java +++ b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java @@ -2,14 +2,16 @@ import android.app.Activity; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; +import android.support.v4.app.FragmentActivity; /** * An Activity that handles the small amount of boilerplate that {@link Permiso} requires to run. If you'd rather not * use this as your base activity class, simply remember to do the following in each of your activities: *
    - *
  • Call {@link Permiso#setActivity(Activity)} in {@link Activity#onCreate(Bundle)} and {@link Activity#onResume()}
  • + *
  • Call {@link Permiso#setActivity(FragmentActivity)} in {@link Activity#onCreate(Bundle)} and {@link Activity#onResume()}
  • *
  • Call {@link Permiso#onRequestPermissionResult(int, String[], int[])} in * {@link Activity#onRequestPermissionsResult(int, String[], int[])}
  • *
@@ -29,8 +31,15 @@ protected void onResume() { } @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - Permiso.getInstance().onRequestPermissionResult(requestCode, permissions, grantResults); + // If we don't do this, android.support.v4.app.DialogFragment can throw IllegalStateException. See bug: + // https://code.google.com/p/android/issues/detail?id=190966 + new Handler().post(new Runnable() { + @Override + public void run() { + Permiso.getInstance().onRequestPermissionResult(requestCode, permissions, grantResults); + } + }); } } \ No newline at end of file diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java index 6fe543f..b14e75a 100644 --- a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java +++ b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java @@ -1,11 +1,11 @@ package com.greysonparrelli.permiso; import android.app.Dialog; -import android.app.DialogFragment; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; /** From b7f9a41fca0e71ded6f2fd64a9193bf29a6b16bc Mon Sep 17 00:00:00 2001 From: Paul Peavyhouse Date: Thu, 5 May 2016 15:47:50 -0700 Subject: [PATCH 7/9] Fixing a compiler/lint warning --- .../java/com/greysonparrelli/permiso/PermisoDialogFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java index 6fe543f..5a00701 100644 --- a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java +++ b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoDialogFragment.java @@ -70,6 +70,7 @@ public void onDestroyView() { super.onDestroyView(); } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); From 236b3f45ff17c9628c9e54f10733f007abcec711 Mon Sep 17 00:00:00 2001 From: Paul Peavyhouse Date: Thu, 5 May 2016 15:55:57 -0700 Subject: [PATCH 8/9] Moving Handler hack directly in to Permiso.onRequestPermissionResult --- .../com/greysonparrelli/permiso/Permiso.java | 28 ++++++++++++------- .../permiso/PermisoActivity.java | 12 ++------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java index 526f3c9..2814e2f 100644 --- a/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java +++ b/permiso/src/main/java/com/greysonparrelli/permiso/Permiso.java @@ -3,6 +3,7 @@ import android.app.Activity; import android.content.pm.PackageManager; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.MainThread; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -154,16 +155,23 @@ public void onRationaleProvided() { * The grant results given to you by {@link Activity#onRequestPermissionsResult(int, String[], int[])}. */ @MainThread - public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) { - FragmentActivity activity = checkActivity(); - if (mCodesToRequests.containsKey(requestCode)) { - RequestData requestData = mCodesToRequests.get(requestCode); - requestData.resultSet.parsePermissionResults(permissions, grantResults, activity); - requestData.onResultListener.onPermissionResult(requestData.resultSet); - mCodesToRequests.remove(requestCode); - } else { - Log.w(TAG, "onRequestPermissionResult() was given an unrecognized request code."); - } + public void onRequestPermissionResult(final int requestCode, final String[] permissions, final int[] grantResults) { + // If we don't do this, android.support.v4.app.DialogFragment will throw IllegalStateException. See bug: + // https://code.google.com/p/android/issues/detail?id=190966 + new Handler().post(new Runnable() { + @Override + public void run() { + FragmentActivity activity = checkActivity(); + if (mCodesToRequests.containsKey(requestCode)) { + RequestData requestData = mCodesToRequests.get(requestCode); + requestData.resultSet.parsePermissionResults(permissions, grantResults, activity); + requestData.onResultListener.onPermissionResult(requestData.resultSet); + mCodesToRequests.remove(requestCode); + } else { + Log.w(TAG, "onRequestPermissionResult() was given an unrecognized request code."); + } + } + }); } /** diff --git a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java index a1379a3..87cc872 100644 --- a/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java +++ b/permiso/src/main/java/com/greysonparrelli/permiso/PermisoActivity.java @@ -2,10 +2,9 @@ import android.app.Activity; import android.os.Bundle; -import android.os.Handler; import android.support.annotation.NonNull; -import android.support.v7.app.AppCompatActivity; import android.support.v4.app.FragmentActivity; +import android.support.v7.app.AppCompatActivity; /** * An Activity that handles the small amount of boilerplate that {@link Permiso} requires to run. If you'd rather not @@ -33,13 +32,6 @@ protected void onResume() { @Override public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - // If we don't do this, android.support.v4.app.DialogFragment can throw IllegalStateException. See bug: - // https://code.google.com/p/android/issues/detail?id=190966 - new Handler().post(new Runnable() { - @Override - public void run() { - Permiso.getInstance().onRequestPermissionResult(requestCode, permissions, grantResults); - } - }); + Permiso.getInstance().onRequestPermissionResult(requestCode, permissions, grantResults); } } \ No newline at end of file From eada4ffa8b2c8b1e44f0bb669c10a2226c168858 Mon Sep 17 00:00:00 2001 From: Paul Peavyhouse Date: Thu, 5 May 2016 17:25:05 -0700 Subject: [PATCH 9/9] Updating travis-ci config to use build-tools-23.0.3 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 754c947..4557e8d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ android: # - tools # The BuildTools version used by your project - - build-tools-23.0.1 + - build-tools-23.0.3 # The SDK version used to compile your project - android-23