1
0
mirror of https://github.com/etesync/android synced 2025-05-07 17:39:12 +00:00

lint optimizations

* permissions: declare AUTHENTICATE_ACCOUNTS, GET_ACCOUNTS and MANAGE_ACCOUNTS only until SDK level 22
* minor optimizations and bug fixes
This commit is contained in:
Ricki Hirner 2016-09-02 11:57:16 +02:00
parent 290ce7ad80
commit 9555c066bd
16 changed files with 99 additions and 100 deletions

View File

@ -15,29 +15,21 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/> <uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/> <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<!-- legacy permissions --> <!-- account management permissions not required for own accounts since API level 22 -->
<uses-permission <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" android:maxSdkVersion="22"/>
android:name="android.permission.AUTHENTICATE_ACCOUNTS" <uses-permission android:name="android.permission.GET_ACCOUNTS" android:maxSdkVersion="22"/>
android:maxSdkVersion="22" <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" android:maxSdkVersion="22"/>
tools:ignore="UnusedAttribute"/>
<!-- <!--
for writing external log files; permission only required for SDK <= 18 because since then, for writing external log files; permission only required for SDK <= 18 because since then,
writing to app-private directory doesn't require extra permissions writing to app-private directory doesn't require extra permissions
--> -->
<uses-permission <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
android:name="android.permission.READ_EXTERNAL_STORAGE" <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
android:maxSdkVersion="18"
tools:ignore="UnusedAttribute"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18"
tools:ignore="UnusedAttribute"/>
<!-- other permissions --> <!-- other permissions -->
<!-- android.permission-group.CONTACTS --> <!-- android.permission-group.CONTACTS -->

View File

