From 3014ebdfd431a79bbf664f5793291a52eef22a9e Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 12 Apr 2020 09:58:20 +0300 Subject: [PATCH] Notification settings for pre-Oreo android --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 10 +-- .../kotatsu/core/prefs/AppSettings.kt | 16 +++++ .../ui/common/BasePreferenceFragment.kt | 5 +- .../ui/settings/MainSettingsFragment.kt | 16 +++++ .../NotificationSettingsLegacyFragment.kt | 66 +++++++++++++++++++ .../kotatsu/ui/settings/SettingsActivity.kt | 24 +++++-- .../kotatsu/ui/tracker/TrackWorker.kt | 18 ++++- .../koitharu/kotatsu/utils/ext/StringExt.kt | 9 ++- app/src/main/res/values-ru/strings.xml | 4 ++ app/src/main/res/values/constants.xml | 4 ++ app/src/main/res/values/strings.xml | 4 ++ app/src/main/res/xml/pref_main.xml | 6 ++ app/src/main/res/xml/pref_notifications.xml | 23 +++++++ 14 files changed, 185 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/settings/NotificationSettingsLegacyFragment.kt create mode 100644 app/src/main/res/xml/pref_notifications.xml diff --git a/app/build.gradle b/app/build.gradle index 7f34eb645..049601360 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ android { minSdkVersion 21 targetSdkVersion 29 versionCode gitCommits - versionName '0.1.4' + versionName '0.2-b1' buildConfigField 'String', 'GIT_BRANCH', "\"${gitBranch}\"" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 717fe0108..6f8850ec5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + @@ -47,11 +48,10 @@ android:name=".ui.reader.SimpleSettingsActivity" android:label="@string/settings" /> - - - - diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt index 21bb9001c..862aa94b9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt @@ -3,12 +3,11 @@ package org.koitharu.kotatsu.ui.common import androidx.annotation.StringRes import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import org.koin.core.KoinComponent -import org.koin.core.inject +import org.koin.android.ext.android.inject import org.koitharu.kotatsu.core.prefs.AppSettings abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : - PreferenceFragmentCompat(), KoinComponent { + PreferenceFragmentCompat() { protected val settings by inject() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/MainSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/MainSettingsFragment.kt index ae2c9646c..b5c2544ba 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/MainSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/MainSettingsFragment.kt @@ -1,7 +1,10 @@ package org.koitharu.kotatsu.ui.settings +import android.content.Intent import android.content.SharedPreferences +import android.os.Build import android.os.Bundle +import android.provider.Settings import android.view.View import androidx.appcompat.app.AppCompatDelegate import androidx.collection.arrayMapOf @@ -15,6 +18,8 @@ import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.ui.common.BasePreferenceFragment import org.koitharu.kotatsu.ui.main.list.ListModeSelectDialog import org.koitharu.kotatsu.ui.settings.utils.MultiSummaryProvider +import org.koitharu.kotatsu.ui.tracker.TrackWorker + class MainSettingsFragment : BasePreferenceFragment(R.string.settings), SharedPreferences.OnSharedPreferenceChangeListener { @@ -70,6 +75,17 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), ListModeSelectDialog.show(childFragmentManager) true } + getString(R.string.key_notifications_settings) -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS) + .putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) + .putExtra(Settings.EXTRA_CHANNEL_ID, TrackWorker.CHANNEL_ID) + startActivity(intent) + } else { + (activity as? SettingsActivity)?.openNotificationSettingsLegacy() + } + true + } else -> super.onPreferenceTreeClick(preference) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/NotificationSettingsLegacyFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/NotificationSettingsLegacyFragment.kt new file mode 100644 index 000000000..6d5014527 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/NotificationSettingsLegacyFragment.kt @@ -0,0 +1,66 @@ +package org.koitharu.kotatsu.ui.settings + +import android.app.Activity +import android.content.Intent +import android.media.RingtoneManager +import android.net.Uri +import android.os.Bundle +import android.provider.Settings +import androidx.preference.Preference +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.ui.common.BasePreferenceFragment +import org.koitharu.kotatsu.utils.ext.toUriOrNull + +class NotificationSettingsLegacyFragment : BasePreferenceFragment(R.string.notifications) { + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.pref_notifications) + findPreference(R.string.key_notifications_sound)?.run { + val uri = settings.notificationSound.toUriOrNull() + summary = RingtoneManager.getRingtone(context, uri).getTitle(context) + } + } + + override fun onPreferenceTreeClick(preference: Preference?): Boolean { + return when (preference?.key) { + getString(R.string.key_notifications_sound) -> { + val intent = Intent(RingtoneManager.ACTION_RINGTONE_PICKER) + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, + RingtoneManager.TYPE_NOTIFICATION) + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true) + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true) + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, + Settings.System.DEFAULT_NOTIFICATION_URI) + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, preference.title) + val existingValue = settings.notificationSound.toUriOrNull() + intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, existingValue) + startActivityForResult(intent, REQUEST_RINGTONE) + true + } + else -> super.onPreferenceTreeClick(preference) + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + when (requestCode) { + REQUEST_RINGTONE -> { + if (resultCode == Activity.RESULT_OK) { + val uri = + data?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) + settings.notificationSound = uri?.toString().orEmpty() + findPreference(R.string.key_notifications_sound)?.run { + summary = RingtoneManager.getRingtone(context, uri).getTitle(context) + } + } + } + else -> { + super.onActivityResult(requestCode, resultCode, data) + } + } + } + + private companion object { + + const val REQUEST_RINGTONE = 340 + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt index d96609a95..e8efb163a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt @@ -3,6 +3,9 @@ package org.koitharu.kotatsu.ui.settings import android.content.Context import android.content.Intent import android.os.Bundle +import android.transition.Slide +import android.view.Gravity +import androidx.fragment.app.Fragment import androidx.fragment.app.commit import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat @@ -20,7 +23,9 @@ class SettingsActivity : BaseActivity(), if (supportFragmentManager.findFragmentById(R.id.container) == null) { supportFragmentManager.commit { - replace(R.id.container, MainSettingsFragment()) + replace(R.id.container, MainSettingsFragment().also { + it.exitTransition = Slide(Gravity.START) + }) } } } @@ -30,16 +35,23 @@ class SettingsActivity : BaseActivity(), val fragment = fm.fragmentFactory.instantiate(classLoader, pref.fragment) fragment.arguments = pref.extras fragment.setTargetFragment(caller, 0) - fm.commit { - replace(R.id.container, fragment) - addToBackStack(null) - } + openFragment(fragment) return true } fun openMangaSourceSettings(mangaSource: MangaSource) { + openFragment(SourceSettingsFragment.newInstance(mangaSource)) + } + + fun openNotificationSettingsLegacy() { + openFragment(NotificationSettingsLegacyFragment()) + } + + private fun openFragment(fragment: Fragment) { + fragment.enterTransition = Slide(Gravity.END) + fragment.exitTransition = Slide(Gravity.START) supportFragmentManager.commit { - replace(R.id.container, SourceSettingsFragment.newInstance(mangaSource)) + replace(R.id.container, fragment) addToBackStack(null) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt b/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt index f61105c14..1b5017db8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt @@ -24,6 +24,7 @@ import org.koitharu.kotatsu.domain.MangaProviderFactory import org.koitharu.kotatsu.domain.tracking.TrackingRepository import org.koitharu.kotatsu.ui.details.MangaDetailsActivity import org.koitharu.kotatsu.utils.ext.safe +import org.koitharu.kotatsu.utils.ext.toUriOrNull import java.util.concurrent.TimeUnit class TrackWorker(context: Context, workerParams: WorkerParameters) : @@ -151,8 +152,19 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : intent, PendingIntent.FLAG_UPDATE_CURRENT)) setAutoCancel(true) color = colorPrimary - setLights(colorPrimary, 1000, 5000) - setPriority(NotificationCompat.PRIORITY_DEFAULT) + priority = NotificationCompat.PRIORITY_DEFAULT + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + builder.setSound(settings.notificationSound.toUriOrNull()) + var defaults = if (settings.notificationLight) { + setLights(colorPrimary, 1000, 5000) + NotificationCompat.DEFAULT_LIGHTS + } else 0 + if (settings.notificationVibrate) { + builder.setVibrate(longArrayOf(500, 500, 500, 500)) + defaults = defaults or NotificationCompat.DEFAULT_VIBRATE + } + builder.setDefaults(defaults) + } } withContext(Dispatchers.Main) { notificationManager.notify(TAG, id, builder.build()) @@ -161,7 +173,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : companion object { - private const val CHANNEL_ID = "tracking" + const val CHANNEL_ID = "tracking" private const val TAG = "tracking" @RequiresApi(Build.VERSION_CODES.O) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt index dde557b31..b2d692162 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.utils.ext +import android.net.Uri import java.net.URLEncoder fun String.longHashCode(): Long { @@ -65,4 +66,10 @@ fun String.ellipsize(maxLength: Int) = if (this.length > maxLength) { this.take(maxLength - 1) + Typography.ellipsis } else this -fun String.urlEncoded(): String = URLEncoder.encode(this, Charsets.UTF_8.name()) \ No newline at end of file +fun String.urlEncoded(): String = URLEncoder.encode(this, Charsets.UTF_8.name()) + +fun String.toUriOrNull(): Uri? = if (isEmpty()) { + null +} else { + Uri.parse(this) +} \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d2e4aa52a..e693594c5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -118,4 +118,8 @@ Загрузить Читать с начала Перезапустить + Настройки уведомлений + Звук уведомления + Световая индикация + Вибросигнал \ No newline at end of file diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index d19a64420..16921fa9d 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -15,6 +15,10 @@ app_update app_update_auto tracker_notifications + notifications_settings + notifications_sound + notifications_vibrate + notifications_light domain diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3649b9f39..ebbb437a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -119,4 +119,8 @@ Download Read from start Restart + Notifications settings + Notification sound + Light indicator + Vibration \ No newline at end of file diff --git a/app/src/main/res/xml/pref_main.xml b/app/src/main/res/xml/pref_main.xml index ba2be69c6..23e193ef6 100644 --- a/app/src/main/res/xml/pref_main.xml +++ b/app/src/main/res/xml/pref_main.xml @@ -70,6 +70,12 @@ android:title="@string/new_chapters" app:iconSpaceReserved="false" /> + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_notifications.xml b/app/src/main/res/xml/pref_notifications.xml new file mode 100644 index 000000000..5b72bb9e0 --- /dev/null +++ b/app/src/main/res/xml/pref_notifications.xml @@ -0,0 +1,23 @@ + + + + + + + + + + \ No newline at end of file