diff --git a/app/src/androidTest/java/org/tasks/preferences/PermissivePermissionChecker.kt b/app/src/androidTest/java/org/tasks/preferences/PermissivePermissionChecker.kt
index 45bce8157..eb84c38bc 100644
--- a/app/src/androidTest/java/org/tasks/preferences/PermissivePermissionChecker.kt
+++ b/app/src/androidTest/java/org/tasks/preferences/PermissivePermissionChecker.kt
@@ -6,6 +6,8 @@ import dagger.hilt.android.qualifiers.ApplicationContext
class PermissivePermissionChecker(@ApplicationContext context: Context) : PermissionChecker(context) {
override fun canAccessCalendars() = true
+ override fun canAccessAccounts() = true
+
override fun canAccessForegroundLocation() = true
override fun canAccessBackgroundLocation() = true
diff --git a/app/src/debug/java/org/tasks/BuildSetup.kt b/app/src/debug/java/org/tasks/BuildSetup.kt
index 53bd6503c..a7ceac3c8 100644
--- a/app/src/debug/java/org/tasks/BuildSetup.kt
+++ b/app/src/debug/java/org/tasks/BuildSetup.kt
@@ -3,6 +3,7 @@ package org.tasks
import android.app.Application
import android.os.StrictMode
import android.os.StrictMode.VmPolicy
+import com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo
import com.todoroo.andlib.utility.AndroidUtilities.atLeastQ
import leakcanary.AppWatcher
import org.tasks.logging.FileLogger
@@ -36,7 +37,9 @@ class BuildSetup @Inject constructor(
.detectLeakedClosableObjects()
.detectFileUriExposure()
.penaltyLog()
- .detectContentUriWithoutPermission()
+ if (atLeastOreo()) {
+ builder.detectContentUriWithoutPermission()
+ }
if (atLeastQ()) {
builder
.detectCredentialProtectedWhileLocked()
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e71ea4e76..6e5e260de 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -66,6 +66,7 @@
+
diff --git a/app/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.kt b/app/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.kt
index e47f1990b..55cf3da5c 100644
--- a/app/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.kt
+++ b/app/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.kt
@@ -39,14 +39,32 @@ object AndroidUtilities {
return (dp * displayMetrics.density + 0.5f).toInt()
}
+ fun preOreo(): Boolean {
+ return !atLeastOreo()
+ }
+
fun preS(): Boolean {
return !atLeastS()
}
+ @JvmStatic
+ fun preTiramisu(): Boolean {
+ return !atLeastTiramisu()
+ }
+
fun preUpsideDownCake(): Boolean {
return Build.VERSION.SDK_INT <= VERSION_CODES.TIRAMISU
}
+ fun atLeastNougatMR1(): Boolean {
+ return Build.VERSION.SDK_INT >= VERSION_CODES.N_MR1
+ }
+
+ @JvmStatic
+ fun atLeastOreo(): Boolean {
+ return Build.VERSION.SDK_INT >= VERSION_CODES.O
+ }
+
fun atLeastOreoMR1(): Boolean {
return Build.VERSION.SDK_INT >= VERSION_CODES.O_MR1
}
diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.kt b/app/src/main/java/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.kt
index 01a518cf6..52fa2cd22 100644
--- a/app/src/main/java/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.kt
+++ b/app/src/main/java/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.kt
@@ -26,6 +26,7 @@ import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_GOOGLE_TASKS
import org.tasks.dialogs.DialogBuilder
import org.tasks.gtasks.GoogleAccountManager
+import org.tasks.preferences.ActivityPermissionRequestor
import org.tasks.preferences.PermissionRequestor
import javax.inject.Inject
@@ -40,11 +41,14 @@ class GtasksLoginActivity : AppCompatActivity() {
@Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var googleAccountManager: GoogleAccountManager
@Inject lateinit var caldavDao: CaldavDao
+ @Inject lateinit var permissionRequestor: ActivityPermissionRequestor
@Inject lateinit var firebase: Firebase
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- chooseAccount()
+ if (permissionRequestor.requestAccountPermissions()) {
+ chooseAccount()
+ }
}
private fun chooseAccount() {
diff --git a/app/src/main/java/org/tasks/ShortcutManager.kt b/app/src/main/java/org/tasks/ShortcutManager.kt
index abbbe0230..e6c525a8c 100644
--- a/app/src/main/java/org/tasks/ShortcutManager.kt
+++ b/app/src/main/java/org/tasks/ShortcutManager.kt
@@ -2,16 +2,23 @@ package org.tasks
import android.content.Context
import android.content.pm.ShortcutManager
+import com.todoroo.andlib.utility.AndroidUtilities
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class ShortcutManager @Inject constructor(@ApplicationContext context: Context) {
- private val shortcutManager = context.getSystemService(ShortcutManager::class.java)
+ private val shortcutManager: ShortcutManager? = if (AndroidUtilities.atLeastNougatMR1()) {
+ context.getSystemService(ShortcutManager::class.java)
+ } else {
+ null
+ }
fun reportShortcutUsed(shortcutId: String) {
- shortcutManager?.reportShortcutUsed(shortcutId)
+ if (AndroidUtilities.atLeastNougatMR1()) {
+ shortcutManager?.reportShortcutUsed(shortcutId)
+ }
}
companion object {
diff --git a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt
index 758af0423..b5e3903bb 100644
--- a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt
+++ b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.kt
@@ -8,6 +8,7 @@ import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Paint
+import android.os.Build
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
@@ -25,7 +26,7 @@ import androidx.lifecycle.lifecycleScope
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizeDp
-import com.todoroo.andlib.utility.AndroidUtilities.atLeastS
+import com.todoroo.andlib.utility.AndroidUtilities
import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.analytics.Firebase
@@ -200,7 +201,7 @@ abstract class BaseListSettingsActivity : AppCompatActivity(), ColorPalettePicke
protected fun createWidget() {
val filter = filter ?: return
val appWidgetManager = getSystemService(AppWidgetManager::class.java)
- if (appWidgetManager.isRequestPinAppWidgetSupported) {
+ if (AndroidUtilities.atLeastOreo() && appWidgetManager.isRequestPinAppWidgetSupported) {
val provider = ComponentName(this, TasksWidget::class.java)
val configIntent = Intent(this, RequestPinWidgetReceiver::class.java).apply {
action = RequestPinWidgetReceiver.ACTION_CONFIGURE_WIDGET
@@ -211,7 +212,7 @@ abstract class BaseListSettingsActivity : AppCompatActivity(), ColorPalettePicke
this,
filter.hashCode(),
configIntent,
- if (atLeastS()) PendingIntent.FLAG_MUTABLE else PendingIntent.FLAG_UPDATE_CURRENT
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else PendingIntent.FLAG_UPDATE_CURRENT
)
appWidgetManager.requestPinAppWidget(provider, null, successCallback)
firebase.logEvent(R.string.event_create_widget, R.string.param_type to "settings_activity")
diff --git a/app/src/main/java/org/tasks/compose/edit/EditTextView.kt b/app/src/main/java/org/tasks/compose/edit/EditTextView.kt
index b8a095016..1addfc91f 100644
--- a/app/src/main/java/org/tasks/compose/edit/EditTextView.kt
+++ b/app/src/main/java/org/tasks/compose/edit/EditTextView.kt
@@ -24,6 +24,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.widget.addTextChangedListener
+import com.todoroo.andlib.utility.AndroidUtilities
import org.tasks.R
import org.tasks.dialogs.Linkify
import org.tasks.markdown.MarkdownProvider
@@ -93,7 +94,9 @@ fun EditTextView(
setBackgroundColor(context.getColor(android.R.color.transparent))
textAlignment = View.TEXT_ALIGNMENT_VIEW_START
- importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_NO
+ if (AndroidUtilities.atLeastOreo()) {
+ importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_NO
+ }
freezesText = true
setHorizontallyScrolling(false)
setHint(hint)
diff --git a/app/src/main/java/org/tasks/compose/settings/AddWidgetToHomeRow.kt b/app/src/main/java/org/tasks/compose/settings/AddWidgetToHomeRow.kt
index 35657b786..66ce507cb 100644
--- a/app/src/main/java/org/tasks/compose/settings/AddWidgetToHomeRow.kt
+++ b/app/src/main/java/org/tasks/compose/settings/AddWidgetToHomeRow.kt
@@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.Home
import androidx.compose.material.icons.outlined.Widgets
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
@@ -19,6 +20,9 @@ import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
+import androidx.core.content.pm.ShortcutManagerCompat
+import com.todoroo.andlib.utility.AndroidUtilities
+import com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo
import org.tasks.R
import org.tasks.compose.Constants
import org.tasks.kmp.org.tasks.compose.settings.SettingRow
@@ -28,7 +32,8 @@ import org.tasks.themes.TasksTheme
fun AddWidgetToHomeRow(onClick: () -> Unit) {
val context = LocalContext.current
val isRequestPinAppWidgetSupported = LocalInspectionMode.current || remember {
- context.getSystemService(AppWidgetManager::class.java).isRequestPinAppWidgetSupported
+ atLeastOreo() &&
+ context.getSystemService(AppWidgetManager::class.java).isRequestPinAppWidgetSupported
}
if (isRequestPinAppWidgetSupported) {
SettingRow(
diff --git a/app/src/main/java/org/tasks/extensions/Context.kt b/app/src/main/java/org/tasks/extensions/Context.kt
index c65da4bf2..0a22e1bc1 100644
--- a/app/src/main/java/org/tasks/extensions/Context.kt
+++ b/app/src/main/java/org/tasks/extensions/Context.kt
@@ -13,6 +13,7 @@ import android.content.res.Configuration
import android.net.ConnectivityManager
import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET
import android.net.Uri
+import android.os.Build
import android.provider.Settings
import android.text.format.DateFormat
import android.view.View
@@ -132,18 +133,22 @@ object Context {
}
fun Context.openAppNotificationSettings() {
- startActivity(
- Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
- .putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
- )
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ startActivity(
+ Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
+ .putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
+ )
+ }
}
fun Context.openChannelNotificationSettings() {
- startActivity(
- Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
- .putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
- .putExtra(Settings.EXTRA_CHANNEL_ID, NOTIFICATION_CHANNEL_DEFAULT)
- )
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ startActivity(
+ Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
+ .putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
+ .putExtra(Settings.EXTRA_CHANNEL_ID, NOTIFICATION_CHANNEL_DEFAULT)
+ )
+ }
}
fun Context.takePersistableUriPermission(
diff --git a/app/src/main/java/org/tasks/files/FileHelper.kt b/app/src/main/java/org/tasks/files/FileHelper.kt
index a3330d794..537965ead 100644
--- a/app/src/main/java/org/tasks/files/FileHelper.kt
+++ b/app/src/main/java/org/tasks/files/FileHelper.kt
@@ -1,10 +1,12 @@
package org.tasks.files
+import android.annotation.TargetApi
import android.app.Activity
import android.content.ContentResolver
import android.content.Context
import android.content.Intent
import android.net.Uri
+import android.os.Build
import android.provider.DocumentsContract
import android.provider.OpenableColumns
import android.webkit.MimeTypeMap
@@ -75,6 +77,7 @@ object FileHelper {
fragment.startActivityForResult(intent, rc)
}
+ @TargetApi(Build.VERSION_CODES.O)
private fun setInitialUri(context: Context?, intent: Intent, uri: Uri?) {
if (uri == null || uri.scheme != ContentResolver.SCHEME_CONTENT) {
return
diff --git a/app/src/main/java/org/tasks/gtasks/GoogleAccountManager.kt b/app/src/main/java/org/tasks/gtasks/GoogleAccountManager.kt
index c0f3880e7..1a0063011 100644
--- a/app/src/main/java/org/tasks/gtasks/GoogleAccountManager.kt
+++ b/app/src/main/java/org/tasks/gtasks/GoogleAccountManager.kt
@@ -15,6 +15,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.tasks.R
import org.tasks.Strings.isNullOrEmpty
+import org.tasks.preferences.PermissionChecker
import org.tasks.preferences.Preferences
import timber.log.Timber
import java.io.IOException
@@ -22,6 +23,7 @@ import javax.inject.Inject
class GoogleAccountManager @Inject constructor(
@ApplicationContext context: Context?,
+ private val permissionChecker: PermissionChecker,
private val preferences: Preferences
) {
private val accountManager: AccountManager = AccountManager.get(context)
@@ -30,7 +32,11 @@ class GoogleAccountManager @Inject constructor(
get() = accountList.map { it.name }
private val accountList: List
- get() = accountManager.getAccountsByType("com.google").toList()
+ get() = if (permissionChecker.canAccessAccounts()) {
+ accountManager.getAccountsByType("com.google").toList()
+ } else {
+ emptyList()
+ }
fun getAccount(name: String?): Account? = if (isNullOrEmpty(name)) {
null
diff --git a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt
index c345f3133..0acc8ecbb 100644
--- a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt
+++ b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.kt
@@ -100,7 +100,8 @@ class GoogleTaskSynchronizer @Inject constructor(
@Throws(IOException::class)
private suspend fun synchronize(account: CaldavAccount) {
- if (googleAccountManager.getAccount(account.username) == null) {
+ if (!permissionChecker.canAccessAccounts()
+ || googleAccountManager.getAccount(account.username) == null) {
account.error = context.getString(R.string.cannot_access_account)
return
}
diff --git a/app/src/main/java/org/tasks/notifications/NotificationManager.kt b/app/src/main/java/org/tasks/notifications/NotificationManager.kt
index 828826530..84d5ebbf1 100644
--- a/app/src/main/java/org/tasks/notifications/NotificationManager.kt
+++ b/app/src/main/java/org/tasks/notifications/NotificationManager.kt
@@ -6,6 +6,7 @@ import android.content.Context
import android.content.Intent
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat.InterruptionFilter
+import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.andlib.utility.AndroidUtilities.preUpsideDownCake
import com.todoroo.astrid.utility.Constants
import dagger.hilt.android.qualifiers.ApplicationContext
@@ -214,6 +215,16 @@ class NotificationManager @Inject constructor(
if (preUpsideDownCake()) {
builder.setLocalOnly(!preferences.getBoolean(R.string.p_wearable_notifications, true))
}
+ if (AndroidUtilities.preOreo()) {
+ if (alert) {
+ builder
+ .setSound(preferences.ringtone)
+ .setPriority(NotificationCompat.PRIORITY_HIGH)
+ .setDefaults(preferences.notificationDefaults)
+ } else {
+ builder.setDefaults(0).setTicker(null)
+ }
+ }
val notification = builder.build()
var ringTimes = if (fiveTimes) 5 else 1
if (alert && nonstop) {
diff --git a/app/src/main/java/org/tasks/preferences/PermissionChecker.java b/app/src/main/java/org/tasks/preferences/PermissionChecker.java
index daa79af25..4afdbb8dc 100644
--- a/app/src/main/java/org/tasks/preferences/PermissionChecker.java
+++ b/app/src/main/java/org/tasks/preferences/PermissionChecker.java
@@ -1,5 +1,6 @@
package org.tasks.preferences;
+import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastQ;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastTiramisu;
import static java.util.Arrays.asList;
@@ -29,6 +30,10 @@ public class PermissionChecker {
return checkPermissions(permission.READ_CALENDAR, permission.WRITE_CALENDAR);
}
+ public boolean canAccessAccounts() {
+ return atLeastOreo() || checkPermissions(permission.GET_ACCOUNTS);
+ }
+
public boolean canAccessForegroundLocation() {
return checkPermissions(permission.ACCESS_FINE_LOCATION);
}
diff --git a/app/src/main/java/org/tasks/preferences/PermissionRequestor.java b/app/src/main/java/org/tasks/preferences/PermissionRequestor.java
index 645be9ab4..2f8ba9a27 100644
--- a/app/src/main/java/org/tasks/preferences/PermissionRequestor.java
+++ b/app/src/main/java/org/tasks/preferences/PermissionRequestor.java
@@ -17,6 +17,14 @@ public abstract class PermissionRequestor {
this.permissionChecker = permissionChecker;
}
+ public boolean requestAccountPermissions() {
+ if (permissionChecker.canAccessAccounts()) {
+ return true;
+ }
+ requestPermissions(REQUEST_GOOGLE_ACCOUNTS, permission.GET_ACCOUNTS);
+ return false;
+ }
+
public boolean requestForegroundLocation() {
if (permissionChecker.canAccessForegroundLocation()) {
return true;
diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt
index 019cead4c..061433813 100644
--- a/app/src/main/java/org/tasks/preferences/Preferences.kt
+++ b/app/src/main/java/org/tasks/preferences/Preferences.kt
@@ -145,6 +145,12 @@ class Preferences @JvmOverloads constructor(
return defaultCalendar != null && defaultCalendar != "-1" && defaultCalendar != "0"
}
+ val ringtone: Uri?
+ get() = getRingtone(
+ R.string.p_rmd_ringtone,
+ RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
+ )
+
val completionSound: Uri?
get() = getRingtone(
R.string.p_completion_ringtone,
@@ -433,6 +439,18 @@ class Preferences @JvmOverloads constructor(
Binder.getCallingUid(),
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION))
+ val notificationDefaults: Int
+ get() {
+ var result = 0
+ if (getBoolean(R.string.p_rmd_vibrate, true)) {
+ result = result or NotificationCompat.DEFAULT_VIBRATE
+ }
+ if (getBoolean(R.string.p_led_notification, true)) {
+ result = result or NotificationCompat.DEFAULT_LIGHTS
+ }
+ return result
+ }
+
fun remove(resId: Int) {
val editor = prefs.edit()
editor.remove(context.getString(resId))
diff --git a/app/src/main/java/org/tasks/preferences/fragments/Backups.kt b/app/src/main/java/org/tasks/preferences/fragments/Backups.kt
index 4d056c13c..4c463abb8 100644
--- a/app/src/main/java/org/tasks/preferences/fragments/Backups.kt
+++ b/app/src/main/java/org/tasks/preferences/fragments/Backups.kt
@@ -34,6 +34,7 @@ private const val FRAG_TAG_IMPORT_TASKS = "frag_tag_import_tasks"
class Backups : InjectingPreferenceFragment() {
@Inject lateinit var preferences: Preferences
+ @Inject lateinit var permissionRequestor: FragmentPermissionRequestor
private val viewModel: PreferencesViewModel by activityViewModels()
@@ -246,10 +247,12 @@ class Backups : InjectingPreferenceFragment() {
}
private fun requestGoogleDriveLogin() {
- startActivityForResult(
- Intent(context, DriveLoginActivity::class.java),
- REQUEST_DRIVE_BACKUP
- )
+ if (permissionRequestor.requestAccountPermissions()) {
+ startActivityForResult(
+ Intent(context, DriveLoginActivity::class.java),
+ REQUEST_DRIVE_BACKUP
+ )
+ }
}
private fun updateBackupDirectory() {
diff --git a/app/src/main/java/org/tasks/preferences/fragments/Notifications.kt b/app/src/main/java/org/tasks/preferences/fragments/Notifications.kt
index 9285dc0e3..4e04d22f7 100644
--- a/app/src/main/java/org/tasks/preferences/fragments/Notifications.kt
+++ b/app/src/main/java/org/tasks/preferences/fragments/Notifications.kt
@@ -61,6 +61,7 @@ class Notifications : InjectingPreferenceFragment() {
)
rescheduleNotificationsOnChange(true, R.string.p_bundle_notifications)
+ initializeRingtonePreference()
initializeCompletionSoundPreference()
initializeTimePreference(getDefaultRemindTimePreference()!!, REQUEST_DEFAULT_REMIND)
initializeTimePreference(getQuietStartPreference()!!, REQUEST_QUIET_START)
@@ -139,6 +140,13 @@ class Notifications : InjectingPreferenceFragment() {
openUrl(R.string.troubleshooting, R.string.url_notifications)
+ requires(AndroidUtilities.atLeastOreo(), R.string.more_settings)
+ requires(
+ AndroidUtilities.preOreo(),
+ R.string.p_rmd_ringtone,
+ R.string.p_rmd_vibrate,
+ R.string.p_led_notification
+ )
requires(
AndroidUtilities.preUpsideDownCake(),
R.string.p_rmd_persistent,
@@ -191,6 +199,7 @@ class Notifications : InjectingPreferenceFragment() {
override fun onPreferenceTreeClick(preference: Preference): Boolean =
when (preference.key) {
+ getString(R.string.p_rmd_ringtone),
getString(R.string.p_completion_ringtone) -> {
val intent = Intent(RingtoneManager.ACTION_RINGTONE_PICKER)
intent.putExtra(
@@ -224,7 +233,11 @@ class Notifications : InjectingPreferenceFragment() {
}
startActivityForResult(
intent,
- REQUEST_CODE_COMPLETION_SOUND
+ if (preference.key == getString(R.string.p_rmd_ringtone)) {
+ REQUEST_CODE_ALERT_RINGTONE
+ } else {
+ REQUEST_CODE_COMPLETION_SOUND
+ }
)
true
}
@@ -254,6 +267,12 @@ class Notifications : InjectingPreferenceFragment() {
}
}
+ private fun initializeRingtonePreference() =
+ initializeRingtonePreference(
+ R.string.p_rmd_ringtone,
+ R.string.silent,
+ )
+
private fun initializeCompletionSoundPreference() =
initializeRingtonePreference(
R.string.p_completion_ringtone,
@@ -291,6 +310,16 @@ class Notifications : InjectingPreferenceFragment() {
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
+ REQUEST_CODE_ALERT_RINGTONE -> if (resultCode == RESULT_OK && data != null) {
+ val ringtone: Uri? =
+ data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
+ if (ringtone != null) {
+ preferences.setString(R.string.p_rmd_ringtone, ringtone.toString())
+ } else {
+ preferences.setString(R.string.p_rmd_ringtone, "")
+ }
+ initializeRingtonePreference()
+ }
REQUEST_CODE_COMPLETION_SOUND -> if (resultCode == RESULT_OK && data != null) {
val ringtone: Uri? =
data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
@@ -325,6 +354,7 @@ class Notifications : InjectingPreferenceFragment() {
private const val REQUEST_QUIET_START = 10001
private const val REQUEST_QUIET_END = 10002
private const val REQUEST_DEFAULT_REMIND = 10003
+ private const val REQUEST_CODE_ALERT_RINGTONE = 10005
private const val REQUEST_CODE_TTS_CHECK = 10006
private const val REQUEST_CODE_COMPLETION_SOUND = 10007
}
diff --git a/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.kt b/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.kt
index 38c0cf10d..2ed083961 100644
--- a/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.kt
+++ b/app/src/main/java/org/tasks/scheduling/NotificationSchedulerIntentService.kt
@@ -1,8 +1,11 @@
package org.tasks.scheduling
+import android.annotation.TargetApi
import android.app.NotificationChannel
import android.content.Context
import android.content.Intent
+import android.os.Build
+import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.andlib.utility.AndroidUtilities.preS
import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.qualifiers.ApplicationContext
@@ -28,25 +31,28 @@ class NotificationSchedulerIntentService : InjectingJobIntentService() {
}
private fun createNotificationChannels() {
- val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager
- notificationManager.createNotificationChannel(
- createNotificationChannel(NotificationManager.NOTIFICATION_CHANNEL_DEFAULT, R.string.notifications, true))
- notificationManager.createNotificationChannel(
- createNotificationChannel(NotificationManager.NOTIFICATION_CHANNEL_TASKER, R.string.tasker_locale, true))
- notificationManager.createNotificationChannel(
- createNotificationChannel(
- NotificationManager.NOTIFICATION_CHANNEL_TIMERS, R.string.TEA_timer_controls, true))
- if (preS()) {
+ if (AndroidUtilities.atLeastOreo()) {
+ val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager
notificationManager.createNotificationChannel(
- createNotificationChannel(
- NotificationManager.NOTIFICATION_CHANNEL_MISCELLANEOUS,
- R.string.miscellaneous,
- false
+ createNotificationChannel(NotificationManager.NOTIFICATION_CHANNEL_DEFAULT, R.string.notifications, true))
+ notificationManager.createNotificationChannel(
+ createNotificationChannel(NotificationManager.NOTIFICATION_CHANNEL_TASKER, R.string.tasker_locale, true))
+ notificationManager.createNotificationChannel(
+ createNotificationChannel(
+ NotificationManager.NOTIFICATION_CHANNEL_TIMERS, R.string.TEA_timer_controls, true))
+ if (preS()) {
+ notificationManager.createNotificationChannel(
+ createNotificationChannel(
+ NotificationManager.NOTIFICATION_CHANNEL_MISCELLANEOUS,
+ R.string.miscellaneous,
+ false
+ )
)
- )
+ }
}
}
+ @TargetApi(Build.VERSION_CODES.O)
private fun createNotificationChannel(
channelId: String, nameResId: Int, alert: Boolean): NotificationChannel {
val channelName = context.getString(nameResId)
diff --git a/app/src/main/java/org/tasks/themes/ThemeColor.java b/app/src/main/java/org/tasks/themes/ThemeColor.java
index 04c5802bc..dee81edec 100644
--- a/app/src/main/java/org/tasks/themes/ThemeColor.java
+++ b/app/src/main/java/org/tasks/themes/ThemeColor.java
@@ -1,15 +1,18 @@
package org.tasks.themes;
+import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo;
import static org.tasks.kmp.org.tasks.themes.ColorProvider.WHITE;
import static org.tasks.themes.ColorUtilsKt.calculateContrast;
import android.app.Activity;
import android.content.Context;
+import android.os.Build.VERSION_CODES;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.View;
import androidx.annotation.ColorInt;
+import androidx.annotation.RequiresApi;
import androidx.core.os.ParcelCompat;
import org.tasks.R;
@@ -188,11 +191,14 @@ public class ThemeColor implements Pickable {
public void applyToNavigationBar(Activity activity) {
activity.getWindow().setNavigationBarColor(getPrimaryColor());
- View decorView = activity.getWindow().getDecorView();
- int systemUiVisibility = applyLightNavigationBar(decorView.getSystemUiVisibility());
- decorView.setSystemUiVisibility(systemUiVisibility);
+ if (atLeastOreo()) {
+ View decorView = activity.getWindow().getDecorView();
+ int systemUiVisibility = applyLightNavigationBar(decorView.getSystemUiVisibility());
+ decorView.setSystemUiVisibility(systemUiVisibility);
+ }
}
+ @RequiresApi(api = VERSION_CODES.O)
private int applyLightNavigationBar(int flag) {
return isDark
? flag | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 87a25eb25..6b0bbff31 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -94,6 +94,9 @@
إظهار الرأس
إظهار الإعدادات
إشعارات
+ الصمت
+ صوت
+ إهتزازات
الساعات الهادئة
مفعّل
حجم الخط
@@ -144,6 +147,7 @@
القائمة الافتراضية
اضف المهام الجديدة لاعلى القائمة
أضف حساب
+ إشعار LED
عرض الإشعارات على الساعة الذكية
توليد الإخطارات
ادمج عدة إشعارات في شعار واحد
@@ -531,6 +535,7 @@
أعده %s
حزمة الاشعارات
أزل المهام المتممة؟
+ مطلوب دعم الأجهزة
أعد تشغيل التطبيق ليأخذ هذا التغيير تأثيره
عتمة التذييل
عتمة العنوان
diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml
index 6eb9a9674..eb7959e1e 100644
--- a/app/src/main/res/values-bg-rBG/strings.xml
+++ b/app/src/main/res/values-bg-rBG/strings.xml
@@ -220,6 +220,9 @@
Заглавка
Настройки
Известия
+ Безшумен
+ Звук
+ Вибрации
Тихи часове
Папка за прикачени файлове
Папка за резервни копия
@@ -295,6 +298,8 @@
Рестартиране
По-късно
Локализация
+ Известия с LED
+ Необходима е апаратна поддръжка
Настройки на приспособления
Настройки на заглавката
Настройки на реда
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index ec986156f..a55b1e173 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -88,6 +88,7 @@
Mostra completades
Idioma
Localització
+ Led de notificació
Recolzades %1$s de %2$s.
El fitxer %1$s contenia %2$s.
\n
@@ -347,6 +348,8 @@
Es necessiten els permisos de ubicació per trobar la teva ubicació actual
Noves tasques a sobre
Ajuda
+ Silenci
+ Vibracions
Llista
Mostra la descripció
Llicències de tercers
@@ -385,6 +388,7 @@
després de 24 hores
immediatament
Proper dm
+ So
Valora Tasks
Etiquetes
Demà pel matí
@@ -485,6 +489,7 @@
Tema
Icona del llançador
Negre
+ Es requereix suport per al maquinari
Preferències del giny
Color
Icona
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 4918e5991..5c50ac073 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -129,6 +129,9 @@
Zobrazit záhlaví
Zobrazit nastavení
Oznámení
+ Tichý
+ Zvuk
+ Vibrace
Období nerušení
Složka pro zálohy
Různé
@@ -311,6 +314,8 @@
Zadejte adresu serveru
Musí začínat na http(s)://
Ikona na domovské obrazovce
+ LED upozornění
+ Je vyžadována hardwarová podpora
Nastavení záhlaví
Nastavení řádku
Smazat splněné úkoly\?
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 461d23315..76a85fb53 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -243,6 +243,8 @@
Rækkeindstillinger
Header-indstillinger
Widget-indstillinger
+ Skal understøttes af hardware
+ LED-påmindelse
Oversættelse
Senere
Genstart nu
@@ -316,6 +318,9 @@
Google Drev-backup
Mappe til sikkerhedskopi
Mappe til vedhæftninger
+ Vibrér
+ Lyd
+ Lydløs
Meddelelser
Vis afgrænsninger
Vis menu
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 8e5a894bc..983979511 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -213,6 +213,9 @@
Kopfleiste anzeigen
Einstellungen anzeigen
Benachrichtigungen
+ Ohne Ton
+ Ton
+ Vibration
Ruhezeit
Ordner für Anhänge
Sicherungsordner
@@ -285,6 +288,8 @@
Jetzt neustarten
Später
Übersetzung
+ Benachrichtigungs-LED
+ Hardware-Unterstützung benötigt
Widget-Einstellungen
Kopfleisteneinstellungen
Zeileneinstellungen
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 29a727948..00820928f 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -4,6 +4,7 @@
Pritaksi Tasks
Helpi traduki
Tipara grando
+ Sono
Sciigoj
Vidigi menuon
Vidigi agordojn
@@ -255,6 +256,8 @@
Diversaj
Dosierujo de savkopioj
Silentaj horoj
+ Vibradoj
+ Silenta
Vidigi titolon
Sekva sab
Sekva ven
@@ -444,6 +447,7 @@
- Tagoj
Foti
+ Bezonas aparataran subtenon
Neniam
Unuigi multajn sciigojn kiel unu
Helpo
@@ -601,6 +605,7 @@
Butono reen konservas taskon
Restartigu Tasks por efikigi ĉi tiun ŝanĝon
Restartigi tuj
+ LED sciigo
Fin-al-fina ĉifrada sinkronigo
AVERTO: Dosieroj situas en %s estos forigitaj se Tasks malinstaliĝos! Bonvolu elekti propran lokon por malpermesi ke Android forigos viajn dosierojn.
Tasko finita
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 2b4143f07..004b06565 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -234,6 +234,9 @@
Mostrar cabecera
Mostrar configuración
Notificaciones
+ Silencioso
+ Sonido
+ Vibraciones
Horario silencioso
Carpeta de datos adjuntos
Carpeta de copias de seguridad
@@ -307,6 +310,8 @@
Reiniciar ahora
Más tarde
Configuración regional
+ Notificación de LED
+ Se necesita compatibilidad de hárdwer
Configuración de widget
Configuración de cabecera
Configuración de fila
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index e9f4b969b..32f312427 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -125,6 +125,9 @@
Näita päist
Näita seadistusi
Teavitused
+ Vaikne
+ Heli
+ Vibra
Vaiksed tunnid
Manuste kaust
Varukoopia kaust
@@ -191,6 +194,8 @@
Keel
Taaskäivita kohe
Hiljem
+ LED-teavitused
+ Riistvara tugi on nõutud
Vidina seadistused
Päise seadistused
Rea seadistused
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 1785ac596..41aa426c1 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -221,6 +221,9 @@
Erakutsi goiburua
Erakutsi ezarpenak
Jakinarazpenak
+ Isila
+ Soinua
+ Bibrazioak
Isilune orduak
Eranskinen karpeta
Babes-kopien karpeta
@@ -296,6 +299,8 @@
Berrabiarazi orain
Geroago
Lokalizazioa
+ LED jakinarazpena
+ Hardwareak onartzea ezinbestekoa
Trepetaren ezarpenak
Goiburuaren ezarpenak
Errenkadaren ezarpenak
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 4c7f5c9d0..c4d4d49fb 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -139,6 +139,9 @@
نمایش سربرگ
نمایش تنظیمات
اعلان ها
+ سکوت
+ صدا
+ لرزش ها
ساعات سکوت
پوشه پیوست
پشتیبان گیری از پوشه
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 8da091712..f7056a13a 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -208,6 +208,9 @@
Näytä otsikot
Näytä asetukset
Ilmoitukset
+ Äänetön
+ Ääni
+ Värinä
Hiljainen aika
Liitehakemisto
Varmuuskopioiden hakemisto
@@ -272,6 +275,8 @@
Käynnistä uudelleen nyt
Myöhemmin
Paikallistaminen
+ LED muistutus
+ Laitetuki vaaditaan
Widgetin asetukset
Otsikon asetukset
Rivin asetukset
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 82386b59c..5e3e3a97b 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -221,6 +221,8 @@
Afficher les cases à cocher
Afficher l\'en-tête
Afficher les paramètres
+ Silencieux
+ Son
Heures de repos
Dossier des pièces jointes
Dossier de sauvegarde
@@ -294,6 +296,8 @@
Redémarrer maintenant
Plus tard
Localisation
+ Notification de la LED
+ Support matériel requis
Paramètres du widget
Paramètres de l\'en-tête
Paramètres de la ligne
@@ -392,6 +396,7 @@
- %d minutes
Notifications
+ Vibrations
%s m
Étiquettes
Badges
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 70f746b7a..ef0b86a4f 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -151,6 +151,9 @@
Amosar encabezado
Amosar configuracións
Notificacións
+ Silencioso
+ Son
+ Vibracións
Horario silencioso
Cartafol de anexos
Cartafol de copias de seguranza
@@ -215,6 +218,8 @@
Reiniciar ahora
Máis tarde
Localización
+ Notificación LED
+ Precísase de soporte con hardware
Configuración de widgets
Configuración de cabeceiras
Configuración de filas
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index ebc0ce8ef..472877ef7 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -324,6 +324,8 @@
Otvori popis
Postavke redaka
Postavke zaglavlja
+ Podrška za hardver je obavezna
+ LED obavijest
Lokalizacija
Kasnije
Pokreni ponovo
@@ -396,6 +398,9 @@
Mapa sigurnosnih kopija
Mapa priloga
Vrijeme neobavještavanja
+ Vibracije
+ Zvuk
+ Stišano
Pokaži rastavljače
Pokaži izbornik
Pokaži naslov
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index a0defeedb..31f517096 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -215,6 +215,9 @@
Fejléc megjelenítése
Beállítások megjelenítése
Értesítések
+ Csendes
+ Hang
+ Rezgés
Csendes órák
Csatolmányok mappája
Mentési mappa
@@ -289,6 +292,8 @@
Újraindítás most
Később
Lokalizáció
+ LED értesítés
+ Hardveres támogatás szükséges
Widget beállításai
Fejléc beállításai
Sorok beállíátsai
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index c93e21876..ee276cbb9 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -159,6 +159,7 @@
Tampilkan tajuk
Tampilkan pengaturan
Notifikasi
+ Getar
Direktori isi lampiran
Direktori cadangan
Cadangan Google Drive
@@ -228,6 +229,8 @@
Mulai ulang sekarang
Nanti
Pelokalan bahasa
+ Notifikasi LED
+ Dukungan perangkat keras diperlukan
Pengaturan wisaya
Pengaturan tajuk
Pengaturan baris
@@ -384,6 +387,8 @@
Nilai Tasks
Jarak spasi
Jam Tenang
+ Suara
+ Diamkan
Tampilkan menu
Menambahkan tugas
Jatuh tempo pada…
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index b1f63b93a..6cfa7dabf 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -230,6 +230,9 @@
Mostra intestazione
Mostra impostazioni
Notifiche
+ Silenzioso
+ Suono
+ Vibrazioni
Ore di quiete
Cartella degli allegati
Cartella di backup
@@ -304,6 +307,8 @@
Riavvia ora
Dopo
Localizzazione
+ LED di notifica
+ È richiesto il supporto hardware
Impostazioni widget
Impostazioni intestazione
Impostazioni riga
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 1b3ffe199..edbf70da2 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -251,6 +251,9 @@
הצג כותרת
הצג הגדרות
התראות
+ שקט
+ שמע
+ רטט
שעות שקטות
תיקיית קבצים מצורפים
תיקיית גיבוי
@@ -326,6 +329,8 @@
אתחל כעת
מאוחר יותר
לוקאליזציה
+ תאורת התראות
+ נדרשת חומרה תואמת
הגדרות ווידג\'ט
הגדרות כותרת
הגדרות שורה
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index fe41abd94..5bd7cc2f8 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -217,6 +217,9 @@
ヘッダーを表示
設定を表示
通知
+ サイレント
+ サウンド
+ 振動
おやすみモード
添付フォルダー
フォルダーをバックアップ
@@ -291,6 +294,8 @@
今すぐ再起動
あとで
ローカライズ
+ LED 通知
+ ハードウェア サポートが必要です
ウィジェット設定
ヘッダー設定
行設定
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 69c894fe2..022af3efc 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -215,6 +215,9 @@
헤더 표시
설정버튼 표시
알림
+ 무음
+ 소리
+ 진동
무음 시간
첨부파일 위치
백업 위치
@@ -288,6 +291,8 @@
지금 재시작하기
나중에
현지화
+ LED 알림
+ 하드웨어 지원을 필요로 합니다
위젯 설정
헤더 설정
줄 설정
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index d3edb7f54..5026ecd29 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -240,6 +240,9 @@
Rodyti antraštę
Rodyti nustatymus
Pranešimai
+ Tyla
+ Garsas
+ Vibracijos
Tylusis metas
Pridedamo failo aplankas
Atsarginių kopijų aplankas
@@ -314,6 +317,8 @@
Perkrauti dabar
Vėliau
Lokalizacija
+ LED pranešimai
+ Reikalingas techninės įrangos palaikymas
Valdiklio nustatymai
Antraščių nustatymai
Eilutės nustatymai
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 074a7f445..6500540ee 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -107,6 +107,7 @@
Vis avkryssingsbokser
Vis innstillinger
Varsler
+ Vibrering
Radmellomrom
Kildekode
Kontakt utvikler
@@ -122,6 +123,7 @@
Restart nå
Senere
Lokalisering
+ LED-varsel
Batterioptimalisering kan føre til forsinkede varsler
Samle varsler
Gjentas %s
@@ -254,6 +256,8 @@
stoppet arbeid med dette gjøremålet:
La til gjøremål
Vis hode
+ Stille
+ Lyd
Stilletimer
Vedleggsmappe
Sikkerhetskopimappe
@@ -314,6 +318,7 @@
Mørk
Bakgrunnsbilde
Dag/natt
+ Maskinvarestøtte kreves
Miniprogramsinnstillinger
Hodeinnstillinger
Radinnstillinger
diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml
index ede7807a7..f60963cb1 100644
--- a/app/src/main/res/values-ne/strings.xml
+++ b/app/src/main/res/values-ne/strings.xml
@@ -68,6 +68,7 @@
सेटिङहरू देखाउनुहोस्
शीर्षक देखाउनुहोस्
मेनु देखाउनुहोस्
+ आवाज
श्रोत कोड
विकासकर्तालाई सम्पर्क गर्नुहोस्
मेरा कार्यहरू
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index f259e1ac6..91b2bdcbb 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -214,6 +214,9 @@
Koptekst tonen
Instellingen tonen
Meldingen
+ Stil
+ Geluid
+ Trillingen
Rusttijd
Map voor bijlagen
Backup naar Google Drive
@@ -284,6 +287,8 @@
Start Tasks opnieuw om wijzigingen door te voeren
Herstart nu
Localisatie
+ LED melding
+ Hardware ondersteuning vereist
Widget instellingen
Koptekst instellingen
Regel instellingen
diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml
index e5bfda515..1fa2e2c75 100644
--- a/app/src/main/res/values-or/strings.xml
+++ b/app/src/main/res/values-or/strings.xml
@@ -150,6 +150,7 @@
ଭାଷା
ସିଷ୍ଟମ୍ ଡିଫଲ୍ଟ
ପରେ
+ LED ଵିଜ୍ଞପ୍ତି
ଆଖ୍ୟା ପରେ
ଆଖ୍ୟା ତଳେ
ପ୍ରତି ମିନିଟ୍
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 608442b43..3a1f76afa 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -230,6 +230,9 @@
Pokaż nagłówek
Pokaż ustawienia
Powiadomienia
+ Cichy
+ Dźwięk
+ Wibracje
Ciche godziny
Katalog załączników
Katalog kopii zapasowych
@@ -304,6 +307,8 @@
Zrestartuj teraz
Póżniej
Ustawienia regionalne
+ Powiadomienie LED
+ Wymagane wsparcie sprzętowe
Ustawienie widgetu
Ustawienia nagłówka
Ustawienia rzędu
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 83944da7e..503ebf1ce 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -228,6 +228,9 @@
Mostrar cabeçalho
Mostrar configurações
Notificações
+ Silencioso
+ Som
+ Vibrações
Horas de silêncio
Pasta de anexo
Pasta de backup
@@ -302,6 +305,8 @@
Reiniciar agora
Depois
Localização
+ LED de notificações
+ Suporte de hardware necessário
Configurações de Widget
Configurações do cabeçalho
Configurações de linhas
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 550be71a5..3115027ad 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -210,6 +210,9 @@
Mostrar cabeçalho
Mostrar configurações
Notificações
+ Silêncio
+ Som
+ Vibrações
Horas de silêncio
Pasta de anexo
Pasta de cópias de segurança
@@ -274,6 +277,7 @@
Reiniciar agora
Mais tarde
Tradução
+ Notificação no LED
Definições do widget
Definições de cabeçalho
Definições de linhas
@@ -366,6 +370,7 @@
Palavra-passe
Utilizador
Adicionar conta
+ É necessário que o dispositivo tenha esta funcionalidade
Ícone do lançador
Deve iniciar com http(s)://
É necessário o nome do host
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 6630833f5..9066100a7 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -147,6 +147,8 @@
Setări de rânduri
Setări de antet
Setări Widget
+ Suport hardware necesar
+ Notificare cu LED-uri
Localizare
Mai târziu
Repornește acum
@@ -236,6 +238,9 @@
Dosar de rezervă
Fișier atașat
Ore de liniște
+ Vibrații
+ Sunet
+ Tăcut
Notificări
Afișează separatoarele
Afișează meniul
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 29bda1bdc..8c28775fc 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -231,6 +231,9 @@
Показать заголовок
Показать настройки
Уведомления
+ Без звука
+ Звук
+ Вибрация
Тихие часы
Папка вложений
Папка резервных копий
@@ -306,6 +309,8 @@
Перезапустить сейчас
Позже
Локализация
+ LED уведомления
+ Необходима аппаратная поддержка
Настройки виджета
Настройки заголовка
Настройки строк
diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml
index 297933ad8..45410413f 100644
--- a/app/src/main/res/values-si/strings.xml
+++ b/app/src/main/res/values-si/strings.xml
@@ -172,6 +172,8 @@
ලැයිස්තුව විවෘත කරන්න
පේළි සැකසුම්
ශීර්ෂ සැකසුම්
+ දෘඩාංග සහාය අවශ්යයි
+ LED දැනුම්දීම
ප්රාදේශීයකරණය
පසුව
නැවත ආරම්භ කරන්න
@@ -592,6 +594,9 @@
උපස්ථ ෆෝල්ඩරය
ඇමුණුම් ෆෝල්ඩරය
නිහඬ පැය
+ කම්පන
+ ශබ්දය
+ නිහඬ
දැනුම්දීම්
බෙදුම්තීරු පෙන්වන්න
මෙනුව පෙන්වන්න
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 9e23ff6ab..dbf7bcffd 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -236,6 +236,9 @@
Zobrazovať záhlavia
Zobraziť nastavenia
Oznámenia
+ Tichý
+ Zvuk
+ Vibrácie
Čas ticha
Priečinok pre prílohy
Priečinok so zálohami
@@ -309,6 +312,8 @@
Reštartovať teraz
Neskôr
Preklad
+ LED oznámenia
+ Vyžaduje sa podpora zariadenia
Widget - nastavenia
Nastavenie záhlavia
Nastavenie riadka
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index a8c10d1ea..2e7ac2618 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -15,6 +15,7 @@
%s (završeno)
Nasumice posetnik
Obriši zadatak
+ Vibracije
Kontaktiraj razvojni tim
Oceni Task
Bez podsetnika u mirnim satima
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index a1eabf909..e11cbf363 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -145,6 +145,9 @@
Visa rubrik
Visa ikon för inställningar
Aviseringar
+ Tyst
+ Ljud
+ Vibrationer
Tyst period
Lagringsplats för bilagor
Säkerhetskopieringsmapp
@@ -206,6 +209,8 @@
Starta om nu
Senare
Språk
+ LED Notifiering
+ Hårdvarustöd krävs
Inställningar för widget
Rensa bort slutförda uppgifter?
Ring
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index dfcaccc28..d45496181 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -288,6 +288,8 @@
வரிசை அமைப்புகள்
தலைப்பு அமைப்புகள்
விட்ஜெட் அமைப்புகள்
+ வன்பொருள் ஆதரவு தேவை
+ LED அறிவிப்பு
உள்ளூர்மயமாக்கல்
பின்னர்
இப்போது மறுதொடக்கம் செய்யுங்கள்
@@ -370,6 +372,9 @@
காப்பு கோப்புறை
இணைப்பு கோப்புறை
அமைதியான நேரம்
+ அதிர்வுகள்
+ ஒலி
+ அமைதியாக
அறிவிப்புகள்
வகுப்புகளைக் காட்டு
மெனுவைக் காட்டு
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index f3fb740d0..a740f6cf8 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -266,6 +266,8 @@
การตั้งค่าแถว
การตั้งค่าส่วนหัว
การตั้งค่าวิดเจ็ต
+ ต้องการการสนับสนุนฮาร์ดแวร์
+ การแจ้งเตือน LED
แปล
หลัง
เริ่มการทํางานใหม่เดี๋ยวนี้
@@ -346,6 +348,9 @@
โฟลเดอร์สำรอง
โฟลเดอร์สิ่งที่แนบมา
ชั่วโมงเงียบ
+ การสั่นสะเทือน
+ เสียง
+ เงียบ
แจ้ง เตือน
แสดงวงเวียน
แสดงเมนู
diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml
index 45aecb009..9afa4cd96 100644
--- a/app/src/main/res/values-tl/strings.xml
+++ b/app/src/main/res/values-tl/strings.xml
@@ -40,6 +40,7 @@
- mga taon
Tanggalin gawain
+ Mga taginting
Pinagmulang code
Umambag ng pagsasalin
Kontakin ang developer
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 1fb44bedd..d7a4e66c7 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -216,6 +216,9 @@
Üstü göster
Ayarları göster
Bildirimler
+ Sessiz
+ Ses
+ Titreşimler
Sessiz saatler
Ek klasörü
Yedekleme klasörü
@@ -290,6 +293,8 @@
Şimdi yeniden başlat
Sonra
Yerelleştirme
+ LED bildirimi
+ Donanım desteği gerekiyor
Widget ayarları
Başlık ayarları
Satır ayarları
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index a7b8d0731..ea7f3e27f 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -231,6 +231,9 @@
Показати заголовок
Показати налаштування
Сповіщення
+ Безшумно
+ Звук
+ Вібрації
Тихі години
Тека з прикріпленими файлами
Тека з резервними копіями
@@ -306,6 +309,8 @@
Перезапустити зараз
Пізніше
Локалізація
+ LED-сповіщення
+ Потрібна підтримка апартних засобів
Налаштування віджету
Налаштування заголовку
Налаштування рядку
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
index de474c477..e3455c7c1 100644
--- a/app/src/main/res/values-ur/strings.xml
+++ b/app/src/main/res/values-ur/strings.xml
@@ -286,6 +286,9 @@
بیک اپ فولڈر
اٹیچ منٹ فولڈر
خاموش گھنٹے
+ تھرتھراہٹ
+ آواز
+ خاموش
نوٹیفیکیشنز
ڈیوائیڈر دکھائیں
مینیو دکھائیں
@@ -315,6 +318,8 @@
قطار کی سیٹنگ
ہیڈر کی سیٹنگ
ویجٹ سیٹنگ
+ ہارڈ وئیر سپورٹ درکار ہے
+ ایل ای ڈی نوٹیفیکیشن
لوکلائزیشن
بعد میں
ابھی ری سٹارٹ کریں
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 1af347a6c..67194a376 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -317,6 +317,8 @@
Cài đặt hàng
Cài đặt tiêu đề
Cài đặt tiện ích
+ Yêu cầu sự hỗ trợ của phần cứng
+ Thông báo LED
Ngôn ngữ
Để sau
Khởi động lại ngay
@@ -407,6 +409,9 @@
Thư mục sao lưu
Thư mục tệp đính kèm
Giờ im lặng
+ Rung
+ Âm thanh
+ Im lặng
Thông báo
Hiện đường chia tách
Hiện menu
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 1eada7492..2f4eb2ac9 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -205,6 +205,9 @@
显示标题
显示设置
通知
+ 静音
+ 铃声
+ 振动
静音时间
附件文件夹
备份文件夹
@@ -276,6 +279,8 @@
马上重启
稍后
本地化
+ LED 提醒
+ 需要硬件支持
插件设置
标题设置
行设置
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 324baa846..1bb99038a 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -123,6 +123,8 @@
顯示標頭
顯示設定
通知
+ 鈴聲
+ 震動
備份資料夾
雜項設定
啟用
@@ -232,6 +234,7 @@
Google 雲端硬碟備份
附件資料夾
靜音時間
+ 靜音
顯示分隔線
顯示清單
已新增的任務
@@ -422,6 +425,8 @@
行設定
標頭設定
小工具設定
+ 需要硬體支援
+ LED 通知
在地化
系統預設
日/夜
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index d890de343..7dd9c763c 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -85,7 +85,11 @@
- 1440
+
+ notif_vibrate
+
+ notification_ringtone
completion_ringtone
@@ -315,6 +319,7 @@
theme_color
theme_launcher
language
+ led_notificatiWCAon
widget-id-
widget-theme-v2-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index dd1b3fa9b..1f34a65b2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -297,6 +297,9 @@ File %1$s contained %2$s.\n\n
Show menu
Show dividers
Notifications
+ Silent
+ Sound
+ Vibrations
Quiet hours
Quiet hours are in effect
Attachment folder
@@ -396,6 +399,8 @@ File %1$s contained %2$s.\n\n
Restart now
Later
Localization
+ LED notification
+ Hardware support required
Widget settings
Header settings
Row settings
diff --git a/app/src/main/res/xml/preferences_notifications.xml b/app/src/main/res/xml/preferences_notifications.xml
index 57292585b..9c73c2824 100644
--- a/app/src/main/res/xml/preferences_notifications.xml
+++ b/app/src/main/res/xml/preferences_notifications.xml
@@ -43,6 +43,22 @@
android:summary="@string/bundle_notifications_summary"
android:title="@string/bundle_notifications" />
+
+
+
+
+
+
-
+
+ android:shortcutShortLabel="@string/action_new_task"
+ tools:targetApi="n_mr1">