@ -12,7 +12,6 @@ import android.accounts.AccountManager;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ContentProviderClient; import android.content.ContentProviderClient;
@ -22,15 +21,13 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.PeriodicSync; import android.content.PeriodicSync;
import android.database.sqlite.SQLiteDatabase; 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.Build;
import android.os.Bundle; import android.os.Bundle;
import android.provider.CalendarContract; import android.provider.CalendarContract;
import android.provider.ContactsContract; import android.provider.ContactsContract;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.NotificationCompat; import android.support.v7.app.NotificationCompat;
import android.text.TextUtils; import android.text.TextUtils;
@ -131,7 +128,7 @@ public class AccountSettings {
PendingIntent.FLAG_CANCEL_CURRENT)) PendingIntent.FLAG_CANCEL_CURRENT))
.setLocalOnly(true) .setLocalOnly(true)
.build(); .build();
NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); NotificationManagerCompat nm = NotificationManagerCompat.from(context);
nm.notify(Constants.NOTIFICATION_ACCOUNT_SETTINGS_UPDATED, notify); nm.notify(Constants.NOTIFICATION_ACCOUNT_SETTINGS_UPDATED, notify);
update(version); update(version);
@ -432,7 +429,7 @@ public class AccountSettings {
public static class AppUpdatedReceiver extends BroadcastReceiver { public static class AppUpdatedReceiver extends BroadcastReceiver {
@Override @Override
@SuppressLint("UnsafeProtectedBroadcastReceiver") @SuppressLint("UnsafeProtectedBroadcastReceiver,MissingPermission")
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
App.log.info("DAVdroid was updated, checking for AccountSettings version"); App.log.info("DAVdroid was updated, checking for AccountSettings version");

View File

@ -8,6 +8,7 @@
package at.bitfire.davdroid; package at.bitfire.davdroid;
import android.accounts.AccountManager;
import android.accounts.OnAccountsUpdateListener; import android.accounts.OnAccountsUpdateListener;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@ -22,6 +23,7 @@ public class AccountsChangedReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION.equals(intent.getAction())) {
Intent serviceIntent = new Intent(context, DavService.class); Intent serviceIntent = new Intent(context, DavService.class);
serviceIntent.setAction(DavService.ACTION_ACCOUNTS_UPDATED); serviceIntent.setAction(DavService.ACTION_ACCOUNTS_UPDATED);
context.startService(serviceIntent); context.startService(serviceIntent);
@ -29,6 +31,7 @@ public class AccountsChangedReceiver extends BroadcastReceiver {
for (OnAccountsUpdateListener listener : listeners) for (OnAccountsUpdateListener listener : listeners)
listener.onAccountsUpdated(null); listener.onAccountsUpdated(null);
} }
}
public static void registerListener(OnAccountsUpdateListener listener, boolean callImmediately) { public static void registerListener(OnAccountsUpdateListener listener, boolean callImmediately) {
listeners.add(listener); listeners.add(listener);

View File

@ -10,7 +10,6 @@ package at.bitfire.davdroid;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Application; import android.app.Application;
import android.app.NotificationManager;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -20,6 +19,7 @@ import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.NotificationCompat; import android.support.v7.app.NotificationCompat;
import android.util.Log; import android.util.Log;
@ -106,7 +106,7 @@ public class App extends Application {
// add logcat handler // add logcat handler
log.addHandler(LogcatHandler.INSTANCE); log.addHandler(LogcatHandler.INSTANCE);
NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); NotificationManagerCompat nm = NotificationManagerCompat.from(this);
// log to external file according to preferences // log to external file according to preferences
if (logToFile) { if (logToFile) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this); NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

View File

@ -10,8 +10,8 @@ package at.bitfire.davdroid;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
import android.content.ContentValues; import android.content.ContentValues;
@ -19,11 +19,11 @@ import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.database.DatabaseUtils; import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.BitmapDrawable;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.NotificationCompat; import android.support.v7.app.NotificationCompat;
import android.text.TextUtils; import android.text.TextUtils;
@ -140,6 +140,7 @@ public class DavService extends Service {
which actually do the work which actually do the work
*/ */
@SuppressLint("MissingPermission")
void cleanupAccounts() { void cleanupAccounts() {
App.log.info("Cleaning up orphaned accounts"); App.log.info("Cleaning up orphaned accounts");
@ -309,7 +310,7 @@ public class DavService extends Service {
if (account != null) if (account != null)
debugIntent.putExtra(DebugInfoActivity.KEY_ACCOUNT, account); 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) Notification notify = new NotificationCompat.Builder(DavService.this)
.setSmallIcon(R.drawable.ic_error_light) .setSmallIcon(R.drawable.ic_error_light)
.setLargeIcon(App.getLauncherBitmap(DavService.this)) .setLargeIcon(App.getLauncherBitmap(DavService.this))

View File

@ -175,7 +175,7 @@ public class LocalAddressBook extends AndroidAddressBook implements LocalCollect
// SYNC STATE // SYNC STATE
@SuppressWarnings("Recycle") @SuppressWarnings("ParcelClassLoader,Recycle")
protected void readSyncState() throws ContactsStorageException { protected void readSyncState() throws ContactsStorageException {
@Cleanup("recycle") Parcel parcel = Parcel.obtain(); @Cleanup("recycle") Parcel parcel = Parcel.obtain();
byte[] raw = getSyncState(); byte[] raw = getSyncState();

View File

@ -21,18 +21,18 @@ import android.os.IBinder;
import at.bitfire.davdroid.ui.setup.LoginActivity; import at.bitfire.davdroid.ui.setup.LoginActivity;
public class AccountAuthenticatorService extends Service { public class AccountAuthenticatorService extends Service {
private static AccountAuthenticator accountAuthenticator;
private AccountAuthenticator getAuthenticator() { private AccountAuthenticator accountAuthenticator;
if (accountAuthenticator != null)
return accountAuthenticator; @Override
return accountAuthenticator = new AccountAuthenticator(this); public void onCreate() {
accountAuthenticator = new AccountAuthenticator(this);
} }
@Override @Override
public IBinder onBind(Intent intent) { public IBinder onBind(Intent intent) {
if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT)) if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT))
return getAuthenticator().getIBinder(); return accountAuthenticator.getIBinder();
return null; return null;
} }
@ -84,5 +84,6 @@ public class AccountAuthenticatorService extends Service {
public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
return null; return null;
} }
} }
} }

View File

@ -28,6 +28,7 @@ import android.os.IBinder;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import java.util.logging.Level; import java.util.logging.Level;
@ -77,9 +78,8 @@ public abstract class SyncAdapterService extends Service {
.setContentText(getContext().getString(R.string.sync_error_permissions_text)) .setContentText(getContext().getString(R.string.sync_error_permissions_text))
.setContentIntent(PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)) .setContentIntent(PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT))
.setCategory(NotificationCompat.CATEGORY_ERROR) .setCategory(NotificationCompat.CATEGORY_ERROR)
.setLocalOnly(true)
.build(); .build();
NotificationManager nm = (NotificationManager)getContext().getSystemService(NOTIFICATION_SERVICE); NotificationManagerCompat nm = NotificationManagerCompat.from(getContext());
nm.notify(Constants.NOTIFICATION_PERMISSIONS, notify); nm.notify(Constants.NOTIFICATION_PERMISSIONS, notify);
} }

View File

@ -9,15 +9,14 @@ package at.bitfire.davdroid.syncadapter;
import android.accounts.Account; import android.accounts.Account;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SyncResult; import android.content.SyncResult;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.NotificationCompat; import android.support.v7.app.NotificationCompat;
import android.text.TextUtils; import android.text.TextUtils;
@ -69,7 +68,7 @@ abstract public class SyncManager {
SYNC_PHASE_POST_PROCESSING = 10, SYNC_PHASE_POST_PROCESSING = 10,
SYNC_PHASE_SAVE_SYNC_STATE = 11; SYNC_PHASE_SAVE_SYNC_STATE = 11;
protected final NotificationManager notificationManager; protected final NotificationManagerCompat notificationManager;
protected final String uniqueCollectionId; protected final String uniqueCollectionId;
protected final Context context; protected final Context context;
@ -113,7 +112,7 @@ abstract public class SyncManager {
// dismiss previous error notifications // dismiss previous error notifications
this.uniqueCollectionId = uniqueCollectionId; this.uniqueCollectionId = uniqueCollectionId;
notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager = NotificationManagerCompat.from(context);
notificationManager.cancel(uniqueCollectionId, notificationId()); notificationManager.cancel(uniqueCollectionId, notificationId());
} }
@ -233,8 +232,7 @@ abstract public class SyncManager {
.setLargeIcon(App.getLauncherBitmap(context)) .setLargeIcon(App.getLauncherBitmap(context))
.setContentTitle(getSyncErrorTitle()) .setContentTitle(getSyncErrorTitle())
.setContentIntent(PendingIntent.getActivity(context, 0, detailsIntent, PendingIntent.FLAG_CANCEL_CURRENT)) .setContentIntent(PendingIntent.getActivity(context, 0, detailsIntent, PendingIntent.FLAG_CANCEL_CURRENT))
.setCategory(NotificationCompat.CATEGORY_ERROR) .setCategory(NotificationCompat.CATEGORY_ERROR);
.setLocalOnly(true);
try { try {
String[] phases = context.getResources().getStringArray(R.array.sync_error_phases); String[] phases = context.getResources().getStringArray(R.array.sync_error_phases);

View File

@ -11,6 +11,7 @@ package at.bitfire.davdroid.ui;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.accounts.OnAccountsUpdateListener; import android.accounts.OnAccountsUpdateListener;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -103,6 +104,7 @@ public class AccountListFragment extends ListFragment implements LoaderManager.L
} }
@Override @Override
@SuppressLint("MissingPermission")
public Account[] loadInBackground() { public Account[] loadInBackground() {
return accountManager.getAccountsByType(Constants.ACCOUNT_TYPE); return accountManager.getAccountsByType(Constants.ACCOUNT_TYPE);
} }

View File

@ -10,6 +10,7 @@ package at.bitfire.davdroid.ui;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.app.LoaderManager; import android.app.LoaderManager;
import android.content.AsyncTaskLoader; import android.content.AsyncTaskLoader;
import android.content.ContentResolver; import android.content.ContentResolver;
@ -144,6 +145,7 @@ public class DebugInfoActivity extends AppCompatActivity implements LoaderManage
} }
@Override @Override
@SuppressLint("MissingPermission")
public String loadInBackground() { public String loadInBackground() {
Throwable throwable = null; Throwable throwable = null;
String logs = null, String logs = null,

View File

@ -9,12 +9,12 @@
package at.bitfire.davdroid.ui; package at.bitfire.davdroid.ui;
import android.Manifest; import android.Manifest;
import android.app.NotificationManager;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.view.View; import android.view.View;
@ -63,7 +63,7 @@ public class PermissionsActivity extends AppCompatActivity {
} }
if (!noCalendarPermissions && !noContactsPermissions && !noTaskPermissions) { if (!noCalendarPermissions && !noContactsPermissions && !noTaskPermissions) {
NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); NotificationManagerCompat nm = NotificationManagerCompat.from(this);
nm.cancel(Constants.NOTIFICATION_PERMISSIONS); nm.cancel(Constants.NOTIFICATION_PERMISSIONS);
finish(); finish();

View File

@ -8,6 +8,8 @@
package at.bitfire.davdroid.ui; package at.bitfire.davdroid.ui;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
@ -88,6 +90,8 @@ public class StartupDialogFragment extends DialogFragment {
@NonNull @NonNull
@Override @Override
@TargetApi(Build.VERSION_CODES.M)
@SuppressLint("BatteryLife")
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
setCancelable(false); setCancelable(false);

View File

@ -13,6 +13,5 @@
<dimen name="fab_margin">16dp</dimen> <dimen name="fab_margin">16dp</dimen>
<dimen name="nav_header_vertical_spacing">16dp</dimen> <dimen name="nav_header_vertical_spacing">16dp</dimen>
<dimen name="nav_header_height">160dp</dimen>
</resources> </resources>

View File

@ -75,7 +75,7 @@
<string name="app_settings_security">Security</string> <string name="app_settings_security">Security</string>
<string name="app_settings_distrust_system_certs">Distrust system certificates</string> <string name="app_settings_distrust_system_certs">Distrust system certificates</string>
<string name="app_settings_distrust_system_certs_on">System and user-added CAs won\'t be trusted</string> <string name="app_settings_distrust_system_certs_on">System and user-added CAs won\'t be trusted</string>
<string name="app_settings_distrust_system_certs_off">System and user-added CAs will be trusted</string> <string name="app_settings_distrust_system_certs_off">System and user-added CAs will be trusted (recommended)</string>
<string name="app_settings_reset_certificates">Reset (un)trusted certificates</string> <string name="app_settings_reset_certificates">Reset (un)trusted certificates</string>
<string name="app_settings_reset_certificates_summary">Resets trust of all custom certificates</string> <string name="app_settings_reset_certificates_summary">Resets trust of all custom certificates</string>
<string name="app_settings_reset_certificates_success">All custom certificates have been cleared</string> <string name="app_settings_reset_certificates_success">All custom certificates have been cleared</string>

@ -1 +1 @@
Subproject commit c342cbd81185d7f6bd2cd25eea55bd0ecf94c1cc Subproject commit ec4e75dc9141e97aff250116120b631e0046a962