diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-05-17 18:07:13 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2021-05-17 20:14:16 +0300 |
commit | 25250701c634f4b5e1ee7746b809b92321180ff8 (patch) | |
tree | 40eb32e54d0a667b20fdbbef87578247932ea6b9 /app/src/main/java/it | |
parent | fbaf93865d721862873472ac0388b87f67002382 (diff) |
Enhance testability by using Singleton pattern for ApiProvider
Diffstat (limited to 'app/src/main/java/it')
7 files changed, 43 insertions, 25 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java index 37a0bde6..994c652c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java @@ -121,7 +121,7 @@ public class ImportAccountActivity extends AppCompatActivity { }); } catch (Throwable t) { t.printStackTrace(); - ApiProvider.invalidateAPICache(ssoAccount); + ApiProvider.getInstance().invalidateAPICache(ssoAccount); SingleAccountHelper.setCurrentAccount(this, null); runOnUiThread(() -> { restoreCleanState(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index 26ae3548..ef4ae2fc 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -674,7 +674,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A } }); } catch (Throwable e) { - ApiProvider.invalidateAPICache(ssoAccount); + ApiProvider.getInstance().invalidateAPICache(ssoAccount); // Happens when importing an already existing account the second time if (e instanceof TokenMismatchException && mainViewModel.getLocalAccountByAccountName(ssoAccount.name) != null) { Log.w(TAG, "Received " + TokenMismatchException.class.getSimpleName() + " and the given ssoAccount.name (" + ssoAccount.name + ") does already exist in the database. Assume that this account has already been imported."); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java index b1bca215..242dc83f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/ApiProvider.java @@ -34,19 +34,32 @@ import retrofit2.Retrofit; @WorkerThread public class ApiProvider { - private static final String TAG = ApiProvider.class.getSimpleName(); + private static ApiProvider instance; - private static final String API_ENDPOINT_OCS = "/ocs/v2.php/cloud/"; + private final static String TAG = ApiProvider.class.getSimpleName(); - private static final Map<String, NextcloudAPI> API_CACHE = new HashMap<>(); + private final static String API_ENDPOINT_OCS = "/ocs/v2.php/cloud/"; - private static final Map<String, OcsAPI> API_CACHE_OCS = new HashMap<>(); - private static final Map<String, NotesAPI> API_CACHE_NOTES = new HashMap<>(); + private final Map<String, NextcloudAPI> API_CACHE = new HashMap<>(); + + private final Map<String, OcsAPI> API_CACHE_OCS = new HashMap<>(); + private final Map<String, NotesAPI> API_CACHE_NOTES = new HashMap<>(); + + public static synchronized ApiProvider getInstance() { + if (instance == null) { + instance = new ApiProvider(); + } + return instance; + } + + private ApiProvider() { + // Singleton + } /** * An {@link OcsAPI} currently shares the {@link Gson} configuration with the {@link NotesAPI} and therefore divides all {@link Calendar} milliseconds by 1000 while serializing and multiplies values by 1000 during deserialization. */ - public static synchronized OcsAPI getOcsAPI(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount) { + public synchronized OcsAPI getOcsAPI(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount) { if (API_CACHE_OCS.containsKey(ssoAccount.name)) { return API_CACHE_OCS.get(ssoAccount.name); } @@ -58,7 +71,7 @@ public class ApiProvider { /** * In case the {@param preferredApiVersion} changes, call {@link #invalidateAPICache(SingleSignOnAccount)} or {@link #invalidateAPICache()} to make sure that this call returns a {@link NotesAPI} that uses the correct compatibility layer. */ - public static synchronized NotesAPI getNotesAPI(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount, @Nullable ApiVersion preferredApiVersion) { + public synchronized NotesAPI getNotesAPI(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount, @Nullable ApiVersion preferredApiVersion) { if (API_CACHE_NOTES.containsKey(ssoAccount.name)) { return API_CACHE_NOTES.get(ssoAccount.name); } @@ -67,7 +80,7 @@ public class ApiProvider { return notesAPI; } - private static synchronized NextcloudAPI getNextcloudAPI(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount) { + private synchronized NextcloudAPI getNextcloudAPI(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount) { if (API_CACHE.containsKey(ssoAccount.name)) { return API_CACHE.get(ssoAccount.name); } else { @@ -104,7 +117,7 @@ public class ApiProvider { * * @param ssoAccount the ssoAccount for which the API cache should be cleared. */ - public static synchronized void invalidateAPICache(@NonNull SingleSignOnAccount ssoAccount) { + public synchronized void invalidateAPICache(@NonNull SingleSignOnAccount ssoAccount) { Log.v(TAG, "Invalidating API cache for " + ssoAccount.name); if (API_CACHE.containsKey(ssoAccount.name)) { final NextcloudAPI nextcloudAPI = API_CACHE.get(ssoAccount.name); @@ -120,7 +133,7 @@ public class ApiProvider { /** * Invalidates the whole API cache for all accounts */ - public static synchronized void invalidateAPICache() { + public synchronized void invalidateAPICache() { for (String key : API_CACHE.keySet()) { Log.v(TAG, "Invalidating API cache for " + key); if (API_CACHE.containsKey(key)) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/CapabilitiesClient.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/CapabilitiesClient.java index b2dd051b..3f27b820 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/CapabilitiesClient.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/CapabilitiesClient.java @@ -27,7 +27,7 @@ public class CapabilitiesClient { @WorkerThread public static Capabilities getCapabilities(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount, @Nullable String lastETag) throws Throwable { - final OcsAPI ocsAPI = ApiProvider.getOcsAPI(context, ssoAccount); + final OcsAPI ocsAPI = ApiProvider.getInstance().getOcsAPI(context, ssoAccount); try { final ParsedResponse<OcsResponse<Capabilities>> response = ocsAPI.getCapabilities(lastETag).blockingSingle(); final Capabilities capabilities = response.getResponse().ocs.data; @@ -51,7 +51,7 @@ public class CapabilitiesClient { @WorkerThread @Nullable public static String getDisplayName(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount) { - final OcsAPI ocsAPI = ApiProvider.getOcsAPI(context, ssoAccount); + final OcsAPI ocsAPI = ApiProvider.getInstance().getOcsAPI(context, ssoAccount); try { final Response<OcsResponse<OcsUser>> userResponse = ocsAPI.getUser(ssoAccount.userId).execute(); if (userResponse.isSuccessful()) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java index 9e553be1..c9598ba6 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java @@ -81,6 +81,7 @@ public class NotesRepository { private static NotesRepository instance; + private final ApiProvider apiProvider; private final ExecutorService executor; private final Context context; private final NotesDatabase db; @@ -134,15 +135,16 @@ public class NotesRepository { public static synchronized NotesRepository getInstance(@NonNull Context context) { if (instance == null) { - instance = new NotesRepository(context, NotesDatabase.getInstance(context.getApplicationContext()), Executors.newCachedThreadPool()); + instance = new NotesRepository(context, NotesDatabase.getInstance(context.getApplicationContext()), Executors.newCachedThreadPool(), ApiProvider.getInstance()); } return instance; } - private NotesRepository(@NonNull final Context context, @NonNull final NotesDatabase db, @NonNull final ExecutorService executor) { + private NotesRepository(@NonNull final Context context, @NonNull final NotesDatabase db, @NonNull final ExecutorService executor, @NonNull ApiProvider apiProvider) { this.context = context.getApplicationContext(); this.db = db; this.executor = executor; + this.apiProvider = apiProvider; this.defaultNonEmptyTitle = NoteUtil.generateNonEmptyNoteTitle("", this.context); this.syncOnlyOnWifiKey = context.getApplicationContext().getResources().getString(R.string.pref_key_wifi_only); @@ -177,10 +179,10 @@ public class NotesRepository { @WorkerThread public void deleteAccount(@NonNull Account account) { try { - ApiProvider.invalidateAPICache(AccountImporter.getSingleSignOnAccount(context, account.getAccountName())); + apiProvider.invalidateAPICache(AccountImporter.getSingleSignOnAccount(context, account.getAccountName())); } catch (NextcloudFilesAppAccountNotFoundException e) { e.printStackTrace(); - ApiProvider.invalidateAPICache(); + apiProvider.invalidateAPICache(); } db.getAccountDao().deleteAccount(account); @@ -582,7 +584,7 @@ public class NotesRepository { Log.d(TAG, "ApiVersion not updated, because it did not change"); } else if (updatedRows == 1) { Log.i(TAG, "Updated apiVersion to \"" + raw + "\" for accountId = " + accountId); - ApiProvider.invalidateAPICache(); + apiProvider.invalidateAPICache(); } else { Log.w(TAG, "Updated " + updatedRows + " but expected only 1 for accountId = " + accountId + " and apiVersion = \"" + raw + "\""); } @@ -779,7 +781,7 @@ public class NotesRepository { syncActive.put(account.getId(), true); try { Log.d(TAG, "... starting now"); - final NotesServerSyncTask syncTask = new NotesServerSyncTask(context, this, account, onlyLocalChanges) { + final NotesServerSyncTask syncTask = new NotesServerSyncTask(context, this, account, onlyLocalChanges, apiProvider) { @Override void onPreExecute() { syncStatus.postValue(true); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java index 2a1855ce..4b572bc8 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java @@ -52,6 +52,8 @@ abstract class NotesServerSyncTask extends Thread { private NotesAPI notesAPI; @NonNull + private final ApiProvider apiProvider; + @NonNull private final Context context; @NonNull private final NotesRepository repo; @@ -65,13 +67,14 @@ abstract class NotesServerSyncTask extends Thread { @NonNull protected final ArrayList<Throwable> exceptions = new ArrayList<>(); - NotesServerSyncTask(@NonNull Context context, @NonNull NotesRepository repo, @NonNull Account localAccount, boolean onlyLocalChanges) throws NextcloudFilesAppAccountNotFoundException { + NotesServerSyncTask(@NonNull Context context, @NonNull NotesRepository repo, @NonNull Account localAccount, boolean onlyLocalChanges, @NonNull ApiProvider apiProvider) throws NextcloudFilesAppAccountNotFoundException { super(TAG); this.context = context; this.repo = repo; this.localAccount = localAccount; this.ssoAccount = AccountImporter.getSingleSignOnAccount(context, localAccount.getAccountName()); this.onlyLocalChanges = onlyLocalChanges; + this.apiProvider = apiProvider; } void addCallbacks(Account account, List<ISyncCallback> callbacks) { @@ -82,7 +85,7 @@ abstract class NotesServerSyncTask extends Thread { public void run() { onPreExecute(); - notesAPI = ApiProvider.getNotesAPI(context, ssoAccount, ApiVersionUtil.getPreferredApiVersion(localAccount.getApiVersion())); + notesAPI = apiProvider.getNotesAPI(context, ssoAccount, ApiVersionUtil.getPreferredApiVersion(localAccount.getApiVersion())); Log.i(TAG, "STARTING SYNCHRONIZATION"); @@ -176,7 +179,7 @@ abstract class NotesServerSyncTask extends Thread { } } catch (Exception e) { if (e instanceof TokenMismatchException) { - ApiProvider.invalidateAPICache(ssoAccount); + apiProvider.invalidateAPICache(ssoAccount); } exceptions.add(e); success = false; @@ -267,7 +270,7 @@ abstract class NotesServerSyncTask extends Thread { return true; } } else if (cause.getClass() == NextcloudApiNotRespondingException.class || cause instanceof NextcloudApiNotRespondingException) { - ApiProvider.invalidateAPICache(ssoAccount); + apiProvider.invalidateAPICache(ssoAccount); } } exceptions.add(t); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_22_23.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_22_23.java index 4addcf29..b6a7494b 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_22_23.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_22_23.java @@ -57,7 +57,7 @@ public class Migration_22_23 extends Migration { db.update("ACCOUNT", OnConflictStrategy.REPLACE, values, "ID = ?", new String[]{String.valueOf(cursor.getLong(COLUMN_POSITION_ID))}); } cursor.close(); - ApiProvider.invalidateAPICache(); + ApiProvider.getInstance().invalidateAPICache(); } @Nullable |