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