diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index adb9cb78..8ce4e129 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -15,29 +15,21 @@
-
-
-
-
+
+
+
+
+
-
-
+
+
diff --git a/app/src/main/java/at/bitfire/davdroid/AccountSettings.java b/app/src/main/java/at/bitfire/davdroid/AccountSettings.java
index dd9130b8..520de8fd 100644
--- a/app/src/main/java/at/bitfire/davdroid/AccountSettings.java
+++ b/app/src/main/java/at/bitfire/davdroid/AccountSettings.java
@@ -12,7 +12,6 @@ import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Notification;
-import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ContentProviderClient;
@@ -22,15 +21,13 @@ import android.content.Context;
import android.content.Intent;
import android.content.PeriodicSync;
import android.database.sqlite.SQLiteDatabase;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.NotificationCompat;
import android.text.TextUtils;
@@ -131,7 +128,7 @@ public class AccountSettings {
PendingIntent.FLAG_CANCEL_CURRENT))
.setLocalOnly(true)
.build();
- NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
+ NotificationManagerCompat nm = NotificationManagerCompat.from(context);
nm.notify(Constants.NOTIFICATION_ACCOUNT_SETTINGS_UPDATED, notify);
update(version);
@@ -432,7 +429,7 @@ public class AccountSettings {
public static class AppUpdatedReceiver extends BroadcastReceiver {
@Override
- @SuppressLint("UnsafeProtectedBroadcastReceiver")
+ @SuppressLint("UnsafeProtectedBroadcastReceiver,MissingPermission")
public void onReceive(Context context, Intent intent) {
App.log.info("DAVdroid was updated, checking for AccountSettings version");
diff --git a/app/src/main/java/at/bitfire/davdroid/AccountsChangedReceiver.java b/app/src/main/java/at/bitfire/davdroid/AccountsChangedReceiver.java
index b1d66f37..e76b7ca8 100644
--- a/app/src/main/java/at/bitfire/davdroid/AccountsChangedReceiver.java
+++ b/app/src/main/java/at/bitfire/davdroid/AccountsChangedReceiver.java
@@ -8,6 +8,7 @@
package at.bitfire.davdroid;
+import android.accounts.AccountManager;
import android.accounts.OnAccountsUpdateListener;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -22,12 +23,14 @@ public class AccountsChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- Intent serviceIntent = new Intent(context, DavService.class);
- serviceIntent.setAction(DavService.ACTION_ACCOUNTS_UPDATED);
- context.startService(serviceIntent);
+ if (AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION.equals(intent.getAction())) {
+ Intent serviceIntent = new Intent(context, DavService.class);
+ serviceIntent.setAction(DavService.ACTION_ACCOUNTS_UPDATED);
+ context.startService(serviceIntent);
- for (OnAccountsUpdateListener listener : listeners)
- listener.onAccountsUpdated(null);
+ for (OnAccountsUpdateListener listener : listeners)
+ listener.onAccountsUpdated(null);
+ }
}
public static void registerListener(OnAccountsUpdateListener listener, boolean callImmediately) {
diff --git a/app/src/main/java/at/bitfire/davdroid/App.java b/app/src/main/java/at/bitfire/davdroid/App.java
index 8b41f6fc..6a016285 100644
--- a/app/src/main/java/at/bitfire/davdroid/App.java
+++ b/app/src/main/java/at/bitfire/davdroid/App.java
@@ -10,7 +10,6 @@ package at.bitfire.davdroid;
import android.annotation.TargetApi;
import android.app.Application;
-import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -20,6 +19,7 @@ import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
@@ -106,7 +106,7 @@ public class App extends Application {
// add logcat handler
log.addHandler(LogcatHandler.INSTANCE);
- NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
+ NotificationManagerCompat nm = NotificationManagerCompat.from(this);
// log to external file according to preferences
if (logToFile) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
diff --git a/app/src/main/java/at/bitfire/davdroid/DavService.java b/app/src/main/java/at/bitfire/davdroid/DavService.java
index 9d684bff..527faca6 100644
--- a/app/src/main/java/at/bitfire/davdroid/DavService.java
+++ b/app/src/main/java/at/bitfire/davdroid/DavService.java
@@ -10,8 +10,8 @@ package at.bitfire.davdroid;
import android.accounts.Account;
import android.accounts.AccountManager;
+import android.annotation.SuppressLint;
import android.app.Notification;
-import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ContentValues;
@@ -19,11 +19,11 @@ import android.content.Intent;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
-import android.graphics.drawable.BitmapDrawable;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.NotificationCompat;
import android.text.TextUtils;
@@ -140,6 +140,7 @@ public class DavService extends Service {
which actually do the work
*/
+ @SuppressLint("MissingPermission")
void cleanupAccounts() {
App.log.info("Cleaning up orphaned accounts");
@@ -309,7 +310,7 @@ public class DavService extends Service {
if (account != null)
debugIntent.putExtra(DebugInfoActivity.KEY_ACCOUNT, account);
- NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
+ NotificationManagerCompat nm = NotificationManagerCompat.from(DavService.this);
Notification notify = new NotificationCompat.Builder(DavService.this)
.setSmallIcon(R.drawable.ic_error_light)
.setLargeIcon(App.getLauncherBitmap(DavService.this))
diff --git a/app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.java b/app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.java
index ce0d7289..0eb80e25 100644
--- a/app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.java
+++ b/app/src/main/java/at/bitfire/davdroid/resource/LocalAddressBook.java
@@ -175,7 +175,7 @@ public class LocalAddressBook extends AndroidAddressBook implements LocalCollect
// SYNC STATE
- @SuppressWarnings("Recycle")
+ @SuppressWarnings("ParcelClassLoader,Recycle")
protected void readSyncState() throws ContactsStorageException {
@Cleanup("recycle") Parcel parcel = Parcel.obtain();
byte[] raw = getSyncState();
diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.java
index e028c016..5190489e 100644
--- a/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.java
+++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.java
@@ -21,68 +21,69 @@ import android.os.IBinder;
import at.bitfire.davdroid.ui.setup.LoginActivity;
public class AccountAuthenticatorService extends Service {
- private static AccountAuthenticator accountAuthenticator;
- private AccountAuthenticator getAuthenticator() {
- if (accountAuthenticator != null)
- return accountAuthenticator;
- return accountAuthenticator = new AccountAuthenticator(this);
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT))
- return getAuthenticator().getIBinder();
- return null;
- }
-
-
- private static class AccountAuthenticator extends AbstractAccountAuthenticator {
- final Context context;
-
- public AccountAuthenticator(Context context) {
- super(context);
- this.context = context;
- }
+ private AccountAuthenticator accountAuthenticator;
- @Override
- public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType,
- String[] requiredFeatures, Bundle options) throws NetworkErrorException {
- Intent intent = new Intent(context, LoginActivity.class);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
- Bundle bundle = new Bundle();
- bundle.putParcelable(AccountManager.KEY_INTENT, intent);
- return bundle;
- }
+ @Override
+ public void onCreate() {
+ accountAuthenticator = new AccountAuthenticator(this);
+ }
- @Override
- public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException {
- return null;
- }
+ @Override
+ public IBinder onBind(Intent intent) {
+ if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT))
+ return accountAuthenticator.getIBinder();
+ return null;
+ }
- @Override
- public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
- return null;
- }
+
+ private static class AccountAuthenticator extends AbstractAccountAuthenticator {
+ final Context context;
+
+ public AccountAuthenticator(Context context) {
+ super(context);
+ this.context = context;
+ }
@Override
- public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
- return null;
- }
+ public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType,
+ String[] requiredFeatures, Bundle options) throws NetworkErrorException {
+ Intent intent = new Intent(context, LoginActivity.class);
+ intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(AccountManager.KEY_INTENT, intent);
+ return bundle;
+ }
- @Override
- public String getAuthTokenLabel(String authTokenType) {
- return null;
- }
+ @Override
+ public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException {
+ return null;
+ }
- @Override
- public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {
- return null;
- }
+ @Override
+ public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
+ return null;
+ }
- @Override
- public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
- return null;
- }
- }
+ @Override
+ public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
+ return null;
+ }
+
+ @Override
+ public String getAuthTokenLabel(String authTokenType) {
+ return null;
+ }
+
+ @Override
+ public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {
+ return null;
+ }
+
+ @Override
+ public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
+ return null;
+ }
+
+ }
}
diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncAdapterService.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncAdapterService.java
index 6cb417af..5e551883 100644
--- a/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncAdapterService.java
+++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncAdapterService.java
@@ -28,6 +28,7 @@ import android.os.IBinder;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.NotificationManagerCompat;
import java.util.logging.Level;
@@ -77,9 +78,8 @@ public abstract class SyncAdapterService extends Service {
.setContentText(getContext().getString(R.string.sync_error_permissions_text))
.setContentIntent(PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT))
.setCategory(NotificationCompat.CATEGORY_ERROR)
- .setLocalOnly(true)
.build();
- NotificationManager nm = (NotificationManager)getContext().getSystemService(NOTIFICATION_SERVICE);
+ NotificationManagerCompat nm = NotificationManagerCompat.from(getContext());
nm.notify(Constants.NOTIFICATION_PERMISSIONS, notify);
}
diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java
index 23f14ec8..bd8e4c5d 100644
--- a/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java
+++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/SyncManager.java
@@ -9,15 +9,14 @@ package at.bitfire.davdroid.syncadapter;
import android.accounts.Account;
import android.annotation.TargetApi;
-import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SyncResult;
-import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
+import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.NotificationCompat;
import android.text.TextUtils;
@@ -69,7 +68,7 @@ abstract public class SyncManager {
SYNC_PHASE_POST_PROCESSING = 10,
SYNC_PHASE_SAVE_SYNC_STATE = 11;
- protected final NotificationManager notificationManager;
+ protected final NotificationManagerCompat notificationManager;
protected final String uniqueCollectionId;
protected final Context context;
@@ -113,7 +112,7 @@ abstract public class SyncManager {
// dismiss previous error notifications
this.uniqueCollectionId = uniqueCollectionId;
- notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager = NotificationManagerCompat.from(context);
notificationManager.cancel(uniqueCollectionId, notificationId());
}
@@ -233,8 +232,7 @@ abstract public class SyncManager {
.setLargeIcon(App.getLauncherBitmap(context))
.setContentTitle(getSyncErrorTitle())
.setContentIntent(PendingIntent.getActivity(context, 0, detailsIntent, PendingIntent.FLAG_CANCEL_CURRENT))
- .setCategory(NotificationCompat.CATEGORY_ERROR)
- .setLocalOnly(true);
+ .setCategory(NotificationCompat.CATEGORY_ERROR);
try {
String[] phases = context.getResources().getStringArray(R.array.sync_error_phases);
diff --git a/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java
index f2a278f4..ebf7882c 100644
--- a/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java
+++ b/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java
@@ -11,6 +11,7 @@ package at.bitfire.davdroid.ui;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.OnAccountsUpdateListener;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
@@ -103,6 +104,7 @@ public class AccountListFragment extends ListFragment implements LoaderManager.L
}
@Override
+ @SuppressLint("MissingPermission")
public Account[] loadInBackground() {
return accountManager.getAccountsByType(Constants.ACCOUNT_TYPE);
}
diff --git a/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java
index 93ee19b7..d7274ccb 100644
--- a/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java
+++ b/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java
@@ -10,6 +10,7 @@ package at.bitfire.davdroid.ui;
import android.accounts.Account;
import android.accounts.AccountManager;
+import android.annotation.SuppressLint;
import android.app.LoaderManager;
import android.content.AsyncTaskLoader;
import android.content.ContentResolver;
@@ -144,6 +145,7 @@ public class DebugInfoActivity extends AppCompatActivity implements LoaderManage
}
@Override
+ @SuppressLint("MissingPermission")
public String loadInBackground() {
Throwable throwable = null;
String logs = null,
diff --git a/app/src/main/java/at/bitfire/davdroid/ui/PermissionsActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/PermissionsActivity.java
index 98478c16..d7275966 100644
--- a/app/src/main/java/at/bitfire/davdroid/ui/PermissionsActivity.java
+++ b/app/src/main/java/at/bitfire/davdroid/ui/PermissionsActivity.java
@@ -9,12 +9,12 @@
package at.bitfire.davdroid.ui;
import android.Manifest;
-import android.app.NotificationManager;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
@@ -63,7 +63,7 @@ public class PermissionsActivity extends AppCompatActivity {
}
if (!noCalendarPermissions && !noContactsPermissions && !noTaskPermissions) {
- NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
+ NotificationManagerCompat nm = NotificationManagerCompat.from(this);
nm.cancel(Constants.NOTIFICATION_PERMISSIONS);
finish();
diff --git a/app/src/main/java/at/bitfire/davdroid/ui/StartupDialogFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/StartupDialogFragment.java
index 94aeb03a..b4f0f047 100644
--- a/app/src/main/java/at/bitfire/davdroid/ui/StartupDialogFragment.java
+++ b/app/src/main/java/at/bitfire/davdroid/ui/StartupDialogFragment.java
@@ -8,6 +8,8 @@
package at.bitfire.davdroid.ui;
+import android.annotation.SuppressLint;
+import android.annotation.TargetApi;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
@@ -88,6 +90,8 @@ public class StartupDialogFragment extends DialogFragment {
@NonNull
@Override
+ @TargetApi(Build.VERSION_CODES.M)
+ @SuppressLint("BatteryLife")
public Dialog onCreateDialog(Bundle savedInstanceState) {
setCancelable(false);
diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml
index eaa1441a..f27933f5 100644
--- a/app/src/main/res/values/dimen.xml
+++ b/app/src/main/res/values/dimen.xml
@@ -13,6 +13,5 @@
16dp
16dp
- 160dp
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 8357d384..1b75c305 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -75,7 +75,7 @@
Security
Distrust system certificates
System and user-added CAs won\'t be trusted
- System and user-added CAs will be trusted
+ System and user-added CAs will be trusted (recommended)
Reset (un)trusted certificates
Resets trust of all custom certificates
All custom certificates have been cleared
diff --git a/cert4android b/cert4android
index c342cbd8..ec4e75dc 160000
--- a/cert4android
+++ b/cert4android
@@ -1 +1 @@
-Subproject commit c342cbd81185d7f6bd2cd25eea55bd0ecf94c1cc
+Subproject commit ec4e75dc9141e97aff250116120b631e0046a962