diff options
author | Sunik Kupfer <kupfer@bitfire.at> | 2022-11-01 14:49:06 +0300 |
---|---|---|
committer | Ricki Hirner <hirner@bitfire.at> | 2022-11-01 14:51:20 +0300 |
commit | 8915a3c10381aa130e529b9cc0b733977037c3f2 (patch) | |
tree | c6924078cdcc4f1d1279f55443663f57b0d35319 | |
parent | 43ae3fcd1f48e5b2087e8c7210b1f4b4c0926460 (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.gradle | 2 | ||||
-rw-r--r-- | app/src/main/java/at/bitfire/davdroid/PermissionUtils.kt | 8 | ||||
-rw-r--r-- | app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.kt | 20 | ||||
-rw-r--r-- | app/src/main/java/at/bitfire/davdroid/ui/PermissionsFragment.kt | 38 | ||||
-rw-r--r-- | app/src/main/res/drawable/ic_notifications_off.xml | 5 | ||||
-rw-r--r-- | app/src/main/res/layout/account_list.xml | 35 | ||||
-rw-r--r-- | app/src/main/res/layout/activity_permissions.xml | 149 | ||||
-rw-r--r-- | app/src/main/res/values-h480dp/dimen.xml | 2 | ||||
-rw-r--r-- | app/src/main/res/values/dimen.xml | 2 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 6 |
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 & 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> |