diff --git a/app/build.gradle b/app/build.gradle
index 2a3b5d2..bc0d2bd 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,13 +11,13 @@ def getVersionName = { ->
android {
- compileSdkVersion 22
- buildToolsVersion "22.0.1"
+ compileSdkVersion 23
+ buildToolsVersion "23.0.3"
defaultConfig {
applicationId "org.xbmc.kore"
minSdkVersion 15
- targetSdkVersion 22
+ targetSdkVersion 23
versionCode 13
versionName = getVersionName()
}
@@ -80,9 +80,10 @@ android {
}
dependencies {
- compile 'com.android.support:support-v4:22.2.0'
- compile 'com.android.support:appcompat-v7:22.2.0'
- compile 'com.android.support:cardview-v7:22.2.0'
+ compile 'com.android.support:support-v4:23.4.0'
+ compile 'com.android.support:appcompat-v7:23.4.0'
+ compile 'com.android.support:cardview-v7:23.4.0'
+ compile 'com.android.support:support-v13:23.4.0'
compile 'com.fasterxml.jackson.core:jackson-databind:2.5.2'
compile 'com.jakewharton:butterknife:6.1.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a9e22a0..b46c5cd 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -7,8 +7,10 @@
-
+
+
+
0) &&
+ (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
+ onDownloadClicked(null);
+ } else {
+ Toast.makeText(getActivity(), R.string.write_storage_permission_denied, Toast.LENGTH_SHORT)
+ .show();
+ }
+ break;
+ }
+ }
+
+
protected void startSync(boolean silentRefresh) {
this.silentRefresh = silentRefresh;
LogUtils.LOGD(TAG, "Starting syc. Silent? " + silentRefresh);
diff --git a/app/src/main/java/org/xbmc/kore/ui/BaseActivity.java b/app/src/main/java/org/xbmc/kore/ui/BaseActivity.java
index 4e4d226..1c7c9e6 100644
--- a/app/src/main/java/org/xbmc/kore/ui/BaseActivity.java
+++ b/app/src/main/java/org/xbmc/kore/ui/BaseActivity.java
@@ -18,7 +18,7 @@ package org.xbmc.kore.ui;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
import org.xbmc.kore.Settings;
import org.xbmc.kore.utils.UIUtils;
@@ -26,7 +26,7 @@ import org.xbmc.kore.utils.UIUtils;
/**
* Base activity, where common behaviour is implemented
*/
-public class BaseActivity extends ActionBarActivity {
+public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
diff --git a/app/src/main/java/org/xbmc/kore/ui/SettingsFragment.java b/app/src/main/java/org/xbmc/kore/ui/SettingsFragment.java
index d206ac6..0c0d355 100644
--- a/app/src/main/java/org/xbmc/kore/ui/SettingsFragment.java
+++ b/app/src/main/java/org/xbmc/kore/ui/SettingsFragment.java
@@ -15,6 +15,7 @@
*/
package org.xbmc.kore.ui;
+import android.Manifest;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
@@ -23,7 +24,12 @@ import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
+import android.preference.TwoStatePreference;
+import android.support.annotation.NonNull;
+import android.support.v13.app.FragmentCompat;
import android.support.v4.app.TaskStackBuilder;
+import android.support.v4.content.ContextCompat;
+import android.widget.Toast;
import org.xbmc.kore.R;
import org.xbmc.kore.Settings;
@@ -31,6 +37,7 @@ import org.xbmc.kore.host.HostManager;
import org.xbmc.kore.service.ConnectionObserversManagerService;
import org.xbmc.kore.utils.LogUtils;
import org.xbmc.kore.utils.UIUtils;
+import org.xbmc.kore.utils.Utils;
import java.lang.reflect.Method;
@@ -73,6 +80,13 @@ public class SettingsFragment extends PreferenceFragment
}
}
+ // Check permission for phone state and set preference accordingly
+ if (!hasPhonePermission()) {
+ TwoStatePreference pauseCallPreference =
+ (TwoStatePreference)findPreference(Settings.KEY_PREF_PAUSE_DURING_CALLS);
+ pauseCallPreference.setChecked(false);
+ }
+
setupPreferences();
}
@@ -107,7 +121,17 @@ public class SettingsFragment extends PreferenceFragment
.startActivities();
}
- // If one of the settings that use the observer service are modified, restart it
+ // If the pause during call is selected, make sure we have permission to read phone state
+ if (key.equals(Settings.KEY_PREF_PAUSE_DURING_CALLS) &&
+ (sharedPreferences.getBoolean(Settings.KEY_PREF_PAUSE_DURING_CALLS, Settings.DEFAULT_PREF_PAUSE_DURING_CALLS))) {
+ if (!hasPhonePermission()) {
+ FragmentCompat.requestPermissions(this,
+ new String[] {Manifest.permission.READ_PHONE_STATE},
+ Utils.PERMISSION_REQUEST_READ_PHONE_STATE);
+ }
+ }
+
+ // If one of the settings that use the observer service are modified, restart it
if (key.equals(Settings.KEY_PREF_SHOW_NOTIFICATION) || key.equals(Settings.KEY_PREF_PAUSE_DURING_CALLS)) {
LogUtils.LOGD(TAG, "Stoping connection observer service");
Intent intent = new Intent(getActivity(), ConnectionObserversManagerService.class);
@@ -116,6 +140,27 @@ public class SettingsFragment extends PreferenceFragment
}
}
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
+ switch (requestCode) {
+ case Utils.PERMISSION_REQUEST_READ_PHONE_STATE:
+ // If request is cancelled, the result arrays are empty.
+ if ((grantResults.length == 0) ||
+ (grantResults[0] != PackageManager.PERMISSION_GRANTED)) {
+ Toast.makeText(getActivity(), R.string.read_phone_state_permission_denied, Toast.LENGTH_SHORT)
+ .show();
+ TwoStatePreference pauseCallPreference =
+ (TwoStatePreference)findPreference(Settings.KEY_PREF_PAUSE_DURING_CALLS);
+ pauseCallPreference.setChecked(false);
+ }
+ break;
+ }
+ }
+
+ private boolean hasPhonePermission() {
+ return ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED;
+ }
+
/**
* Sets up the preferences state and summaries
*/
diff --git a/app/src/main/java/org/xbmc/kore/utils/Utils.java b/app/src/main/java/org/xbmc/kore/utils/Utils.java
index eb7a411..20cd148 100644
--- a/app/src/main/java/org/xbmc/kore/utils/Utils.java
+++ b/app/src/main/java/org/xbmc/kore/utils/Utils.java
@@ -32,6 +32,9 @@ import java.util.List;
* */
public class Utils {
+ public static final int PERMISSION_REQUEST_WRITE_STORAGE = 0,
+ PERMISSION_REQUEST_READ_PHONE_STATE = 1;
+
/**
* Returns whether the SDK is the Jellybean release or later.
*/
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 13cac18..fd46146 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -383,4 +383,7 @@
Allowed network types for media downloads
Songs
+ Permission denied. Won\'t be able to pause playback during calls.
+ Permission denied. Won\'t be able to download files.
+
diff --git a/build.gradle b/build.gradle
index a6fcfe1..f6e9073 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.5.0'
+ classpath 'com.android.tools.build:gradle:2.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 0c71e76..e7c8269 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Wed Apr 10 15:27:10 PDT 2013
+#Tue May 24 19:19:59 WEST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip