Commit 1df42350 authored by Ricki Hirner's avatar Ricki Hirner

Remove PermissionsActivity

* asking for permissions is already (and better) done by AccountActivity
parent 3dbd5e3d
...@@ -76,10 +76,6 @@ ...@@ -76,10 +76,6 @@
android:label="@string/app_settings" android:label="@string/app_settings"
android:parentActivityName=".ui.AccountsActivity"/> android:parentActivityName=".ui.AccountsActivity"/>
<activity android:name=".ui.PermissionsActivity"
android:label="@string/permissions_title"
android:parentActivityName=".ui.AccountsActivity"/>
<activity <activity
android:name=".ui.setup.LoginActivity" android:name=".ui.setup.LoginActivity"
android:label="@string/login_title" android:label="@string/login_title"
......
...@@ -15,21 +15,25 @@ import android.graphics.drawable.BitmapDrawable ...@@ -15,21 +15,25 @@ import android.graphics.drawable.BitmapDrawable
import android.os.Build import android.os.Build
import android.support.v7.app.AppCompatDelegate import android.support.v7.app.AppCompatDelegate
import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.log.Logger
<<<<<<< HEAD
=======
import at.bitfire.davdroid.ui.NotificationUtils
import kotlin.concurrent.thread
>>>>>>> 787260f1... Remove PermissionsActivity
class App: Application() { class App: Application() {
companion object { companion object {
@JvmField val DISTRUST_SYSTEM_CERTIFICATES = "distrust_system_certs" const val DISTRUST_SYSTEM_CERTIFICATES = "distrust_system_certs"
@JvmField val OVERRIDE_PROXY = "override_proxy" const val OVERRIDE_PROXY = "override_proxy"
@JvmField val OVERRIDE_PROXY_HOST = "override_proxy_host" const val OVERRIDE_PROXY_HOST = "override_proxy_host"
@JvmField val OVERRIDE_PROXY_PORT = "override_proxy_port" const val OVERRIDE_PROXY_PORT = "override_proxy_port"
@JvmField val OVERRIDE_PROXY_HOST_DEFAULT = "localhost" const val OVERRIDE_PROXY_HOST_DEFAULT = "localhost"
@JvmField val OVERRIDE_PROXY_PORT_DEFAULT = 8118 const val OVERRIDE_PROXY_PORT_DEFAULT = 8118
@JvmStatic
fun getLauncherBitmap(context: Context): Bitmap? { fun getLauncherBitmap(context: Context): Bitmap? {
val drawableLogo = if (android.os.Build.VERSION.SDK_INT >= 21) val drawableLogo = if (android.os.Build.VERSION.SDK_INT >= 21)
context.getDrawable(R.mipmap.ic_launcher) context.getDrawable(R.mipmap.ic_launcher)
...@@ -51,6 +55,21 @@ class App: Application() { ...@@ -51,6 +55,21 @@ class App: Application() {
if (Build.VERSION.SDK_INT <= 21) if (Build.VERSION.SDK_INT <= 21)
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
NotificationUtils.createChannels(this)
// don't block UI for some background checks
thread {
// watch installed/removed apps
val tasksFilter = IntentFilter()
tasksFilter.addAction(Intent.ACTION_PACKAGE_ADDED)
tasksFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED)
tasksFilter.addDataScheme("package")
registerReceiver(PackageChangedReceiver(), tasksFilter)
// check whether a tasks app is currently installed
PackageChangedReceiver.updateTaskSync(this)
}
} }
} }
...@@ -13,10 +13,6 @@ object Constants { ...@@ -13,10 +13,6 @@ object Constants {
const val NOTIFICATION_EXTERNAL_FILE_LOGGING = 1 const val NOTIFICATION_EXTERNAL_FILE_LOGGING = 1
const val NOTIFICATION_REFRESH_COLLECTIONS = 2 const val NOTIFICATION_REFRESH_COLLECTIONS = 2
const val NOTIFICATION_PERMISSIONS = 20
const val NOTIFICATION_SUBSCRIPTION = 21
const val DAVDROID_GREEN_RGBA = 0xFF8bc34a.toInt() const val DAVDROID_GREEN_RGBA = 0xFF8bc34a.toInt()
const val DEFAULT_SYNC_INTERVAL = 4 * 3600L // 4 hours const val DEFAULT_SYNC_INTERVAL = 4 * 3600L // 4 hours
......
...@@ -17,6 +17,7 @@ import android.database.DatabaseUtils ...@@ -17,6 +17,7 @@ import android.database.DatabaseUtils
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import android.os.Binder import android.os.Binder
import android.support.v4.app.NotificationCompat import android.support.v4.app.NotificationCompat
import android.support.v4.app.NotificationManagerCompat
import at.bitfire.dav4android.DavResource import at.bitfire.dav4android.DavResource
import at.bitfire.dav4android.UrlUtils import at.bitfire.dav4android.UrlUtils
import at.bitfire.dav4android.exception.DavException import at.bitfire.dav4android.exception.DavException
...@@ -324,7 +325,7 @@ class DavService: Service() { ...@@ -324,7 +325,7 @@ class DavService: Service() {
debugIntent.putExtra(DebugInfoActivity.KEY_THROWABLE, e) debugIntent.putExtra(DebugInfoActivity.KEY_THROWABLE, e)
debugIntent.putExtra(DebugInfoActivity.KEY_ACCOUNT, account) debugIntent.putExtra(DebugInfoActivity.KEY_ACCOUNT, account)
val nm = NotificationUtils.createChannels(this) val nm = NotificationManagerCompat.from(this)
val notify = NotificationCompat.Builder(this, NotificationUtils.CHANNEL_SYNC_ERRORS) val notify = NotificationCompat.Builder(this, NotificationUtils.CHANNEL_SYNC_ERRORS)
.setSmallIcon(R.drawable.ic_sync_error_notification) .setSmallIcon(R.drawable.ic_sync_error_notification)
.setContentTitle(getString(R.string.dav_service_refresh_failed)) .setContentTitle(getString(R.string.dav_service_refresh_failed))
......
...@@ -15,6 +15,7 @@ import android.content.SharedPreferences ...@@ -15,6 +15,7 @@ import android.content.SharedPreferences
import android.os.Process import android.os.Process
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.support.v4.app.NotificationCompat import android.support.v4.app.NotificationCompat
import android.support.v4.app.NotificationManagerCompat
import android.util.Log import android.util.Log
import at.bitfire.davdroid.App import at.bitfire.davdroid.App
import at.bitfire.davdroid.Constants import at.bitfire.davdroid.Constants
...@@ -62,7 +63,7 @@ object Logger { ...@@ -62,7 +63,7 @@ object Logger {
rootLogger.handlers.forEach { rootLogger.removeHandler(it) } rootLogger.handlers.forEach { rootLogger.removeHandler(it) }
rootLogger.addHandler(LogcatHandler) rootLogger.addHandler(LogcatHandler)
val nm = NotificationUtils.createChannels(context) val nm = NotificationManagerCompat.from(context)
// log to external file according to preferences // log to external file according to preferences
if (logToFile) { if (logToFile) {
val builder = NotificationCompat.Builder(context, NotificationUtils.CHANNEL_DEBUG) val builder = NotificationCompat.Builder(context, NotificationUtils.CHANNEL_DEBUG)
......
...@@ -26,7 +26,6 @@ import at.bitfire.davdroid.model.CollectionInfo ...@@ -26,7 +26,6 @@ import at.bitfire.davdroid.model.CollectionInfo
import at.bitfire.davdroid.model.SyncState import at.bitfire.davdroid.model.SyncState
import at.bitfire.vcard4android.* import at.bitfire.vcard4android.*
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.FileNotFoundException
import java.util.* import java.util.*
import java.util.logging.Level import java.util.logging.Level
...@@ -92,6 +91,16 @@ class LocalAddressBook( ...@@ -92,6 +91,16 @@ class LocalAddressBook(
return bundle return bundle
} }
fun mainAccount(context: Context, account: Account): Account =
if (account.type == context.getString(R.string.account_type_address_book)) {
val manager = AccountManager.get(context)
Account(
manager.getUserData(account, USER_DATA_MAIN_ACCOUNT_NAME),
manager.getUserData(account, USER_DATA_MAIN_ACCOUNT_TYPE)
)
} else
account
} }
override val title = account.name override val title = account.name
......
...@@ -10,7 +10,6 @@ package at.bitfire.davdroid.resource ...@@ -10,7 +10,6 @@ package at.bitfire.davdroid.resource
import android.content.ContentProviderOperation import android.content.ContentProviderOperation
import android.content.ContentValues import android.content.ContentValues
import android.provider.CalendarContract.Events
import at.bitfire.ical4android.* import at.bitfire.ical4android.*
import org.dmfs.tasks.contract.TaskContract.Tasks import org.dmfs.tasks.contract.TaskContract.Tasks
import java.util.* import java.util.*
......
...@@ -18,7 +18,6 @@ import at.bitfire.davdroid.log.Logger ...@@ -18,7 +18,6 @@ import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.model.ServiceDB import at.bitfire.davdroid.model.ServiceDB
import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.resource.LocalAddressBook
import at.bitfire.davdroid.ui.setup.LoginActivity import at.bitfire.davdroid.ui.setup.LoginActivity
import at.bitfire.vcard4android.ContactsStorageException
import java.util.* import java.util.*
import java.util.logging.Level import java.util.logging.Level
......
...@@ -16,15 +16,15 @@ import android.net.ConnectivityManager ...@@ -16,15 +16,15 @@ import android.net.ConnectivityManager
import android.net.wifi.WifiManager import android.net.wifi.WifiManager
import android.os.Bundle import android.os.Bundle
import android.support.v4.app.NotificationCompat import android.support.v4.app.NotificationCompat
import android.support.v4.app.NotificationManagerCompat
import at.bitfire.davdroid.AccountSettings import at.bitfire.davdroid.AccountSettings
import at.bitfire.davdroid.App
import at.bitfire.davdroid.Constants
import at.bitfire.davdroid.R import at.bitfire.davdroid.R
import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.log.Logger
import at.bitfire.davdroid.settings.ISettings import at.bitfire.davdroid.settings.ISettings
import at.bitfire.davdroid.settings.Settings import at.bitfire.davdroid.settings.Settings
import at.bitfire.davdroid.ui.AccountActivity
import at.bitfire.davdroid.ui.NotificationUtils import at.bitfire.davdroid.ui.NotificationUtils
import at.bitfire.davdroid.ui.PermissionsActivity import org.apache.commons.collections4.IteratorUtils
import java.util.* import java.util.*
import java.util.logging.Level import java.util.logging.Level
...@@ -34,7 +34,7 @@ abstract class SyncAdapterService: Service() { ...@@ -34,7 +34,7 @@ abstract class SyncAdapterService: Service() {
val runningSyncs = Collections.synchronizedSet(mutableSetOf<Pair<String, Account>>())!! val runningSyncs = Collections.synchronizedSet(mutableSetOf<Pair<String, Account>>())!!
} }
abstract protected fun syncAdapter(): AbstractThreadedSyncAdapter protected abstract fun syncAdapter(): AbstractThreadedSyncAdapter
override fun onBind(intent: Intent?) = syncAdapter().syncAdapterBinder!! override fun onBind(intent: Intent?) = syncAdapter().syncAdapterBinder!!
...@@ -79,19 +79,18 @@ abstract class SyncAdapterService: Service() { ...@@ -79,19 +79,18 @@ abstract class SyncAdapterService: Service() {
Logger.log.log(Level.WARNING, "Security exception when opening content provider for $authority") Logger.log.log(Level.WARNING, "Security exception when opening content provider for $authority")
syncResult.databaseError = true syncResult.databaseError = true
val intent = Intent(context, PermissionsActivity::class.java) val intent = Intent(context, AccountActivity::class.java)
intent.putExtra(AccountActivity.EXTRA_ACCOUNT, account)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
val notify = NotificationCompat.Builder(context, NotificationUtils.CHANNEL_SYNC_ERRORS) val notify = NotificationUtils.newBuilder(context, NotificationUtils.CHANNEL_SYNC_ERRORS)
.setSmallIcon(R.drawable.ic_sync_error_notification) .setSmallIcon(R.drawable.ic_sync_error_notification)
.setLargeIcon(App.getLauncherBitmap(context))
.setContentTitle(context.getString(R.string.sync_error_permissions)) .setContentTitle(context.getString(R.string.sync_error_permissions))
.setContentText(context.getString(R.string.sync_error_permissions_text)) .setContentText(context.getString(R.string.sync_error_permissions_text))
.setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)) .setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT))
.setCategory(NotificationCompat.CATEGORY_ERROR) .setCategory(NotificationCompat.CATEGORY_ERROR)
.build() .build()
val nm = NotificationUtils.createChannels(context) NotificationManagerCompat.from(context).notify(NotificationUtils.NOTIFY_PERMISSIONS, notify)
nm.notify(Constants.NOTIFICATION_PERMISSIONS, notify)
} }
protected fun checkSyncConditions(settings: AccountSettings): Boolean { protected fun checkSyncConditions(settings: AccountSettings): Boolean {
......
...@@ -15,20 +15,18 @@ import android.content.Context ...@@ -15,20 +15,18 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.SyncResult import android.content.SyncResult
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.RemoteException import android.os.RemoteException
import android.provider.CalendarContract import android.provider.CalendarContract
import android.provider.ContactsContract import android.provider.ContactsContract
import android.support.v4.app.NotificationCompat import android.support.v4.app.NotificationCompat
import android.text.Html import android.support.v4.app.NotificationManagerCompat
import at.bitfire.dav4android.DavResource import at.bitfire.dav4android.DavResource
import at.bitfire.dav4android.exception.DavException import at.bitfire.dav4android.exception.DavException
import at.bitfire.dav4android.exception.HttpException import at.bitfire.dav4android.exception.HttpException
import at.bitfire.dav4android.exception.ServiceUnavailableException import at.bitfire.dav4android.exception.ServiceUnavailableException
import at.bitfire.dav4android.exception.UnauthorizedException import at.bitfire.dav4android.exception.UnauthorizedException
import at.bitfire.davdroid.AccountSettings import at.bitfire.davdroid.AccountSettings
import at.bitfire.davdroid.App
import at.bitfire.davdroid.BuildConfig import at.bitfire.davdroid.BuildConfig
import at.bitfire.davdroid.R import at.bitfire.davdroid.R
import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.log.Logger
...@@ -62,7 +60,7 @@ abstract class SyncManager<out ResourceType: LocalResource, out CollectionType: ...@@ -62,7 +60,7 @@ abstract class SyncManager<out ResourceType: LocalResource, out CollectionType:
val localCollection: CollectionType val localCollection: CollectionType
): AutoCloseable { ): AutoCloseable {
protected val notificationManager = NotificationUtils.createChannels(context) protected val notificationManager = NotificationManagerCompat.from(context)
/** Local resource we're currently operating on. Used for error notifications. **/ /** Local resource we're currently operating on. Used for error notifications. **/
protected val currentLocalResource = Stack<LocalResource>() protected val currentLocalResource = Stack<LocalResource>()
......
...@@ -42,7 +42,6 @@ import at.bitfire.davdroid.model.ServiceDB.Collections ...@@ -42,7 +42,6 @@ import at.bitfire.davdroid.model.ServiceDB.Collections
import at.bitfire.davdroid.resource.LocalAddressBook import at.bitfire.davdroid.resource.LocalAddressBook
import at.bitfire.davdroid.resource.LocalTaskList import at.bitfire.davdroid.resource.LocalTaskList
import at.bitfire.ical4android.TaskProvider import at.bitfire.ical4android.TaskProvider
import at.bitfire.vcard4android.ContactsStorageException
import kotlinx.android.synthetic.main.account_caldav_item.view.* import kotlinx.android.synthetic.main.account_caldav_item.view.*
import kotlinx.android.synthetic.main.activity_account.* import kotlinx.android.synthetic.main.activity_account.*
import java.util.* import java.util.*
...@@ -51,7 +50,7 @@ import java.util.logging.Level ...@@ -51,7 +50,7 @@ import java.util.logging.Level
class AccountActivity: AppCompatActivity(), Toolbar.OnMenuItemClickListener, PopupMenu.OnMenuItemClickListener, LoaderManager.LoaderCallbacks<AccountActivity.AccountInfo> { class AccountActivity: AppCompatActivity(), Toolbar.OnMenuItemClickListener, PopupMenu.OnMenuItemClickListener, LoaderManager.LoaderCallbacks<AccountActivity.AccountInfo> {
companion object { companion object {
@JvmField val EXTRA_ACCOUNT = "account" const val EXTRA_ACCOUNT = "account"
private fun requestSync(context: Context, account: Account) { private fun requestSync(context: Context, account: Account) {
val authorities = arrayOf( val authorities = arrayOf(
...@@ -77,7 +76,9 @@ class AccountActivity: AppCompatActivity(), Toolbar.OnMenuItemClickListener, Pop ...@@ -77,7 +76,9 @@ class AccountActivity: AppCompatActivity(), Toolbar.OnMenuItemClickListener, Pop
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
account = intent.getParcelableExtra(EXTRA_ACCOUNT) // account may be a DAVdroid address book account -> use main account in this case
account = LocalAddressBook.mainAccount(this,
requireNotNull(intent.getParcelableExtra(EXTRA_ACCOUNT)))
title = account.name title = account.name
setContentView(R.layout.activity_account) setContentView(R.layout.activity_account)
......
...@@ -15,7 +15,6 @@ import android.app.NotificationManager ...@@ -15,7 +15,6 @@ import android.app.NotificationManager
import android.content.Context import android.content.Context
import android.os.Build import android.os.Build
import android.support.v4.app.NotificationCompat import android.support.v4.app.NotificationCompat
import android.support.v4.app.NotificationManagerCompat
import at.bitfire.davdroid.App import at.bitfire.davdroid.App
import at.bitfire.davdroid.R import at.bitfire.davdroid.R
...@@ -24,6 +23,7 @@ object NotificationUtils { ...@@ -24,6 +23,7 @@ object NotificationUtils {
// notification IDs // notification IDs
const val NOTIFY_SYNC_ERROR = 10 const val NOTIFY_SYNC_ERROR = 10
const val NOTIFY_OPENTASKS = 20 const val NOTIFY_OPENTASKS = 20
const val NOTIFY_PERMISSIONS = 21
// notification channels // notification channels
const val CHANNEL_GENERAL = "general" const val CHANNEL_GENERAL = "general"
...@@ -35,7 +35,7 @@ object NotificationUtils { ...@@ -35,7 +35,7 @@ object NotificationUtils {
const val CHANNEL_SYNC_STATUS = "syncStatus" const val CHANNEL_SYNC_STATUS = "syncStatus"
fun createChannels(context: Context): NotificationManagerCompat { fun createChannels(context: Context) {
@TargetApi(Build.VERSION_CODES.O) @TargetApi(Build.VERSION_CODES.O)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
...@@ -57,8 +57,6 @@ object NotificationUtils { ...@@ -57,8 +57,6 @@ object NotificationUtils {
*syncChannels *syncChannels
)) ))
} }
return NotificationManagerCompat.from(context)
} }
fun newBuilder(context: Context, channel: String = CHANNEL_GENERAL): NotificationCompat.Builder { fun newBuilder(context: Context, channel: String = CHANNEL_GENERAL): NotificationCompat.Builder {
......
/*
* Copyright © Ricki Hirner (bitfire web engineering).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*/
package at.bitfire.davdroid.ui
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.support.v4.app.ActivityCompat
import android.support.v7.app.AppCompatActivity
import android.view.View
import at.bitfire.davdroid.Constants
import at.bitfire.davdroid.R
import at.bitfire.davdroid.resource.LocalTaskList
import at.bitfire.ical4android.TaskProvider
import kotlinx.android.synthetic.main.activity_permissions.*
class PermissionsActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_permissions)
}
override fun onResume() {
super.onResume()
refresh()
}
private fun refresh() {
val noCalendarPermissions =
ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED
calendar_permissions.visibility = if (noCalendarPermissions) View.VISIBLE else View.GONE
val noContactsPermissions =
ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED
contacts_permissions.visibility = if (noContactsPermissions) View.VISIBLE else View.GONE
val noTaskPermissions: Boolean
if (LocalTaskList.tasksProviderAvailable(this)) {
noTaskPermissions =
ActivityCompat.checkSelfPermission(this, TaskProvider.PERMISSION_READ_TASKS) != PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(this, TaskProvider.PERMISSION_WRITE_TASKS) != PackageManager.PERMISSION_GRANTED
findViewById<View>(R.id.opentasks_permissions).visibility = if (noTaskPermissions) View.VISIBLE else View.GONE
} else {
findViewById<View>(R.id.opentasks_permissions).visibility = View.GONE
noTaskPermissions = false
}
if (!noCalendarPermissions && !noContactsPermissions && !noTaskPermissions) {
val nm = NotificationUtils.createChannels(this)
nm.cancel(Constants.NOTIFICATION_PERMISSIONS)
finish()
}
}
fun requestCalendarPermissions(v: View) {
ActivityCompat.requestPermissions(this, arrayOf(
Manifest.permission.READ_CALENDAR,
Manifest.permission.WRITE_CALENDAR
), 0)
}
fun requestContactsPermissions(v: View) {
ActivityCompat.requestPermissions(this, arrayOf(
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS
), 0)
}
fun requestOpenTasksPermissions(v: View) {
ActivityCompat.requestPermissions(this, arrayOf(
TaskProvider.PERMISSION_READ_TASKS,
TaskProvider.PERMISSION_WRITE_TASKS
), 0)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
refresh()
}
}
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright © 2013 – 2016 Ricki Hirner (bitfire web engineering).
~ All rights reserved. This program and the accompanying materials
~ are made available under the terms of the GNU Public License v3.0
~ which accompanies this distribution, and is available at
~ http://www.gnu.org/licenses/gpl.html
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/activity_margin">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/calendar_permissions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginBottom="16dp"
tools:ignore="UselessParent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextView.Heading"
android:text="@string/permissions_calendar"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/permissions_calendar_details"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/permissions_calendar_request"
android:onClick="requestCalendarPermissions"/>
</LinearLayout>
<LinearLayout
android:id="@+id/contacts_permissions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginBottom="16dp"
tools:ignore="UselessParent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextView.Heading"
android:text="@string/permissions_contacts"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/permissions_contacts_details"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/permissions_contacts_request"
android:onClick="requestContactsPermissions"/>
</LinearLayout>
<LinearLayout
android:id="@+id/opentasks_permissions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:ignore="UselessParent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextView.Heading"
android:text="@string/permissions_opentasks"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/permissions_opentasks_details"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/permissions_opentasks_request"
android:onClick="requestOpenTasksPermissions"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
\ No newline at end of file
...@@ -131,18 +131,6 @@ ...@@ -131,18 +131,6 @@
<string name="account_install_icsdroid">Install ICSdroid</string> <string name="account_install_icsdroid">Install ICSdroid</string>
<string name="account_read_only_address_book_selected">Read-only address book – local changes will be discarded!</string> <string name="account_read_only_address_book_selected">Read-only address book – local changes will be discarded!</string>
<!-- PermissionsActivity -->
<string name="permissions_title">DAVdroid permissions</string>
<string name="permissions_calendar">Calendar permissions</string>
<string name="permissions_calendar_details">To synchronize CalDAV events with your local calendars, DAVdroid needs to access your calendars.</string>
<string name="permissions_calendar_request">Request calendar permissions</string>
<string name="permissions_contacts">Contacts permissions</string>
<string name="permissions_contacts_details">To synchronize CardDAV address books with your local contacts, DAVdroid needs to access your contacts.</string>
<string name="permissions_contacts_request">Request contacts permissions</string>
<string name="permissions_opentasks">OpenTasks permissions</string>
<string name="permissions_opentasks_details">To synchronize CalDAV tasks with your local task lists, DAVdroid needs to access OpenTasks.</string>
<string name="permissions_opentasks_request">Request OpenTasks permissions</string>
<!-- AddAccountActivity --> <!-- AddAccountActivity -->
<string name="login_help_url">https://www.davdroid.com/tested-with/?pk_campaign=davdroid-app</string> <string name="login_help_url">https://www.davdroid.com/tested-with/?pk_campaign=davdroid-app</string>
<string name="login_title">Add account</string> <string name="login_title">Add account</string>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment