aboutsummaryrefslogtreecommitdiff
path: root/app/src/main
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2017-08-19 23:18:47 -0700
committerGitHub <noreply@github.com>2017-08-19 23:18:47 -0700
commit17b2b7a21b1a8bb2e7afdbff90293009f1b26057 (patch)
treea2e2d158d739820da1baca9c2fd946b34132b429 /app/src/main
parent8c178bd82d75ef237c97863fae555ca0346e7352 (diff)
downloadfrost-17b2b7a21b1a8bb2e7afdbff90293009f1b26057.tar.gz
frost-17b2b7a21b1a8bb2e7afdbff90293009f1b26057.tar.bz2
frost-17b2b7a21b1a8bb2e7afdbff90293009f1b26057.zip
Feature/ringtone selector (#200)
* Update changelog * Create and test ringtone selector * Update changelog * Update text
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt29
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/WebOverlayActivity.kt1
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/enums/MainActivityLayout.kt2
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt2
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/intro/IntroFragmentTheme.kt2
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt40
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/services/NotificationService.kt4
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/settings/Notifications.kt38
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/utils/Downloader.kt6
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt6
-rw-r--r--app/src/main/res/values/strings_pref_notifications.xml7
-rw-r--r--app/src/main/res/values/strings_preferences.xml2
-rw-r--r--app/src/main/res/xml/frost_changelog.xml10
13 files changed, 116 insertions, 33 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt
index 7023fbc2..497ee375 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt
@@ -3,6 +3,8 @@ package com.pitchedapps.frost.activities
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
+import android.media.RingtoneManager
+import android.net.Uri
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
@@ -32,12 +34,39 @@ class SettingsActivity : KPrefActivity(), FrostBilling by IABSettings() {
var resultFlag = Activity.RESULT_CANCELED
+ companion object {
+ private const val REQUEST_RINGTONE = 0b10111 shl 5
+ const val REQUEST_NOTIFICATION_RINGTONE = REQUEST_RINGTONE or 1
+ const val REQUEST_MESSAGE_RINGTONE = REQUEST_RINGTONE or 2
+ }
+
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ if (fetchRingtone(requestCode, resultCode, data)) return
if (!onActivityResultBilling(requestCode, resultCode, data))
super.onActivityResult(requestCode, resultCode, data)
reloadList()
}
+ /**
+ * Fetch ringtone and save uri
+ * Returns [true] if consumed, [false] otherwise
+ */
+ private fun fetchRingtone(requestCode: Int, resultCode: Int, data: Intent?): Boolean {
+ if (requestCode and REQUEST_RINGTONE != REQUEST_RINGTONE || resultCode != Activity.RESULT_OK) return false
+ val uri: String = data?.getParcelableExtra<Uri>(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)?.toString() ?: ""
+ when (requestCode) {
+ REQUEST_NOTIFICATION_RINGTONE -> {
+ Prefs.notificationRingtone = uri
+ reloadByTitle(R.string.notification_ringtone)
+ }
+ REQUEST_MESSAGE_RINGTONE -> {
+ Prefs.messageRingtone = uri
+ reloadByTitle(R.string.message_ringtone)
+ }
+ }
+ return true
+ }
+
override fun kPrefCoreAttributes(): CoreAttributeContract.() -> Unit = {
textColor = { Prefs.textColor }
accentColor = { Prefs.accentColor }
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/WebOverlayActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/WebOverlayActivity.kt
index 51aedae3..756d5d35 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/activities/WebOverlayActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/WebOverlayActivity.kt
@@ -13,7 +13,6 @@ import android.webkit.WebChromeClient
import ca.allanwang.kau.internal.KauBaseActivity
import ca.allanwang.kau.swipe.kauSwipeOnCreate
import ca.allanwang.kau.swipe.kauSwipeOnDestroy
-import ca.allanwang.kau.swipe.kauSwipeOnPostCreate
import ca.allanwang.kau.utils.*
import com.mikepenz.community_material_typeface_library.CommunityMaterial
import com.mikepenz.google_material_typeface_library.GoogleMaterial
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/enums/MainActivityLayout.kt b/app/src/main/kotlin/com/pitchedapps/frost/enums/MainActivityLayout.kt
index b3d71cfc..79b11752 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/enums/MainActivityLayout.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/enums/MainActivityLayout.kt
@@ -23,7 +23,7 @@ enum class MainActivityLayout(
{ Prefs.textColor });
companion object {
- val values = MainActivityLayout.values() //save one instance
+ val values = values() //save one instance
operator fun invoke(index: Int) = values[index]
}
} \ No newline at end of file
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt b/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt
index 1a640ba5..fd2b6cc1 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt
@@ -8,8 +8,8 @@ import android.view.View
import android.view.ViewGroup
import ca.allanwang.kau.utils.withArguments
import com.pitchedapps.frost.activities.MainActivity
-import com.pitchedapps.frost.facebook.FbItem
import com.pitchedapps.frost.enums.FeedSort
+import com.pitchedapps.frost.facebook.FbItem
import com.pitchedapps.frost.utils.Prefs
import com.pitchedapps.frost.web.FrostWebView
import com.pitchedapps.frost.web.FrostWebViewCore
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/intro/IntroFragmentTheme.kt b/app/src/main/kotlin/com/pitchedapps/frost/intro/IntroFragmentTheme.kt
index 3134ff11..2e7d3572 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/intro/IntroFragmentTheme.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/intro/IntroFragmentTheme.kt
@@ -6,8 +6,8 @@ import ca.allanwang.kau.utils.bindViewResettable
import ca.allanwang.kau.utils.scaleXY
import com.pitchedapps.frost.R
import com.pitchedapps.frost.activities.IntroActivity
-import com.pitchedapps.frost.utils.Prefs
import com.pitchedapps.frost.enums.Theme
+import com.pitchedapps.frost.utils.Prefs
/**
* Created by Allan Wang on 2017-07-28.
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt b/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt
index d3dfe79c..810e5f97 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/services/FrostNotifications.kt
@@ -34,27 +34,34 @@ import org.jetbrains.anko.runOnUiThread
* Logic for build notifications, scheduling notifications, and showing notifications
*/
-/**
- * Wrap the default builder with our icon and accent color
- */
+
val Context.frostNotification: NotificationCompat.Builder
- get() = NotificationCompat.Builder(this, BuildConfig.APPLICATION_ID).apply {
- setSmallIcon(R.drawable.frost_f_24)
- setAutoCancel(true)
- color = color(R.color.frost_notification_accent)
- }
+ get() = frostNotification()
/**
- * Assign global changes to the notification after it is built
+ * Wrap the default builder with our icon and accent color
*/
-@Suppress("DEPRECATION")
- //The update feature is for Android O and seems to still be in beta
-fun Notification.frostConfig() = apply {
+fun Context.frostNotification(ringtone: String = Prefs.notificationRingtone): NotificationCompat.Builder
+ = NotificationCompat.Builder(this, BuildConfig.APPLICATION_ID).apply {
+ setSmallIcon(R.drawable.frost_f_24)
+ setAutoCancel(true)
+ color = color(R.color.frost_notification_accent)
+ var defaults = 0
if (Prefs.notificationVibrate) defaults = defaults or Notification.DEFAULT_VIBRATE
- if (Prefs.notificationSound) defaults = defaults or Notification.DEFAULT_SOUND
+ if (Prefs.notificationSound) {
+ if (ringtone.isNotBlank()) setSound(Uri.parse(ringtone))
+ else defaults = defaults or Notification.DEFAULT_SOUND
+ }
if (Prefs.notificationLights) defaults = defaults or Notification.DEFAULT_LIGHTS
+ setDefaults(defaults)
}
+val NotificationCompat.Builder.quiet
+ get() = apply { setDefaults(0) }
+
+val NotificationCompat.Builder.messageRingtone
+ get() = apply { }
+
val NotificationCompat.Builder.withBigText: NotificationCompat.BigTextStyle
get() = NotificationCompat.BigTextStyle(this)
@@ -72,7 +79,7 @@ class FrostNotificationTarget(val context: Context,
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>) {
builder.setLargeIcon(resource)
- NotificationManagerCompat.from(context).notify(notifTag, notifId, builder.withBigText.build().frostConfig())
+ NotificationManagerCompat.from(context).notify(notifTag, notifId, builder.withBigText.build())
}
}
@@ -99,7 +106,8 @@ data class NotificationContent(val data: CookieModel,
intent.putExtra(ARG_USER_ID, data.id)
val group = "${groupPrefix}_${data.id}"
val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
- val notifBuilder = context.frostNotification
+ val ringtone = if (groupPrefix == FROST_MESSAGE_NOTIFICATION_GROUP) Prefs.messageRingtone else Prefs.notificationRingtone
+ val notifBuilder = context.frostNotification(ringtone)
.setContentTitle(title ?: context.string(R.string.frost_name))
.setContentText(text)
.setContentIntent(pendingIntent)
@@ -109,7 +117,7 @@ data class NotificationContent(val data: CookieModel,
if (timestamp != -1L) notifBuilder.setWhen(timestamp * 1000)
L.v("Notif load", this.toString())
- NotificationManagerCompat.from(context).notify(group, notifId, notifBuilder.withBigText.build().frostConfig())
+ NotificationManagerCompat.from(context).notify(group, notifId, notifBuilder.withBigText.build())
if (profileUrl.isNotBlank()) {
context.runOnUiThread {
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/services/NotificationService.kt b/app/src/main/kotlin/com/pitchedapps/frost/services/NotificationService.kt
index 5859a306..9321c42f 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/services/NotificationService.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/services/NotificationService.kt
@@ -233,7 +233,7 @@ class NotificationService : JobService() {
val notifBuilder = frostNotification
.setContentTitle(string(R.string.frost_name))
.setContentText(text)
- NotificationManagerCompat.from(this).notify(999, notifBuilder.build().frostConfig())
+ NotificationManagerCompat.from(this).notify(999, notifBuilder.build())
}
private fun summaryNotification(userId: Long, count: Int, contentRes: Int, pendingUrl: String, groupPrefix: String) {
@@ -250,7 +250,7 @@ class NotificationService : JobService() {
.setContentIntent(pendingIntent)
.setCategory(Notification.CATEGORY_SOCIAL)
- NotificationManagerCompat.from(this).notify("${groupPrefix}_$userId", userId.toInt(), notifBuilder.build().frostConfig())
+ NotificationManagerCompat.from(this).notify("${groupPrefix}_$userId", userId.toInt(), notifBuilder.build())
}
} \ No newline at end of file
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/settings/Notifications.kt b/app/src/main/kotlin/com/pitchedapps/frost/settings/Notifications.kt
index 8fcb3594..429b74fb 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/settings/Notifications.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/settings/Notifications.kt
@@ -1,7 +1,12 @@
package com.pitchedapps.frost.settings
+import android.content.Intent
+import android.media.RingtoneManager
+import android.net.Uri
import ca.allanwang.kau.kpref.activity.KPrefAdapterBuilder
+import ca.allanwang.kau.kpref.activity.items.KPrefText
import ca.allanwang.kau.utils.minuteToText
+import ca.allanwang.kau.utils.string
import com.pitchedapps.frost.R
import com.pitchedapps.frost.activities.SettingsActivity
import com.pitchedapps.frost.services.fetchNotifications
@@ -11,6 +16,7 @@ import com.pitchedapps.frost.utils.frostSnackbar
import com.pitchedapps.frost.utils.materialDialogThemed
import com.pitchedapps.frost.views.Keywords
+
/**
* Created by Allan Wang on 2017-06-29.
*/
@@ -59,7 +65,36 @@ fun SettingsActivity.getNotificationPrefs(): KPrefAdapterBuilder.() -> Unit = {
descRes = R.string.notification_messages_desc
}
- checkbox(R.string.notification_sound, { Prefs.notificationSound }, { Prefs.notificationSound = it })
+ checkbox(R.string.notification_sound, { Prefs.notificationSound }, { Prefs.notificationSound = it; reloadByTitle(R.string.notification_ringtone, R.string.message_ringtone) })
+
+ fun KPrefText.KPrefTextContract<String>.ringtone(code: Int) {
+ enabler = { Prefs.notificationSound }
+ textGetter = {
+ if (it.isBlank()) string(R.string.kau_default)
+ else RingtoneManager.getRingtone(this@getNotificationPrefs, Uri.parse(it)).getTitle(this@getNotificationPrefs)
+ }
+ onClick = {
+ _, _, item ->
+ val intent = Intent(RingtoneManager.ACTION_RINGTONE_PICKER).apply {
+ putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, string(R.string.select_ringtone))
+ putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false)
+ putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true)
+ putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION)
+ if (item.pref.isNotBlank())
+ putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Uri.parse(item.pref))
+ }
+ startActivityForResult(intent, code)
+ true
+ }
+ }
+
+ text(R.string.notification_ringtone, { Prefs.notificationRingtone }, { Prefs.notificationRingtone = it }) {
+ ringtone(SettingsActivity.REQUEST_NOTIFICATION_RINGTONE)
+ }
+
+ text(R.string.message_ringtone, { Prefs.messageRingtone }, { Prefs.messageRingtone = it }) {
+ ringtone(SettingsActivity.REQUEST_MESSAGE_RINGTONE)
+ }
checkbox(R.string.notification_vibrate, { Prefs.notificationVibrate }, { Prefs.notificationVibrate = it })
@@ -75,5 +110,4 @@ fun SettingsActivity.getNotificationPrefs(): KPrefAdapterBuilder.() -> Unit = {
}
}
-
} \ No newline at end of file
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/Downloader.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/Downloader.kt
index 35f69bca..60d709fb 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/utils/Downloader.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/Downloader.kt
@@ -13,9 +13,9 @@ import ca.allanwang.kau.utils.copyFromInputStream
import ca.allanwang.kau.utils.string
import com.pitchedapps.frost.BuildConfig
import com.pitchedapps.frost.R
-import com.pitchedapps.frost.services.frostConfig
import com.pitchedapps.frost.services.frostNotification
import com.pitchedapps.frost.services.getNotificationPendingCancelIntent
+import com.pitchedapps.frost.services.quiet
import okhttp3.MediaType
import okhttp3.OkHttpClient
import okhttp3.Request
@@ -66,7 +66,7 @@ private fun AnkoAsyncContext<Context>.frostDownloadImpl(url: String, type: Downl
val notifId = Math.abs(url.hashCode() + System.currentTimeMillis().toInt())
var notifBuilderAttempt: NotificationCompat.Builder? = null
weakRef.get()?.apply {
- notifBuilderAttempt = frostNotification
+ notifBuilderAttempt = frostNotification.quiet
.setContentTitle(string(type.downloadingRes))
.setCategory(Notification.CATEGORY_PROGRESS)
.setWhen(System.currentTimeMillis())
@@ -133,7 +133,7 @@ private fun OkHttpClient.cancel(url: String) {
private fun NotificationCompat.Builder.show(weakRef: WeakReference<Context>, notifId: Int) {
val c = weakRef.get() ?: return
- NotificationManagerCompat.from(c).notify(DOWNLOAD_GROUP, notifId, build().frostConfig())
+ NotificationManagerCompat.from(c).notify(DOWNLOAD_GROUP, notifId, build())
}
private class ProgressResponseBody(
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt
index 3ad90652..af605388 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt
@@ -7,9 +7,9 @@ import ca.allanwang.kau.kpref.StringSet
import ca.allanwang.kau.kpref.kpref
import ca.allanwang.kau.utils.isColorVisibleOn
import com.pitchedapps.frost.enums.FACEBOOK_BLUE
+import com.pitchedapps.frost.enums.FeedSort
import com.pitchedapps.frost.enums.MainActivityLayout
import com.pitchedapps.frost.enums.Theme
-import com.pitchedapps.frost.enums.FeedSort
import com.pitchedapps.frost.injectors.InjectorContract
/**
@@ -104,6 +104,10 @@ object Prefs : KPref() {
var notificationSound: Boolean by kpref("notification_sound", true)
+ var notificationRingtone: String by kpref("notification_ringtone", "")
+
+ var messageRingtone: String by kpref("message_ringtone", "")
+
var notificationLights: Boolean by kpref("notification_lights", true)
var messageScrollToBottom: Boolean by kpref("message_scroll_to_bottom", false)
diff --git a/app/src/main/res/values/strings_pref_notifications.xml b/app/src/main/res/values/strings_pref_notifications.xml
index 3cd953f6..6d8c5d5e 100644
--- a/app/src/main/res/values/strings_pref_notifications.xml
+++ b/app/src/main/res/values/strings_pref_notifications.xml
@@ -12,10 +12,15 @@
<string name="notification_messages">Enable message notifications</string>
<string name="notification_messages_desc">Get instant message notifications for your current account.</string>
<string name="notification_fetch_now">Fetch Notifications Now</string>
- <string name="notification_fetch_now_desc">Trigger the notification fetcher one time.</string>
+ <string name="notification_fetch_now_desc">Trigger the notification fetcher once. Note that fetching instant messages takes time.</string>
<string name="notification_fetch_success">Fetching Notifications…</string>
<string name="notification_fetch_fail">Couldn\'t fetch notifications</string>
<string name="notification_sound">Notification sound</string>
+
+ <string name="notification_ringtone">Notification Ringtone</string>
+ <string name="message_ringtone">Message Ringtone</string>
+ <string name="select_ringtone">Selet Ringtone</string>
+
<string name="notification_vibrate">Notification vibration</string>
<string name="notification_lights">Notification lights</string>
diff --git a/app/src/main/res/values/strings_preferences.xml b/app/src/main/res/values/strings_preferences.xml
index 05335345..590e8fe5 100644
--- a/app/src/main/res/values/strings_preferences.xml
+++ b/app/src/main/res/values/strings_preferences.xml
@@ -2,7 +2,7 @@
<string name="appearance">Appearance</string>
<string name="appearance_desc">Theme, Items to display, etc</string>
- <string name="notifications_desc">Frequency, filters, etc</string>
+ <string name="notifications_desc">Frequency, filters, ringtones, etc</string>
<string name="newsfeed">News Feed</string>
<string name="newsfeed_desc">Define what items appear in the newsfeed</string>
diff --git a/app/src/main/res/xml/frost_changelog.xml b/app/src/main/res/xml/frost_changelog.xml
index e1db7e36..5cbc6791 100644
--- a/app/src/main/res/xml/frost_changelog.xml
+++ b/app/src/main/res/xml/frost_changelog.xml
@@ -11,7 +11,13 @@
<!--<version title="Beta Updates" />-->
<version title="Beta Updates"/>
- <item text="Update secondary background for transparent themes to be more visible." />
+ <item text="Fix url loading bug and add option to launch urls in default browser (behaviour setting)" />
+ <item text="Allow for bottom bar tabs (appearance setting)" />
+ <item text="Allow custom ringtones for notifications and messages (notification setting)" />
+ <item text="" />
+
+ <version title="v1.4.7"/>
+ <item text="Update secondary background for transparent themes to be more visible." />
<item text="Pressing enter when searching will launch the full search page" />
<item text="Add different backgrounds for news feed articles." />
<item text="Add option to get image/video from default camera or gallery app." />
@@ -19,8 +25,6 @@
<item text="Remove error dialog for IAB. It will now depend solely on the google services dialogs." />
<item text="Fix loading issue for old conversations" />
<item text="Add debugger for failed image activities" />
- <item text="" />
- <item text="" />
<version title="v1.4.5"/>
<item text="Create more robust IM notification fetcher with a timeout" />