mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-19 19:49:33 +01:00
Merge pull request #4504 from nextcloud/feature/4501/notificationWarningLessProminent
new notification warner
This commit is contained in:
commit
187f98ad6b
@ -275,7 +275,7 @@ class ConversationsListActivity :
|
|||||||
adapter!!.addListener(this)
|
adapter!!.addListener(this)
|
||||||
prepareViews()
|
prepareViews()
|
||||||
|
|
||||||
updateNotificationWarning()
|
showNotificationWarning()
|
||||||
|
|
||||||
showShareToScreen = hasActivityActionSendIntent()
|
showShareToScreen = hasActivityActionSendIntent()
|
||||||
|
|
||||||
@ -296,6 +296,13 @@ class ConversationsListActivity :
|
|||||||
loadUserAvatar(binding.switchAccountButton)
|
loadUserAvatar(binding.switchAccountButton)
|
||||||
viewThemeUtils.material.colorMaterialTextButton(binding.switchAccountButton)
|
viewThemeUtils.material.colorMaterialTextButton(binding.switchAccountButton)
|
||||||
viewThemeUtils.material.themeCardView(binding.conversationListHintInclude.hintLayoutCardview)
|
viewThemeUtils.material.themeCardView(binding.conversationListHintInclude.hintLayoutCardview)
|
||||||
|
viewThemeUtils.material.themeCardView(
|
||||||
|
binding.conversationListNotificationWarning.notificationWarningCardview
|
||||||
|
)
|
||||||
|
viewThemeUtils.material.colorMaterialButtonText(binding.conversationListNotificationWarning.notNowButton)
|
||||||
|
viewThemeUtils.material.colorMaterialButtonText(
|
||||||
|
binding.conversationListNotificationWarning.showSettingsButton
|
||||||
|
)
|
||||||
searchBehaviorSubject.onNext(false)
|
searchBehaviorSubject.onNext(false)
|
||||||
fetchRooms()
|
fetchRooms()
|
||||||
fetchPendingInvitations()
|
fetchPendingInvitations()
|
||||||
@ -307,14 +314,6 @@ class ConversationsListActivity :
|
|||||||
showSearchOrToolbar()
|
showSearchOrToolbar()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateNotificationWarning() {
|
|
||||||
if (shouldShowNotificationWarning()) {
|
|
||||||
showNotificationWarning()
|
|
||||||
} else {
|
|
||||||
binding.chatListNotificationWarning.visibility = View.GONE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initObservers() {
|
private fun initObservers() {
|
||||||
this.lifecycleScope.launch {
|
this.lifecycleScope.launch {
|
||||||
networkMonitor.isOnline.onEach { isOnline ->
|
networkMonitor.isOnline.onEach { isOnline ->
|
||||||
@ -326,14 +325,17 @@ class ConversationsListActivity :
|
|||||||
conversationsListViewModel.getFederationInvitationsViewState.observe(this) { state ->
|
conversationsListViewModel.getFederationInvitationsViewState.observe(this) { state ->
|
||||||
when (state) {
|
when (state) {
|
||||||
is ConversationsListViewModel.GetFederationInvitationsStartState -> {
|
is ConversationsListViewModel.GetFederationInvitationsStartState -> {
|
||||||
binding.conversationListHintInclude.conversationListHintLayout.visibility = View.GONE
|
binding.conversationListHintInclude.conversationListHintLayout.visibility =
|
||||||
|
View.GONE
|
||||||
}
|
}
|
||||||
|
|
||||||
is ConversationsListViewModel.GetFederationInvitationsSuccessState -> {
|
is ConversationsListViewModel.GetFederationInvitationsSuccessState -> {
|
||||||
if (state.showInvitationsHint) {
|
if (state.showInvitationsHint) {
|
||||||
binding.conversationListHintInclude.conversationListHintLayout.visibility = View.VISIBLE
|
binding.conversationListHintInclude.conversationListHintLayout.visibility =
|
||||||
|
View.VISIBLE
|
||||||
} else {
|
} else {
|
||||||
binding.conversationListHintInclude.conversationListHintLayout.visibility = View.GONE
|
binding.conversationListHintInclude.conversationListHintLayout.visibility =
|
||||||
|
View.GONE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1502,17 +1504,48 @@ class ConversationsListActivity :
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun showNotificationWarning() {
|
private fun showNotificationWarning() {
|
||||||
binding.chatListNotificationWarning.visibility = View.VISIBLE
|
if (shouldShowNotificationWarning()) {
|
||||||
binding.chatListNotificationWarning.setOnClickListener {
|
binding.conversationListNotificationWarning.conversationListNotificationWarningLayout.visibility =
|
||||||
|
View.VISIBLE
|
||||||
|
binding.conversationListNotificationWarning.notNowButton.setOnClickListener {
|
||||||
|
binding.conversationListNotificationWarning.conversationListNotificationWarningLayout.visibility =
|
||||||
|
View.GONE
|
||||||
|
val lastWarningDate = System.currentTimeMillis()
|
||||||
|
appPreferences.setNotificationWarningLastPostponedDate(lastWarningDate)
|
||||||
|
}
|
||||||
|
binding.conversationListNotificationWarning.showSettingsButton.setOnClickListener {
|
||||||
val bundle = Bundle()
|
val bundle = Bundle()
|
||||||
bundle.putBoolean(KEY_SCROLL_TO_NOTIFICATION_CATEGORY, true)
|
bundle.putBoolean(KEY_SCROLL_TO_NOTIFICATION_CATEGORY, true)
|
||||||
val settingsIntent = Intent(context, SettingsActivity::class.java)
|
val settingsIntent = Intent(context, SettingsActivity::class.java)
|
||||||
settingsIntent.putExtras(bundle)
|
settingsIntent.putExtras(bundle)
|
||||||
startActivity(settingsIntent)
|
startActivity(settingsIntent)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
binding.conversationListNotificationWarning.conversationListNotificationWarningLayout.visibility = View.GONE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun shouldShowNotificationWarning(): Boolean {
|
private fun shouldShowNotificationWarning(): Boolean {
|
||||||
|
fun shouldShowWarningIfDateTooOld(date1: Long): Boolean {
|
||||||
|
val currentTimeMillis = System.currentTimeMillis()
|
||||||
|
val differenceMillis = currentTimeMillis - date1
|
||||||
|
val daysForWarningInMillis = TimeUnit.DAYS.toMillis(DAYS_FOR_NOTIFICATION_WARNING)
|
||||||
|
return differenceMillis > daysForWarningInMillis
|
||||||
|
}
|
||||||
|
|
||||||
|
fun shouldShowNotificationWarningByUserChoice(): Boolean {
|
||||||
|
if (appPreferences.showRegularNotificationWarning) {
|
||||||
|
val lastWarningDate = appPreferences.getNotificationWarningLastPostponedDate()
|
||||||
|
return if (lastWarningDate == NOTIFICATION_WARNING_DATE_NOT_SET) {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
shouldShowWarningIfDateTooOld(lastWarningDate)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val notificationPermissionNotGranted = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
|
val notificationPermissionNotGranted = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
|
||||||
!platformPermissionUtil.isPostNotificationsPermissionGranted()
|
!platformPermissionUtil.isPostNotificationsPermissionGranted()
|
||||||
val batteryOptimizationNotIgnored = !PowerManagerUtils().isIgnoringBatteryOptimizations()
|
val batteryOptimizationNotIgnored = !PowerManagerUtils().isIgnoringBatteryOptimizations()
|
||||||
@ -1529,10 +1562,8 @@ class ConversationsListActivity :
|
|||||||
callsChannelNotEnabled ||
|
callsChannelNotEnabled ||
|
||||||
!serverNotificationAppInstalled
|
!serverNotificationAppInstalled
|
||||||
|
|
||||||
val userWantsToBeNotifiedAboutWrongSettings = appPreferences.getShowNotificationWarning()
|
|
||||||
|
|
||||||
return settingsOfUserAreWrong &&
|
return settingsOfUserAreWrong &&
|
||||||
userWantsToBeNotifiedAboutWrongSettings &&
|
shouldShowNotificationWarningByUserChoice() &&
|
||||||
ClosedInterfaceImpl().isGooglePlayServicesAvailable
|
ClosedInterfaceImpl().isGooglePlayServicesAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1927,5 +1958,7 @@ class ConversationsListActivity :
|
|||||||
const val MAINTENANCE_MODE_HEADER_KEY = "X-Nextcloud-Maintenance-Mode"
|
const val MAINTENANCE_MODE_HEADER_KEY = "X-Nextcloud-Maintenance-Mode"
|
||||||
const val REQUEST_POST_NOTIFICATIONS_PERMISSION = 111
|
const val REQUEST_POST_NOTIFICATIONS_PERMISSION = 111
|
||||||
const val BADGE_OFFSET = 35
|
const val BADGE_OFFSET = 35
|
||||||
|
const val DAYS_FOR_NOTIFICATION_WARNING = 5L
|
||||||
|
const val NOTIFICATION_WARNING_DATE_NOT_SET = 0L
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,7 @@ import com.nextcloud.talk.api.NcApiCoroutines
|
|||||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.setAppTheme
|
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.setAppTheme
|
||||||
import com.nextcloud.talk.conversationlist.ConversationsListActivity
|
import com.nextcloud.talk.conversationlist.ConversationsListActivity
|
||||||
|
import com.nextcloud.talk.conversationlist.ConversationsListActivity.Companion.NOTIFICATION_WARNING_DATE_NOT_SET
|
||||||
import com.nextcloud.talk.data.user.model.User
|
import com.nextcloud.talk.data.user.model.User
|
||||||
import com.nextcloud.talk.databinding.ActivitySettingsBinding
|
import com.nextcloud.talk.databinding.ActivitySettingsBinding
|
||||||
import com.nextcloud.talk.diagnose.DiagnoseActivity
|
import com.nextcloud.talk.diagnose.DiagnoseActivity
|
||||||
@ -927,13 +928,16 @@ class SettingsActivity :
|
|||||||
|
|
||||||
private fun setupCheckables() {
|
private fun setupCheckables() {
|
||||||
binding.settingsShowNotificationWarningSwitch.isChecked =
|
binding.settingsShowNotificationWarningSwitch.isChecked =
|
||||||
appPreferences.showNotificationWarning
|
appPreferences.showRegularNotificationWarning
|
||||||
|
|
||||||
if (ClosedInterfaceImpl().isGooglePlayServicesAvailable) {
|
if (ClosedInterfaceImpl().isGooglePlayServicesAvailable) {
|
||||||
binding.settingsShowNotificationWarning.setOnClickListener {
|
binding.settingsShowNotificationWarning.setOnClickListener {
|
||||||
val isChecked = binding.settingsShowNotificationWarningSwitch.isChecked
|
val isChecked = binding.settingsShowNotificationWarningSwitch.isChecked
|
||||||
binding.settingsShowNotificationWarningSwitch.isChecked = !isChecked
|
binding.settingsShowNotificationWarningSwitch.isChecked = !isChecked
|
||||||
appPreferences.setShowNotificationWarning(!isChecked)
|
appPreferences.setShowRegularNotificationWarning(!isChecked)
|
||||||
|
if (!isChecked) {
|
||||||
|
appPreferences.setNotificationWarningLastPostponedDate(NOTIFICATION_WARNING_DATE_NOT_SET)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
binding.settingsShowNotificationWarning.visibility = View.GONE
|
binding.settingsShowNotificationWarning.visibility = View.GONE
|
||||||
@ -1427,5 +1431,6 @@ class SettingsActivity :
|
|||||||
private const val LINEBREAK = "\n"
|
private const val LINEBREAK = "\n"
|
||||||
const val HTTP_CODE_OK: Int = 200
|
const val HTTP_CODE_OK: Int = 200
|
||||||
const val HTTP_ERROR_CODE_BAD_REQUEST: Int = 400
|
const val HTTP_ERROR_CODE_BAD_REQUEST: Int = 400
|
||||||
|
const val NO_NOTIFICATION_REMINDER_WANTED = 0L
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,9 +178,13 @@ public interface AppPreferences {
|
|||||||
|
|
||||||
void deleteAllMessageQueuesFor(String userId);
|
void deleteAllMessageQueuesFor(String userId);
|
||||||
|
|
||||||
boolean getShowNotificationWarning();
|
Long getNotificationWarningLastPostponedDate();
|
||||||
|
|
||||||
void setShowNotificationWarning(boolean showNotificationWarning);
|
void setNotificationWarningLastPostponedDate(Long showNotificationWarning);
|
||||||
|
|
||||||
|
Boolean getShowRegularNotificationWarning();
|
||||||
|
|
||||||
|
void setShowRegularNotificationWarning(boolean value);
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
}
|
}
|
||||||
|
@ -28,11 +28,10 @@ import kotlinx.coroutines.runBlocking
|
|||||||
@Suppress("TooManyFunctions", "DeferredResultUnused", "EmptyFunctionBlock")
|
@Suppress("TooManyFunctions", "DeferredResultUnused", "EmptyFunctionBlock")
|
||||||
class AppPreferencesImpl(val context: Context) : AppPreferences {
|
class AppPreferencesImpl(val context: Context) : AppPreferences {
|
||||||
|
|
||||||
override fun getProxyType(): String {
|
override fun getProxyType(): String =
|
||||||
return runBlocking {
|
runBlocking {
|
||||||
async { readString(PROXY_TYPE, context.resources.getString(R.string.nc_no_proxy)).first() }
|
async { readString(PROXY_TYPE, context.resources.getString(R.string.nc_no_proxy)).first() }
|
||||||
}.getCompleted()
|
}.getCompleted()
|
||||||
}
|
|
||||||
|
|
||||||
override fun setProxyType(proxyType: String?) =
|
override fun setProxyType(proxyType: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -47,9 +46,7 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
proxyType = ""
|
proxyType = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getProxyHost(): String {
|
override fun getProxyHost(): String = runBlocking { async { readString(PROXY_HOST).first() } }.getCompleted()
|
||||||
return runBlocking { async { readString(PROXY_HOST).first() } }.getCompleted()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setProxyHost(proxyHost: String?) =
|
override fun setProxyHost(proxyHost: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -64,9 +61,7 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
proxyHost = ""
|
proxyHost = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getProxyPort(): String {
|
override fun getProxyPort(): String = runBlocking { async { readString(PROXY_PORT).first() } }.getCompleted()
|
||||||
return runBlocking { async { readString(PROXY_PORT).first() } }.getCompleted()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setProxyPort(proxyPort: String?) =
|
override fun setProxyPort(proxyPort: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -81,9 +76,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
proxyPort = ""
|
proxyPort = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getProxyCredentials(): Boolean {
|
override fun getProxyCredentials(): Boolean =
|
||||||
return runBlocking { async { readBoolean(PROXY_CRED).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readBoolean(PROXY_CRED).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setProxyNeedsCredentials(proxyNeedsCredentials: Boolean) =
|
override fun setProxyNeedsCredentials(proxyNeedsCredentials: Boolean) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -96,9 +92,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
setProxyNeedsCredentials(false)
|
setProxyNeedsCredentials(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getProxyUsername(): String {
|
override fun getProxyUsername(): String =
|
||||||
return runBlocking { async { readString(PROXY_USERNAME).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readString(PROXY_USERNAME).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setProxyUsername(proxyUsername: String?) =
|
override fun setProxyUsername(proxyUsername: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -113,9 +110,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
proxyUsername = ""
|
proxyUsername = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getProxyPassword(): String {
|
override fun getProxyPassword(): String =
|
||||||
return runBlocking { async { readString(PROXY_PASSWORD).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readString(PROXY_PASSWORD).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setProxyPassword(proxyPassword: String?) =
|
override fun setProxyPassword(proxyPassword: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -130,9 +128,7 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
proxyPassword = ""
|
proxyPassword = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getPushToken(): String {
|
override fun getPushToken(): String = runBlocking { async { readString(PUSH_TOKEN).first() } }.getCompleted()
|
||||||
return runBlocking { async { readString(PUSH_TOKEN).first() } }.getCompleted()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setPushToken(pushToken: String?) =
|
override fun setPushToken(pushToken: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -147,9 +143,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
pushToken = ""
|
pushToken = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getPushTokenLatestGeneration(): Long {
|
override fun getPushTokenLatestGeneration(): Long =
|
||||||
return runBlocking { async { readLong(PUSH_TOKEN_LATEST_GENERATION).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readLong(PUSH_TOKEN_LATEST_GENERATION).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setPushTokenLatestGeneration(date: Long) =
|
override fun setPushTokenLatestGeneration(date: Long) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -158,9 +155,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getPushTokenLatestFetch(): Long {
|
override fun getPushTokenLatestFetch(): Long =
|
||||||
return runBlocking { async { readLong(PUSH_TOKEN_LATEST_FETCH).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readLong(PUSH_TOKEN_LATEST_FETCH).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setPushTokenLatestFetch(date: Long) =
|
override fun setPushTokenLatestFetch(date: Long) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -169,9 +167,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getTemporaryClientCertAlias(): String {
|
override fun getTemporaryClientCertAlias(): String =
|
||||||
return runBlocking { async { readString(TEMP_CLIENT_CERT_ALIAS).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readString(TEMP_CLIENT_CERT_ALIAS).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setTemporaryClientCertAlias(alias: String?) =
|
override fun setTemporaryClientCertAlias(alias: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -186,9 +185,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
temporaryClientCertAlias = ""
|
temporaryClientCertAlias = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getPushToTalkIntroShown(): Boolean {
|
override fun getPushToTalkIntroShown(): Boolean =
|
||||||
return runBlocking { async { readBoolean(PUSH_TO_TALK_INTRO_SHOWN).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readBoolean(PUSH_TO_TALK_INTRO_SHOWN).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setPushToTalkIntroShown(shown: Boolean) =
|
override fun setPushToTalkIntroShown(shown: Boolean) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -201,9 +201,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
pushToTalkIntroShown = false
|
pushToTalkIntroShown = false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getCallRingtoneUri(): String {
|
override fun getCallRingtoneUri(): String =
|
||||||
return runBlocking { async { readString(CALL_RINGTONE).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readString(CALL_RINGTONE).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setCallRingtoneUri(value: String?) =
|
override fun setCallRingtoneUri(value: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -218,9 +219,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
callRingtoneUri = ""
|
callRingtoneUri = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getMessageRingtoneUri(): String {
|
override fun getMessageRingtoneUri(): String =
|
||||||
return runBlocking { async { readString(MESSAGE_RINGTONE).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readString(MESSAGE_RINGTONE).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setMessageRingtoneUri(value: String?) =
|
override fun setMessageRingtoneUri(value: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -235,9 +237,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
messageRingtoneUri = ""
|
messageRingtoneUri = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getIsNotificationChannelUpgradedToV2(): Boolean {
|
override fun getIsNotificationChannelUpgradedToV2(): Boolean =
|
||||||
return runBlocking { async { readBoolean(NOTIFY_UPGRADE_V2).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readBoolean(NOTIFY_UPGRADE_V2).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setNotificationChannelIsUpgradedToV2(value: Boolean) =
|
override fun setNotificationChannelIsUpgradedToV2(value: Boolean) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -250,9 +253,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
setNotificationChannelIsUpgradedToV2(false)
|
setNotificationChannelIsUpgradedToV2(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getIsNotificationChannelUpgradedToV3(): Boolean {
|
override fun getIsNotificationChannelUpgradedToV3(): Boolean =
|
||||||
return runBlocking { async { readBoolean(NOTIFY_UPGRADE_V3).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readBoolean(NOTIFY_UPGRADE_V3).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setNotificationChannelIsUpgradedToV3(value: Boolean) =
|
override fun setNotificationChannelIsUpgradedToV3(value: Boolean) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -265,9 +269,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
setNotificationChannelIsUpgradedToV3(false)
|
setNotificationChannelIsUpgradedToV3(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getIsScreenSecured(): Boolean {
|
override fun getIsScreenSecured(): Boolean =
|
||||||
return runBlocking { async { readBoolean(SCREEN_SECURITY).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readBoolean(SCREEN_SECURITY).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setScreenSecurity(value: Boolean) =
|
override fun setScreenSecurity(value: Boolean) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -280,9 +285,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
setScreenSecurity(false)
|
setScreenSecurity(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getIsScreenLocked(): Boolean {
|
override fun getIsScreenLocked(): Boolean =
|
||||||
return runBlocking { async { readBoolean(SCREEN_LOCK).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readBoolean(SCREEN_LOCK).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setScreenLock(value: Boolean) =
|
override fun setScreenLock(value: Boolean) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -311,9 +317,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
setIncognitoKeyboard(false)
|
setIncognitoKeyboard(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun isPhoneBookIntegrationEnabled(): Boolean {
|
override fun isPhoneBookIntegrationEnabled(): Boolean =
|
||||||
return runBlocking { async { readBoolean(PHONE_BOOK_INTEGRATION).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readBoolean(PHONE_BOOK_INTEGRATION).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setPhoneBookIntegration(value: Boolean) =
|
override fun setPhoneBookIntegration(value: Boolean) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -381,9 +388,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getIsDbRoomMigrated(): Boolean {
|
override fun getIsDbRoomMigrated(): Boolean =
|
||||||
return runBlocking { async { readBoolean(DB_ROOM_MIGRATED).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readBoolean(DB_ROOM_MIGRATED).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setIsDbRoomMigrated(value: Boolean) =
|
override fun setIsDbRoomMigrated(value: Boolean) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -392,6 +400,18 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getShowRegularNotificationWarning(): Boolean =
|
||||||
|
runBlocking {
|
||||||
|
async { readBoolean(SHOW_REGULAR_NOTIFICATION_WARNING, true).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
|
override fun setShowRegularNotificationWarning(value: Boolean) =
|
||||||
|
runBlocking<Unit> {
|
||||||
|
async {
|
||||||
|
writeBoolean(SHOW_REGULAR_NOTIFICATION_WARNING, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun setPhoneBookIntegrationLastRun(currentTimeMillis: Long) =
|
override fun setPhoneBookIntegrationLastRun(currentTimeMillis: Long) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
async {
|
async {
|
||||||
@ -429,9 +449,10 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getTypingStatus(): Boolean {
|
override fun getTypingStatus(): Boolean =
|
||||||
return runBlocking { async { readBoolean(TYPING_STATUS).first() } }.getCompleted()
|
runBlocking {
|
||||||
}
|
async { readBoolean(TYPING_STATUS).first() }
|
||||||
|
}.getCompleted()
|
||||||
|
|
||||||
override fun setSorting(value: String?) =
|
override fun setSorting(value: String?) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
@ -544,18 +565,15 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getShowNotificationWarning(): Boolean {
|
override fun getNotificationWarningLastPostponedDate(): Long =
|
||||||
return runBlocking {
|
runBlocking {
|
||||||
async {
|
async { readLong(LAST_NOTIFICATION_WARNING).first() }
|
||||||
readBoolean(SHOW_NOTIFICATION_WARNING, true).first()
|
|
||||||
}
|
|
||||||
}.getCompleted()
|
}.getCompleted()
|
||||||
}
|
|
||||||
|
|
||||||
override fun setShowNotificationWarning(showNotificationWarning: Boolean) =
|
override fun setNotificationWarningLastPostponedDate(showNotificationWarning: Long) =
|
||||||
runBlocking<Unit> {
|
runBlocking<Unit> {
|
||||||
async {
|
async {
|
||||||
writeBoolean(SHOW_NOTIFICATION_WARNING, showNotificationWarning)
|
writeLong(LAST_NOTIFICATION_WARNING, showNotificationWarning)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -643,7 +661,8 @@ class AppPreferencesImpl(val context: Context) : AppPreferences {
|
|||||||
const val PHONE_BOOK_INTEGRATION_LAST_RUN = "phone_book_integration_last_run"
|
const val PHONE_BOOK_INTEGRATION_LAST_RUN = "phone_book_integration_last_run"
|
||||||
const val TYPING_STATUS = "typing_status"
|
const val TYPING_STATUS = "typing_status"
|
||||||
const val MESSAGE_QUEUE = "@message_queue"
|
const val MESSAGE_QUEUE = "@message_queue"
|
||||||
const val SHOW_NOTIFICATION_WARNING = "show_notification_warning"
|
const val SHOW_REGULAR_NOTIFICATION_WARNING = "show_regular_notification_warning"
|
||||||
|
const val LAST_NOTIFICATION_WARNING = "last_notification_warning"
|
||||||
private fun String.convertStringToArray(): Array<Float> {
|
private fun String.convertStringToArray(): Array<Float> {
|
||||||
var varString = this
|
var varString = this
|
||||||
val floatList = mutableListOf<Float>()
|
val floatList = mutableListOf<Float>()
|
||||||
|
@ -37,18 +37,6 @@
|
|||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
|
||||||
android:id="@+id/chat_list_notification_warning"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="@color/nc_warning"
|
|
||||||
android:gravity="center"
|
|
||||||
android:minHeight="40dp"
|
|
||||||
android:text="@string/nc_notification_warning"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:visibility="gone"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
<com.google.android.material.card.MaterialCardView
|
||||||
android:id="@+id/search_toolbar"
|
android:id="@+id/search_toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@ -238,6 +226,10 @@
|
|||||||
android:id="@+id/conversation_list_hint_include"
|
android:id="@+id/conversation_list_hint_include"
|
||||||
layout="@layout/federated_invitation_hint" />
|
layout="@layout/federated_invitation_hint" />
|
||||||
|
|
||||||
|
<include
|
||||||
|
android:id="@+id/conversation_list_notification_warning"
|
||||||
|
layout="@layout/notifications_warning" />
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/recycler_view"
|
android:id="@+id/recycler_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
66
app/src/main/res/layout/notifications_warning.xml
Normal file
66
app/src/main/res/layout/notifications_warning.xml
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Nextcloud Talk - Android Client
|
||||||
|
~
|
||||||
|
~ SPDX-FileCopyrightText: 2024 Marcel Hibbe <dev@mhibbe.de>
|
||||||
|
~ SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
-->
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/conversation_list_notification_warning_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:gravity="center_vertical|center_horizontal"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.google.android.material.card.MaterialCardView
|
||||||
|
android:id="@+id/notification_warning_cardview"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/standard_margin"
|
||||||
|
android:layout_marginTop="@dimen/standard_half_margin"
|
||||||
|
android:layout_marginEnd="@dimen/standard_margin"
|
||||||
|
app:cardCornerRadius="8dp"
|
||||||
|
app:cardElevation="2dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="@dimen/margin_between_elements">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/nc_notification_warning"
|
||||||
|
android:textAlignment="center" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="end"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/not_now_button"
|
||||||
|
style="@style/Button.Borderless"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/nc_not_now"/>
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/show_settings_button"
|
||||||
|
style="@style/Button.Borderless"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/nc_settings"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -92,6 +92,5 @@
|
|||||||
<color name="icon_on_bg_default">#99000000</color>
|
<color name="icon_on_bg_default">#99000000</color>
|
||||||
<color name="badge_color">#EF3B02</color>
|
<color name="badge_color">#EF3B02</color>
|
||||||
<color name="secondary_button_background">#DBE2E9</color>
|
<color name="secondary_button_background">#DBE2E9</color>
|
||||||
<color name="nc_warning">#FF9800</color>
|
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -182,9 +182,10 @@ How to translate with transifex:
|
|||||||
|
|
||||||
<string name="nc_ignore_battery_optimization_dialog_title">Ignore battery optimization</string>
|
<string name="nc_ignore_battery_optimization_dialog_title">Ignore battery optimization</string>
|
||||||
<string name="nc_ignore_battery_optimization_dialog_text">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</string>
|
<string name="nc_ignore_battery_optimization_dialog_text">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</string>
|
||||||
<string name="nc_show_notification_warning_title">Show notification warning</string>
|
<string name="nc_show_notification_warning_title">Show regular notification warning</string>
|
||||||
<string name="nc_show_notification_warning_description">When notifications are not set up correctly, show a warning</string>
|
<string name="nc_show_notification_warning_description">When notifications are not set up correctly, show a regular warning</string>
|
||||||
<string name="nc_notification_warning">Notifications are not set up correctly</string>
|
<string name="nc_notification_warning">Notifications are not set up correctly</string>
|
||||||
|
<string name="nc_not_now">Not now</string>
|
||||||
|
|
||||||
<string name="nc_diagnose_meta_category_title">Meta information</string>
|
<string name="nc_diagnose_meta_category_title">Meta information</string>
|
||||||
<string name="nc_diagnose_meta_system_report_date">Generation of system report</string>
|
<string name="nc_diagnose_meta_system_report_date">Generation of system report</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user