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