Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bitfireAT/davx5-ose.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunik Kupfer <kupfer@bitfire.at>2022-11-01 14:49:06 +0300
committerRicki Hirner <hirner@bitfire.at>2022-11-01 14:51:20 +0300
commit8915a3c10381aa130e529b9cc0b733977037c3f2 (patch)
treec6924078cdcc4f1d1279f55443663f57b0d35319
parent43ae3fcd1f48e5b2087e8c7210b1f4b4c0926460 (diff)
android 13 compatibility (bitfireAT/davx5#155)
* check for notify permission before notifying * [WIP] add notification permission request * Revert "check for notify permission before notifying" This reverts commit ed8e046d73163bef5684622bd877f08b9ee781c6. * add notification permission request * [WIP] add notifications disabled card in accounts view * add notifications disabled card in accounts view * reorder permissions * use dp instead of mm for image max height in permissions view * stop using array to bundle notification permissions * Use new permissions contract for PermissionsFragment Co-authored-by: Ricki Hirner <hirner@bitfire.at>
-rw-r--r--app/build.gradle2
-rw-r--r--app/src/main/java/at/bitfire/davdroid/PermissionUtils.kt8
-rw-r--r--app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.kt20
-rw-r--r--app/src/main/java/at/bitfire/davdroid/ui/PermissionsFragment.kt38
-rw-r--r--app/src/main/res/drawable/ic_notifications_off.xml5
-rw-r--r--app/src/main/res/layout/account_list.xml35
-rw-r--r--app/src/main/res/layout/activity_permissions.xml149
-rw-r--r--app/src/main/res/values-h480dp/dimen.xml2
-rw-r--r--app/src/main/res/values/dimen.xml2
-rw-r--r--app/src/main/res/values/strings.xml6
10 files changed, 188 insertions, 79 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 887b45be..0a015992 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -22,7 +22,7 @@ android {
setProperty "archivesBaseName", "davx5-ose-" + getVersionName()
minSdkVersion 21 // Android 5
- targetSdkVersion 32 // Android 12v2
+ targetSdkVersion 33 // Android 13
buildConfigField "String", "userAgent", "\"DAVx5\""
diff --git a/app/src/main/java/at/bitfire/davdroid/PermissionUtils.kt b/app/src/main/java/at/bitfire/davdroid/PermissionUtils.kt
index 44529956..cc1df668 100644
--- a/app/src/main/java/at/bitfire/davdroid/PermissionUtils.kt
+++ b/app/src/main/java/at/bitfire/davdroid/PermissionUtils.kt
@@ -23,12 +23,12 @@ import at.bitfire.davdroid.ui.PermissionsActivity
object PermissionUtils {
val CONTACT_PERMISSIONS = arrayOf(
- Manifest.permission.READ_CONTACTS,
- Manifest.permission.WRITE_CONTACTS
+ Manifest.permission.READ_CONTACTS,
+ Manifest.permission.WRITE_CONTACTS
)
val CALENDAR_PERMISSIONS = arrayOf(
- Manifest.permission.READ_CALENDAR,
- Manifest.permission.WRITE_CALENDAR
+ Manifest.permission.READ_CALENDAR,
+ Manifest.permission.WRITE_CALENDAR
)
val WIFI_SSID_PERMISSIONS =
diff --git a/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.kt b/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.kt
index a1fe1f1a..c7e10564 100644
--- a/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.kt
+++ b/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.kt
@@ -4,12 +4,14 @@
package at.bitfire.davdroid.ui
+import android.Manifest
import android.accounts.Account
import android.accounts.AccountManager
import android.accounts.OnAccountsUpdateListener
import android.app.Activity
import android.app.Application
import android.content.*
+import android.content.pm.PackageManager
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
@@ -18,6 +20,8 @@ import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.view.*
+import androidx.core.content.ContextCompat
+import androidx.core.content.PackageManagerCompat
import androidx.core.content.getSystemService
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
@@ -29,6 +33,7 @@ import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import at.bitfire.davdroid.DavUtils
import at.bitfire.davdroid.DavUtils.SyncStatus
+import at.bitfire.davdroid.PermissionUtils
import at.bitfire.davdroid.R
import at.bitfire.davdroid.StorageLowReceiver
import at.bitfire.davdroid.databinding.AccountListBinding
@@ -57,6 +62,10 @@ class AccountListFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
+ binding.allowNotifications.setOnClickListener {
+ startActivity(Intent(requireActivity(), PermissionsActivity::class.java))
+ }
+
model.networkAvailable.observe(viewLifecycleOwner) { networkAvailable ->
binding.noNetworkInfo.visibility = if (networkAvailable) View.GONE else View.VISIBLE
}
@@ -103,11 +112,22 @@ class AccountListFragment: Fragment() {
}
}
+ override fun onResume() {
+ super.onResume()
+ checkPermissions()
+ }
+
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
+ fun checkPermissions() {
+ if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED)
+ binding.noNotificationsInfo.visibility = View.GONE
+ else
+ binding.noNotificationsInfo.visibility = View.VISIBLE
+ }
class AccountAdapter(
val activity: Activity
diff --git a/app/src/main/java/at/bitfire/davdroid/ui/PermissionsFragment.kt b/app/src/main/java/at/bitfire/davdroid/ui/PermissionsFragment.kt
index 9a914b7e..77de939f 100644
--- a/app/src/main/java/at/bitfire/davdroid/ui/PermissionsFragment.kt
+++ b/app/src/main/java/at/bitfire/davdroid/ui/PermissionsFragment.kt
@@ -4,9 +4,11 @@
package at.bitfire.davdroid.ui
+import android.Manifest
import android.app.Application
import android.content.Context
import android.content.Intent
+import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
@@ -14,7 +16,9 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
+import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.MainThread
+import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.AndroidViewModel
@@ -42,6 +46,10 @@ class PermissionsFragment: Fragment() {
binding.text.text = getString(R.string.permissions_text, getString(R.string.app_name))
+ val requestPermission = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
+ model.checkPermissions()
+ }
+
model.needAutoResetPermission.observe(viewLifecycleOwner, { keepPermissions ->
if (keepPermissions == true && model.haveAutoResetPermission.value == false) {
Toast.makeText(requireActivity(), R.string.permissions_autoreset_instruction, Toast.LENGTH_LONG).show()
@@ -50,34 +58,38 @@ class PermissionsFragment: Fragment() {
})
model.needContactsPermissions.observe(viewLifecycleOwner, { needContacts ->
if (needContacts && model.haveContactsPermissions.value == false)
- requestPermissions(CONTACT_PERMISSIONS, 0)
+ requestPermission.launch(CONTACT_PERMISSIONS)
})
model.needCalendarPermissions.observe(viewLifecycleOwner, { needCalendars ->
if (needCalendars && model.haveCalendarPermissions.value == false)
- requestPermissions(CALENDAR_PERMISSIONS, 0)
+ requestPermission.launch(CALENDAR_PERMISSIONS)
+ })
+ model.needNotificationPermissions.observe(viewLifecycleOwner, { needNotifications ->
+ if (needNotifications && model.haveNotificationPermissions.value == false)
+ requestPermission.launch(arrayOf(Manifest.permission.POST_NOTIFICATIONS))
})
model.needOpenTasksPermissions.observe(viewLifecycleOwner, { needOpenTasks ->
if (needOpenTasks == true && model.haveOpenTasksPermissions.value == false)
- requestPermissions(TaskProvider.PERMISSIONS_OPENTASKS, 0)
+ requestPermission.launch(TaskProvider.PERMISSIONS_OPENTASKS)
})
model.needTasksOrgPermissions.observe(viewLifecycleOwner, { needTasksOrg ->
if (needTasksOrg == true && model.haveTasksOrgPermissions.value == false)
- requestPermissions(TaskProvider.PERMISSIONS_TASKS_ORG, 0)
+ requestPermission.launch(TaskProvider.PERMISSIONS_TASKS_ORG)
})
model.needJtxPermissions.observe(viewLifecycleOwner, { needJtx ->
if (needJtx == true && model.haveJtxPermissions.value == false)
- requestPermissions(TaskProvider.PERMISSIONS_JTX, 0)
+ requestPermission.launch(TaskProvider.PERMISSIONS_JTX)
})
model.needAllPermissions.observe(viewLifecycleOwner, { needAll ->
if (needAll && model.haveAllPermissions.value == false) {
- val all = mutableSetOf(*CONTACT_PERMISSIONS, *CALENDAR_PERMISSIONS)
+ val all = mutableSetOf(*CONTACT_PERMISSIONS, *CALENDAR_PERMISSIONS, Manifest.permission.POST_NOTIFICATIONS)
if (model.haveOpenTasksPermissions.value != null)
all.addAll(TaskProvider.PERMISSIONS_OPENTASKS)
if (model.haveTasksOrgPermissions.value != null)
all.addAll(TaskProvider.PERMISSIONS_TASKS_ORG)
if (model.haveJtxPermissions.value != null)
all.addAll(TaskProvider.PERMISSIONS_JTX)
- requestPermissions(all.toTypedArray(), 0)
+ requestPermission.launch(all.toTypedArray())
}
})
@@ -93,11 +105,6 @@ class PermissionsFragment: Fragment() {
model.checkPermissions()
}
- override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults)
- model.checkPermissions()
- }
-
class Model(app: Application): AndroidViewModel(app) {
@@ -108,6 +115,8 @@ class PermissionsFragment: Fragment() {
val needContactsPermissions = MutableLiveData<Boolean>()
val haveCalendarPermissions = MutableLiveData<Boolean>()
val needCalendarPermissions = MutableLiveData<Boolean>()
+ val haveNotificationPermissions = MutableLiveData<Boolean>()
+ val needNotificationPermissions = MutableLiveData<Boolean>()
val haveOpenTasksPermissions = MutableLiveData<Boolean>()
val needOpenTasksPermissions = MutableLiveData<Boolean>()
@@ -153,6 +162,10 @@ class PermissionsFragment: Fragment() {
haveCalendarPermissions.value = calendarPermissions
needCalendarPermissions.value = calendarPermissions
+ val notificationPermissions = ContextCompat.checkSelfPermission(getApplication(), Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
+ haveNotificationPermissions.value = notificationPermissions
+ needNotificationPermissions.value = notificationPermissions
+
// OpenTasks
val openTasksAvailable = pm.resolveContentProvider(ProviderName.OpenTasks.authority, 0) != null
var openTasksPermissions: Boolean? = null
@@ -190,6 +203,7 @@ class PermissionsFragment: Fragment() {
// "all permissions" switch
val allPermissions = contactPermissions &&
calendarPermissions &&
+ notificationPermissions &&
(!openTasksAvailable || openTasksPermissions == true) &&
(!tasksOrgAvailable || tasksOrgPermissions == true) &&
(!jtxAvailable || jtxPermissions == true)
diff --git a/app/src/main/res/drawable/ic_notifications_off.xml b/app/src/main/res/drawable/ic_notifications_off.xml
new file mode 100644
index 00000000..daa24d19
--- /dev/null
+++ b/app/src/main/res/drawable/ic_notifications_off.xml
@@ -0,0 +1,5 @@
+<vector android:autoMirrored="true" android:height="24dp"
+ android:tint="#FFFFFF" android:viewportHeight="24"
+ android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="@android:color/white" android:pathData="M20,18.69L7.84,6.14 5.27,3.49 4,4.76l2.8,2.8v0.01c-0.52,0.99 -0.8,2.16 -0.8,3.42v5l-2,2v1h13.73l2,2L21,19.72l-1,-1.03zM12,22c1.11,0 2,-0.89 2,-2h-4c0,1.11 0.89,2 2,2zM18,14.68L18,11c0,-3.08 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68c-0.15,0.03 -0.29,0.08 -0.42,0.12 -0.1,0.03 -0.2,0.07 -0.3,0.11h-0.01c-0.01,0 -0.01,0 -0.02,0.01 -0.23,0.09 -0.46,0.2 -0.68,0.31 0,0 -0.01,0 -0.01,0.01L18,14.68z"/>
+</vector>
diff --git a/app/src/main/res/layout/account_list.xml b/app/src/main/res/layout/account_list.xml
index 18078361..dfc7d94e 100644
--- a/app/src/main/res/layout/account_list.xml
+++ b/app/src/main/res/layout/account_list.xml
@@ -6,6 +6,37 @@
android:orientation="vertical">
<androidx.cardview.widget.CardView
+ android:id="@+id/no_notifications_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="8dp"
+ app:contentPadding="@dimen/card_padding">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <androidx.appcompat.widget.AppCompatTextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ app:drawableLeftCompat="@drawable/ic_notifications_off"
+ app:drawableTint="?android:attr/textColorPrimary"
+ android:drawablePadding="8dp"
+ style="@style/TextAppearance.MaterialComponents.Body1"
+ android:text="@string/account_list_no_notification_permission"/>
+
+ <Button
+ android:id="@+id/allow_notifications"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="@style/Widget.MaterialComponents.Button.TextButton"
+ android:text="@string/account_permissions_action" />
+
+ </LinearLayout>
+ </androidx.cardview.widget.CardView>
+
+ <androidx.cardview.widget.CardView
android:id="@+id/no_network_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -31,7 +62,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.Button.TextButton"
- android:text="Manage connections" />
+ android:text="@string/account_list_manage_connections" />
</LinearLayout>
</androidx.cardview.widget.CardView>
@@ -63,7 +94,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.Button.TextButton"
- android:text="Manage storage" />
+ android:text="@string/account_list_manage_storage" />
</LinearLayout>
</androidx.cardview.widget.CardView>
diff --git a/app/src/main/res/layout/activity_permissions.xml b/app/src/main/res/layout/activity_permissions.xml
index 4862d548..60135c6c 100644
--- a/app/src/main/res/layout/activity_permissions.xml
+++ b/app/src/main/res/layout/activity_permissions.xml
@@ -31,14 +31,14 @@
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- app:layout_constraintVertical_chainStyle="packed"
- app:layout_constraintVertical_bias="0"
+ android:adjustViewBounds="true"
android:maxHeight="@dimen/card_theme_max_height"
- app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/heading"
- android:adjustViewBounds="true"
- app:verticalOffsetPercent=".45"
- app:srcCompat="@drawable/intro_permissions"/>
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0"
+ app:layout_constraintVertical_chainStyle="packed"
+ app:srcCompat="@drawable/intro_permissions"
+ app:verticalOffsetPercent=".45" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/start"
@@ -150,6 +150,72 @@
android:checked="@={model.needAllPermissions}" />
<TextView
+ android:id="@+id/notificationHeading"
+ style="@style/TextAppearance.MaterialComponents.Body1"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/card_margin_title_text"
+ android:text="@string/permissions_notification_title"
+ android:textAlignment="viewStart"
+ app:layout_constraintBottom_toTopOf="@id/notificationStatus"
+ app:layout_constraintEnd_toStartOf="@id/notificationSwitch"
+ app:layout_constraintStart_toEndOf="@id/start"
+ app:layout_constraintTop_toBottomOf="@id/allStatus" />
+
+ <TextView
+ android:id="@+id/notificationStatus"
+ style="@style/TextAppearance.MaterialComponents.Body2"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:text="@{model.haveNotificationPermissions ? @string/permissions_notification_status_on : @string/permissions_notification_status_off}"
+ android:textAlignment="viewStart"
+ app:layout_constraintEnd_toStartOf="@id/notificationSwitch"
+ app:layout_constraintStart_toEndOf="@id/start"
+ app:layout_constraintTop_toBottomOf="@id/notificationHeading" />
+ <com.google.android.material.switchmaterial.SwitchMaterial
+ android:id="@+id/notificationSwitch"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ app:layout_constraintTop_toTopOf="@id/notificationHeading"
+ app:layout_constraintBottom_toBottomOf="@id/notificationStatus"
+ app:layout_constraintEnd_toStartOf="@id/end"
+ android:clickable="@{!model.haveNotificationPermissions}"
+ android:checked="@={model.needNotificationPermissions}" />
+
+ <TextView
+ android:id="@+id/calendarHeading"
+ style="@style/TextAppearance.MaterialComponents.Body1"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/card_margin_title_text"
+ android:text="@string/permissions_calendar_title"
+ android:textAlignment="viewStart"
+ app:layout_constraintBottom_toTopOf="@id/calendarStatus"
+ app:layout_constraintEnd_toStartOf="@id/calendarSwitch"
+ app:layout_constraintStart_toEndOf="@id/start"
+ app:layout_constraintTop_toBottomOf="@id/notificationStatus" />
+
+ <TextView
+ android:id="@+id/calendarStatus"
+ style="@style/TextAppearance.MaterialComponents.Body2"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:text="@{model.haveCalendarPermissions ? @string/permissions_calendar_status_on : @string/permissions_calendar_status_off}"
+ android:textAlignment="viewStart"
+ app:layout_constraintEnd_toStartOf="@id/calendarSwitch"
+ app:layout_constraintStart_toEndOf="@id/start"
+ app:layout_constraintTop_toBottomOf="@id/calendarHeading" />
+ <com.google.android.material.switchmaterial.SwitchMaterial
+ android:id="@+id/calendarSwitch"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ app:layout_constraintTop_toTopOf="@id/calendarHeading"
+ app:layout_constraintBottom_toBottomOf="@id/calendarStatus"
+ app:layout_constraintEnd_toStartOf="@id/end"
+ android:clickable="@{!model.haveCalendarPermissions}"
+ android:checked="@={model.needCalendarPermissions}" />
+
+ <TextView
android:id="@+id/contactsHeading"
style="@style/TextAppearance.MaterialComponents.Body1"
android:layout_width="0dp"
@@ -160,7 +226,7 @@
app:layout_constraintBottom_toTopOf="@id/contactsStatus"
app:layout_constraintEnd_toStartOf="@id/contactsSwitch"
app:layout_constraintStart_toEndOf="@id/start"
- app:layout_constraintTop_toBottomOf="@id/allStatus" />
+ app:layout_constraintTop_toBottomOf="@id/calendarStatus" />
<TextView
android:id="@+id/contactsStatus"
@@ -183,37 +249,40 @@
android:checked="@={model.needContactsPermissions}" />
<TextView
- android:id="@+id/calendarHeading"
+ android:id="@+id/jtxHeading"
style="@style/TextAppearance.MaterialComponents.Body1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/card_margin_title_text"
- android:text="@string/permissions_calendar_title"
+ android:text="@string/permissions_jtx_title"
android:textAlignment="viewStart"
- app:layout_constraintBottom_toTopOf="@id/calendarStatus"
- app:layout_constraintEnd_toStartOf="@id/calendarSwitch"
+ android:visibility="@{model.haveJtxPermissions != null ? View.VISIBLE : View.GONE}"
+ app:layout_constraintBottom_toTopOf="@id/jtxStatus"
+ app:layout_constraintEnd_toStartOf="@id/jtxSwitch"
app:layout_constraintStart_toEndOf="@id/start"
app:layout_constraintTop_toBottomOf="@id/contactsStatus" />
<TextView
- android:id="@+id/calendarStatus"
+ android:id="@+id/jtxStatus"
style="@style/TextAppearance.MaterialComponents.Body2"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:text="@{model.haveCalendarPermissions ? @string/permissions_calendar_status_on : @string/permissions_calendar_status_off}"
+ android:text="@{model.haveJtxPermissions != null ? (model.haveJtxPermissions ? @string/permissions_jtx_status_on : @string/permissions_jtx_status_off) : @string/permissions_jtx_status_not_installed}"
android:textAlignment="viewStart"
- app:layout_constraintEnd_toStartOf="@id/calendarSwitch"
+ android:visibility="@{model.haveJtxPermissions != null ? View.VISIBLE : View.GONE}"
+ app:layout_constraintEnd_toStartOf="@id/jtxSwitch"
app:layout_constraintStart_toEndOf="@id/start"
- app:layout_constraintTop_toBottomOf="@id/calendarHeading" />
+ app:layout_constraintTop_toBottomOf="@id/jtxHeading" />
<com.google.android.material.switchmaterial.SwitchMaterial
- android:id="@+id/calendarSwitch"
+ android:id="@+id/jtxSwitch"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- app:layout_constraintTop_toTopOf="@id/calendarHeading"
- app:layout_constraintBottom_toBottomOf="@id/calendarStatus"
+ app:layout_constraintTop_toTopOf="@id/jtxHeading"
+ app:layout_constraintBottom_toBottomOf="@id/jtxStatus"
app:layout_constraintEnd_toStartOf="@id/end"
- android:clickable="@{!model.haveCalendarPermissions}"
- android:checked="@={model.needCalendarPermissions}" />
+ android:visibility="@{model.haveJtxPermissions != null ? View.VISIBLE : View.GONE}"
+ android:clickable="@{!model.haveJtxPermissions}"
+ android:checked="@={model.needJtxPermissions}" />
<TextView
android:id="@+id/openTasksHeading"
@@ -227,7 +296,7 @@
app:layout_constraintBottom_toTopOf="@id/openTasksStatus"
app:layout_constraintEnd_toStartOf="@id/openTasksSwitch"
app:layout_constraintStart_toEndOf="@id/start"
- app:layout_constraintTop_toBottomOf="@id/calendarStatus" />
+ app:layout_constraintTop_toBottomOf="@id/jtxStatus" />
<TextView
android:id="@+id/openTasksStatus"
@@ -288,42 +357,6 @@
android:checked="@={model.needTasksOrgPermissions}" />
<TextView
- android:id="@+id/jtxHeading"
- style="@style/TextAppearance.MaterialComponents.Body1"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/card_margin_title_text"
- android:text="@string/permissions_jtx_title"
- android:textAlignment="viewStart"
- android:visibility="@{model.haveJtxPermissions != null ? View.VISIBLE : View.GONE}"
- app:layout_constraintBottom_toTopOf="@id/jtxStatus"
- app:layout_constraintEnd_toStartOf="@id/jtxSwitch"
- app:layout_constraintStart_toEndOf="@id/start"
- app:layout_constraintTop_toBottomOf="@id/tasksOrgStatus" />
-
- <TextView
- android:id="@+id/jtxStatus"
- style="@style/TextAppearance.MaterialComponents.Body2"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:text="@{model.haveJtxPermissions != null ? (model.haveJtxPermissions ? @string/permissions_jtx_status_on : @string/permissions_jtx_status_off) : @string/permissions_jtx_status_not_installed}"
- android:textAlignment="viewStart"
- android:visibility="@{model.haveJtxPermissions != null ? View.VISIBLE : View.GONE}"
- app:layout_constraintEnd_toStartOf="@id/jtxSwitch"
- app:layout_constraintStart_toEndOf="@id/start"
- app:layout_constraintTop_toBottomOf="@id/jtxHeading" />
- <com.google.android.material.switchmaterial.SwitchMaterial
- android:id="@+id/jtxSwitch"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- app:layout_constraintTop_toTopOf="@id/jtxHeading"
- app:layout_constraintBottom_toBottomOf="@id/jtxStatus"
- app:layout_constraintEnd_toStartOf="@id/end"
- android:visibility="@{model.haveJtxPermissions != null ? View.VISIBLE : View.GONE}"
- android:clickable="@{!model.haveJtxPermissions}"
- android:checked="@={model.needJtxPermissions}" />
-
- <TextView
android:id="@+id/appSettingsHint"
style="@style/TextAppearance.MaterialComponents.Body1"
android:layout_width="0dp"
@@ -333,7 +366,7 @@
android:textAlignment="viewStart"
app:layout_constraintEnd_toEndOf="@id/end"
app:layout_constraintStart_toStartOf="@id/start"
- app:layout_constraintTop_toBottomOf="@id/jtxSwitch" />
+ app:layout_constraintTop_toBottomOf="@id/tasksOrgSwitch" />
<Button
android:id="@+id/appSettings"
diff --git a/app/src/main/res/values-h480dp/dimen.xml b/app/src/main/res/values-h480dp/dimen.xml
index ab127563..3aecfba3 100644
--- a/app/src/main/res/values-h480dp/dimen.xml
+++ b/app/src/main/res/values-h480dp/dimen.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <dimen name="card_theme_max_height">40mm</dimen>
+ <dimen name="card_theme_max_height">252dp</dimen>
</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml
index ec6ce570..760d4cdc 100644
--- a/app/src/main/res/values/dimen.xml
+++ b/app/src/main/res/values/dimen.xml
@@ -2,7 +2,7 @@
<resources>
<dimen name="activity_margin">8dp</dimen>
- <dimen name="card_theme_max_height">20mm</dimen>
+ <dimen name="card_theme_max_height">126dp</dimen>
<dimen name="card_padding">16dp</dimen>
<dimen name="card_margin_title_text">12dp</dimen>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e1efc0ba..a4088b9a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -72,6 +72,9 @@
<string name="permissions_calendar_title">Calendar permissions</string>
<string name="permissions_calendar_status_off">No calendar sync (not recommended)</string>
<string name="permissions_calendar_status_on">Calendar sync possible</string>
+ <string name="permissions_notification_title">Notification permissions</string>
+ <string name="permissions_notification_status_off">Notifications disabled (not recommended)</string>
+ <string name="permissions_notification_status_on">Notifications enabled</string>
<string name="permissions_jtx_title">jtx Board permissions</string>
<string name="permissions_jtx_status_not_installed">No task, journals &amp; notes sync (not installed)</string>
<string name="permissions_jtx_status_off">No tasks, journals, notes sync</string>
@@ -137,8 +140,11 @@
<string name="navigation_drawer_community">Community</string>
<string name="navigation_drawer_donate">Donate</string>
<string name="navigation_drawer_privacy_policy">Privacy policy</string>
+ <string name="account_list_no_notification_permission">Notifications disabled. You won\'t be notified about sync errors.</string>
<string name="account_list_no_internet">No Internet connectivity. Android will not run synchronization.</string>
+ <string name="account_list_manage_connections">Manage connections</string>
<string name="account_list_low_storage">Storage space low. Android will not run synchronization.</string>
+ <string name="account_list_manage_storage">Manage storage</string>
<string name="account_list_empty">Welcome to DAVx⁵!\n\nYou can add a CalDAV/CardDAV account now.</string>
<string name="accounts_global_sync_disabled">System-wide automatic synchronization is disabled</string>
<string name="accounts_global_sync_enable">Enable</string>