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