diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 68b0e14e1..79c2185d0 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -110,6 +110,7 @@ import com.nextcloud.talk.utils.ClosedInterfaceImpl import com.nextcloud.talk.utils.ConversationUtils import com.nextcloud.talk.utils.FileUtils import com.nextcloud.talk.utils.Mimetype +import com.nextcloud.talk.utils.NotificationUtils import com.nextcloud.talk.utils.ParticipantPermissions import com.nextcloud.talk.utils.SpreedFeatures import com.nextcloud.talk.utils.UserIdUtils @@ -121,6 +122,7 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_MSG_TEXT import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_NEW_CONVERSATION import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SCROLL_TO_NOTIFICATION_CATEGORY import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SHARED_TEXT import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import com.nextcloud.talk.utils.power.PowerManagerUtils @@ -273,6 +275,8 @@ class ConversationsListActivity : adapter!!.addListener(this) prepareViews() + updateNotificationWarning() + showShareToScreen = hasActivityActionSendIntent() if (!eventBus.isRegistered(this)) { @@ -303,6 +307,14 @@ class ConversationsListActivity : showSearchOrToolbar() } + private fun updateNotificationWarning() { + if (shouldShowNotificationWarning()) { + showNotificationWarning() + } else { + binding.chatListNotificationWarning.visibility = View.GONE + } + } + private fun initObservers() { this.lifecycleScope.launch { networkMonitor.isOnline.onEach { isOnline -> @@ -763,9 +775,8 @@ class ConversationsListActivity : ) } - private fun hasActivityActionSendIntent(): Boolean { - return Intent.ACTION_SEND == intent.action || Intent.ACTION_SEND_MULTIPLE == intent.action - } + private fun hasActivityActionSendIntent(): Boolean = + Intent.ACTION_SEND == intent.action || Intent.ACTION_SEND_MULTIPLE == intent.action private fun showSearchView(searchView: SearchView?, searchItem: MenuItem?) { binding.conversationListAppbar.stateListAnimator = AnimatorInflater.loadStateListAnimator( @@ -1274,10 +1285,9 @@ class ConversationsListActivity : !participantPermissions.canIgnoreLobby() } - private fun isReadOnlyConversation(conversation: ConversationModel): Boolean { - return conversation.conversationReadOnlyState === + private fun isReadOnlyConversation(conversation: ConversationModel): Boolean = + conversation.conversationReadOnlyState === ConversationEnums.ConversationReadOnlyState.CONVERSATION_READ_ONLY - } private fun handleSharedData() { collectDataFromIntent() @@ -1453,8 +1463,9 @@ class ConversationsListActivity : } REQUEST_POST_NOTIFICATIONS_PERMISSION -> { - // whenever user allowed notifications, also check to ignore battery optimization if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Log.d(TAG, "Notification permission was granted") + if (!PowerManagerUtils().isIgnoringBatteryOptimizations() && ClosedInterfaceImpl().isGooglePlayServicesAvailable ) { @@ -1490,6 +1501,41 @@ class ConversationsListActivity : } } + private fun showNotificationWarning() { + binding.chatListNotificationWarning.visibility = View.VISIBLE + binding.chatListNotificationWarning.setOnClickListener { + val bundle = Bundle() + bundle.putBoolean(KEY_SCROLL_TO_NOTIFICATION_CATEGORY, true) + val settingsIntent = Intent(context, SettingsActivity::class.java) + settingsIntent.putExtras(bundle) + startActivity(settingsIntent) + } + } + + private fun shouldShowNotificationWarning(): Boolean { + val notificationPermissionNotGranted = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + !platformPermissionUtil.isPostNotificationsPermissionGranted() + val batteryOptimizationNotIgnored = !PowerManagerUtils().isIgnoringBatteryOptimizations() + + val messagesChannelNotEnabled = !NotificationUtils.isMessagesNotificationChannelEnabled(this) + val callsChannelNotEnabled = !NotificationUtils.isCallsNotificationChannelEnabled(this) + + val serverNotificationAppInstalled = + userManager.currentUser.blockingGet().capabilities?.notificationsCapability?.features?.isNotEmpty() ?: false + + val settingsOfUserAreWrong = notificationPermissionNotGranted || + batteryOptimizationNotIgnored || + messagesChannelNotEnabled || + callsChannelNotEnabled || + !serverNotificationAppInstalled + + val userWantsToBeNotifiedAboutWrongSettings = appPreferences.getShowNotificationWarning() + + return settingsOfUserAreWrong && + userWantsToBeNotifiedAboutWrongSettings && + ClosedInterfaceImpl().isGooglePlayServicesAvailable + } + private fun openConversation(textToPaste: String? = "") { if (CallActivity.active && selectedConversation!!.token != ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken diff --git a/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt b/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt index 72a7e9795..06dd2e80f 100644 --- a/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt @@ -71,12 +71,14 @@ import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.CapabilitiesUtil import com.nextcloud.talk.utils.ClosedInterfaceImpl import com.nextcloud.talk.utils.DisplayUtils +import com.nextcloud.talk.utils.DrawableUtils import com.nextcloud.talk.utils.LoggingUtils.sendMailWithAttachment import com.nextcloud.talk.utils.NotificationUtils import com.nextcloud.talk.utils.NotificationUtils.getCallRingtoneUri import com.nextcloud.talk.utils.NotificationUtils.getMessageRingtoneUri import com.nextcloud.talk.utils.SecurityUtils import com.nextcloud.talk.utils.SpreedFeatures +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SCROLL_TO_NOTIFICATION_CATEGORY import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import com.nextcloud.talk.utils.power.PowerManagerUtils import com.nextcloud.talk.utils.preferences.AppPreferencesImpl @@ -101,7 +103,9 @@ import javax.inject.Inject @Suppress("LargeClass", "TooManyFunctions") @AutoInjector(NextcloudTalkApplication::class) -class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNumberDialogClickListener { +class SettingsActivity : + BaseActivity(), + SetPhoneNumberDialogFragment.SetPhoneNumberDialogClickListener { private lateinit var binding: ActivitySettingsBinding @Inject @@ -129,6 +133,7 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu private lateinit var phoneBookIntegrationFlow: Flow private var profileQueryDisposable: Disposable? = null private var dbQueryDisposable: Disposable? = null + private var openedByNotificationWarning: Boolean = false @SuppressLint("StringFormatInvalid") override fun onCreate(savedInstanceState: Bundle?) { @@ -143,6 +148,7 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu binding.avatarImage.let { ViewCompat.setTransitionName(it, "userAvatar.transitionTag") } getCurrentUser() + handleIntent(intent) setupLicenceSetting() @@ -162,6 +168,11 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu setupClientCertView() } + private fun handleIntent(intent: Intent) { + val extras: Bundle? = intent.extras + openedByNotificationWarning = extras?.getBoolean(KEY_SCROLL_TO_NOTIFICATION_CATEGORY) ?: false + } + override fun onResume() { super.onResume() supportActionBar?.show() @@ -210,6 +221,22 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu themeTitles() themeSwitchPreferences() + + if (openedByNotificationWarning) { + scrollToNotificationCategory() + } + } + + @Suppress("MagicNumber") + private fun scrollToNotificationCategory() { + binding.scrollView.post { + val scrollViewLocation = IntArray(2) + val targetLocation = IntArray(2) + binding.scrollView.getLocationOnScreen(scrollViewLocation) + binding.settingsNotificationsCategory.getLocationOnScreen(targetLocation) + val offset = targetLocation[1] - scrollViewLocation[1] + binding.scrollView.scrollBy(0, offset) + } } private fun loadCapabilitiesAndUpdateSettings() { @@ -255,11 +282,9 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu } private fun setupNotificationSettings() { - binding.settingsNotificationsTitle.text = resources!!.getString( - R.string.nc_settings_notification_sounds_post_oreo - ) setupNotificationSoundsSettings() setupNotificationPermissionSettings() + setupServerNotificationAppCheck() } @SuppressLint("StringFormatInvalid") @@ -281,6 +306,10 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu resources!!.getString(R.string.nc_diagnose_battery_optimization_not_ignored) binding.batteryOptimizationIgnored.setTextColor(resources.getColor(R.color.nc_darkRed, null)) + if (openedByNotificationWarning) { + DrawableUtils.blinkDrawable(binding.settingsBatteryOptimizationWrapper.background) + } + binding.settingsBatteryOptimizationWrapper.setOnClickListener { val dialogText = String.format( context.resources.getString(R.string.nc_ignore_battery_optimization_dialog_text), @@ -313,12 +342,26 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu binding.ncDiagnoseNotificationPermissionSubtitle.setTextColor( resources.getColor(R.color.high_emphasis_text, null) ) + binding.settingsCallSound.isEnabled = true + binding.settingsCallSound.alpha = ENABLED_ALPHA + binding.settingsMessageSound.isEnabled = true + binding.settingsMessageSound.alpha = ENABLED_ALPHA } else { binding.ncDiagnoseNotificationPermissionSubtitle.text = resources.getString(R.string.nc_settings_notifications_declined) binding.ncDiagnoseNotificationPermissionSubtitle.setTextColor( resources.getColor(R.color.nc_darkRed, null) ) + + if (openedByNotificationWarning) { + DrawableUtils.blinkDrawable(binding.settingsNotificationsPermissionWrapper.background) + } + + binding.settingsCallSound.isEnabled = false + binding.settingsCallSound.alpha = DISABLED_ALPHA + binding.settingsMessageSound.isEnabled = false + binding.settingsMessageSound.alpha = DISABLED_ALPHA + binding.settingsNotificationsPermissionWrapper.setOnClickListener { requestPermissions( arrayOf(Manifest.permission.POST_NOTIFICATIONS), @@ -346,6 +389,10 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu ResourcesCompat.getColor(context.resources, R.color.nc_darkRed, null) ) binding.callsRingtone.text = resources!!.getString(R.string.nc_common_disabled) + + if (openedByNotificationWarning) { + DrawableUtils.blinkDrawable(binding.settingsCallSound.background) + } } if (NotificationUtils.isMessagesNotificationChannelEnabled(this)) { @@ -357,6 +404,10 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu ResourcesCompat.getColor(context.resources, R.color.nc_darkRed, null) ) binding.messagesRingtone.text = resources!!.getString(R.string.nc_common_disabled) + + if (openedByNotificationWarning) { + DrawableUtils.blinkDrawable(binding.settingsMessageSound.background) + } } binding.settingsCallSound.setOnClickListener { @@ -426,6 +477,24 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu } } + private fun setupServerNotificationAppCheck() { + val serverNotificationAppInstalled = + userManager.currentUser.blockingGet().capabilities?.notificationsCapability?.features?.isNotEmpty() ?: false + if (!serverNotificationAppInstalled) { + binding.settingsServerNotificationAppWrapper.visibility = View.VISIBLE + + val description = context.getString(R.string.nc_settings_contact_admin_of) + LINEBREAK + + userManager.currentUser.blockingGet().baseUrl!! + + binding.settingsServerNotificationAppDescription.text = description + if (openedByNotificationWarning) { + DrawableUtils.blinkDrawable(binding.settingsServerNotificationAppWrapper.background) + } + } else { + binding.settingsServerNotificationAppWrapper.visibility = View.GONE + } + } + private fun setupSourceCodeUrl() { if (!TextUtils.isEmpty(resources!!.getString(R.string.nc_source_code_url))) { binding.settingsSourceCode.setOnClickListener { @@ -646,8 +715,8 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu startActivity(intent) } - private fun getRingtoneName(context: Context, ringtoneUri: Uri?): String { - return if (ringtoneUri == null) { + private fun getRingtoneName(context: Context, ringtoneUri: Uri?): String = + if (ringtoneUri == null) { resources!!.getString(R.string.nc_settings_no_ringtone) } else if ((NotificationUtils.DEFAULT_CALL_RINGTONE_URI == ringtoneUri.toString()) || (NotificationUtils.DEFAULT_MESSAGE_RINGTONE_URI == ringtoneUri.toString()) @@ -657,11 +726,11 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu val r = RingtoneManager.getRingtone(context, ringtoneUri) r.getTitle(context) } - } private fun themeSwitchPreferences() { binding.run { listOf( + settingsShowNotificationWarningSwitch, settingsScreenLockSwitch, settingsScreenSecuritySwitch, settingsIncognitoKeyboardSwitch, @@ -857,6 +926,19 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu } private fun setupCheckables() { + binding.settingsShowNotificationWarningSwitch.isChecked = + appPreferences.showNotificationWarning + + if (ClosedInterfaceImpl().isGooglePlayServicesAvailable) { + binding.settingsShowNotificationWarning.setOnClickListener { + val isChecked = binding.settingsShowNotificationWarningSwitch.isChecked + binding.settingsShowNotificationWarningSwitch.isChecked = !isChecked + appPreferences.setShowNotificationWarning(!isChecked) + } + } else { + binding.settingsShowNotificationWarning.visibility = View.GONE + } + binding.settingsScreenSecuritySwitch.isChecked = appPreferences.isScreenSecured binding.settingsIncognitoKeyboardSwitch.isChecked = appPreferences.isKeyboardIncognito @@ -1067,16 +1149,14 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu ConversationsListActivity.REQUEST_POST_NOTIFICATIONS_PERMISSION -> { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_DENIED) { - Snackbar.make( - binding.root, - context.resources.getString(R.string.nc_settings_notifications_declined_hint), - Snackbar.LENGTH_LONG - ).show() - Log.d( - TAG, - "Notification permission is denied. Either because user denied it when being asked. " + - "Or permission is already denied and android decided to not offer the dialog." - ) + try { + val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + intent.putExtra(Settings.EXTRA_APP_PACKAGE, BuildConfig.APPLICATION_ID) + startActivity(intent) + } catch (e: Exception) { + Log.e(TAG, "Failed to open notification settings as fallback", e) + } } } } @@ -1344,6 +1424,7 @@ class SettingsActivity : BaseActivity(), SetPhoneNumberDialogFragment.SetPhoneNu private const val START_DELAY: Long = 5000 private const val DISABLED_ALPHA: Float = 0.38f private const val ENABLED_ALPHA: Float = 1.0f + private const val LINEBREAK = "\n" const val HTTP_CODE_OK: Int = 200 const val HTTP_ERROR_CODE_BAD_REQUEST: Int = 400 } diff --git a/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt index 13303dfda..827cb55b3 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/DrawableUtils.kt @@ -6,14 +6,22 @@ */ package com.nextcloud.talk.utils +import android.graphics.drawable.Drawable +import android.graphics.drawable.RippleDrawable +import android.util.Log import com.nextcloud.talk.R import com.nextcloud.talk.utils.Mimetype.AUDIO_PREFIX import com.nextcloud.talk.utils.Mimetype.FOLDER import com.nextcloud.talk.utils.Mimetype.IMAGE_PREFIX import com.nextcloud.talk.utils.Mimetype.TEXT_PREFIX import com.nextcloud.talk.utils.Mimetype.VIDEO_PREFIX +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch object DrawableUtils { + private val TAG = DrawableUtils::class.java.simpleName @Suppress("Detekt.LongMethod") fun getDrawableResourceIdForMimeType(mimetype: String?): Int { @@ -153,4 +161,23 @@ object DrawableUtils { drawableMap["unknown"]!! } } + + @Suppress("MagicNumber", "TooGenericExceptionCaught") + fun blinkDrawable(rippleView: Drawable) { + try { + (rippleView as RippleDrawable).let { rippleDrawable -> + CoroutineScope(Dispatchers.Main).launch { + delay(1000L) // Wait 2 seconds before starting + repeat(3) { + rippleDrawable.state = intArrayOf(android.R.attr.state_pressed, android.R.attr.state_enabled) + delay(250L) // Ripple active duration + rippleDrawable.state = intArrayOf() // Reset state + delay(250L) // Time between blinks + } + } + } + } catch (e: Exception) { + Log.e(TAG, "Failed to blink Drawable", e) + } + } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt index 53de01b27..4080f315a 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt @@ -80,4 +80,5 @@ object BundleKeys { const val KEY_CREDENTIALS: String = "KEY_CREDENTIALS" const val KEY_FIELD_MAP: String = "KEY_FIELD_MAP" const val KEY_CHAT_URL: String = "KEY_CHAT_URL" + const val KEY_SCROLL_TO_NOTIFICATION_CATEGORY: String = "KEY_SCROLL_TO_NOTIFICATION_CATEGORY" } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java index 606614a72..ffe3e063b 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java @@ -178,6 +178,9 @@ public interface AppPreferences { void deleteAllMessageQueuesFor(String userId); + boolean getShowNotificationWarning(); + + void setShowNotificationWarning(boolean showNotificationWarning); void clear(); } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt index c3e2fcc48..a576fe9a0 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt @@ -544,6 +544,19 @@ class AppPreferencesImpl(val context: Context) : AppPreferences { } } + override fun getShowNotificationWarning(): Boolean { + return runBlocking { async { + readBoolean(SHOW_NOTIFICATION_WARNING, true).first() + } }.getCompleted() + } + + override fun setShowNotificationWarning(showNotificationWarning: Boolean) = + runBlocking { + async { + writeBoolean(SHOW_NOTIFICATION_WARNING, showNotificationWarning) + } + } + override fun clear() {} private suspend fun writeString(key: String, value: String) = @@ -628,6 +641,7 @@ class AppPreferencesImpl(val context: Context) : AppPreferences { const val PHONE_BOOK_INTEGRATION_LAST_RUN = "phone_book_integration_last_run" const val TYPING_STATUS = "typing_status" const val MESSAGE_QUEUE = "@message_queue" + const val SHOW_NOTIFICATION_WARNING = "show_notification_warning" private fun String.convertStringToArray(): Array { var varString = this val floatList = mutableListOf() diff --git a/app/src/main/res/layout/activity_conversations.xml b/app/src/main/res/layout/activity_conversations.xml index bdf5880e1..7518b482d 100644 --- a/app/src/main/res/layout/activity_conversations.xml +++ b/app/src/main/res/layout/activity_conversations.xml @@ -37,6 +37,18 @@ android:visibility="gone" tools:visibility="visible" /> + + - @@ -201,7 +200,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/standard_margin" - android:text="@string/nc_settings_notification_sounds" + android:text="@string/nc_settings_notification_sounds_post_oreo" android:textSize="@dimen/headline_text_size" android:textStyle="bold"/> @@ -212,18 +211,76 @@ android:orientation="vertical"> + + + + + + + + + + + + + android:padding="@dimen/standard_padding"> + android:text="@string/nc_settings_server_notification_app_not_installed_title" + android:textSize="@dimen/headline_text_size"/> + + + + + + + + android:padding="@dimen/standard_padding"> + android:text="@string/nc_diagnose_battery_optimization_title" + android:textSize="@dimen/headline_text_size" /> + + android:background="?android:attr/selectableItemBackground" + android:orientation="vertical" + android:padding="@dimen/standard_padding"> @@ -286,8 +345,6 @@ android:id="@+id/calls_ringtone" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/standard_margin" - android:layout_marginBottom="@dimen/standard_margin" android:text="@string/nc_settings_default_ringtone" android:textSize="@dimen/supporting_text_text_size"/> @@ -296,13 +353,13 @@ android:id="@+id/settings_message_sound" android:layout_width="match_parent" android:layout_height="wrap_content" + android:background="?android:attr/selectableItemBackground" android:orientation="vertical" - android:background="?android:attr/selectableItemBackground"> + android:padding="@dimen/standard_padding"> @@ -310,13 +367,9 @@ android:id="@+id/messages_ringtone" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/standard_margin" - android:layout_marginBottom="@dimen/standard_margin" android:text="@string/nc_settings_default_ringtone" android:textSize="@dimen/supporting_text_text_size"/> - - #99000000 #EF3B02 #DBE2E9 + #FF9800 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ca4c364cf..a4c02a73f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,7 +101,6 @@ How to translate with transifex: Talk app is not installed on the server you tried to authenticate against Your already existing account was updated, instead of adding a new one The account is scheduled for deletion, and cannot be changed - Notification sounds Notifications Calls call_ringtone @@ -109,6 +108,8 @@ How to translate with transifex: message_ringtone Librem by feandesign No sound + Server notifications app not installed + Please contact the administrator of Appearance Theme @@ -181,6 +182,9 @@ How to translate with transifex: Ignore battery optimization Battery optimization is not ignored. This should be changed to make sure that notifications work in the background! Please click OK and select \"All apps\" -> %1$s -> Do not optimize + Show notification warning + When notifications are not set up correctly, show a warning + Notifications are not set up correctly Meta information Generation of system report @@ -195,7 +199,7 @@ How to translate with transifex: Google Play services are available Google Play services are not available. Notifications are not supported Battery settings - Battery optimization is not ignored. This should be changed! + Battery optimization is enabled which might cause issues. You should disable battery optimization! Battery optimization is ignored, all fine Notification permissions Calls notification channel enabled?