diff --git a/findbugs-filter.xml b/findbugs-filter.xml index c9bfceb2fb..8b25d4aff8 100644 --- a/findbugs-filter.xml +++ b/findbugs-filter.xml @@ -22,4 +22,7 @@ + + + diff --git a/scripts/analysis/findbugs-results.txt b/scripts/analysis/findbugs-results.txt index 4af7c92223..2ae9f6c7cb 100644 --- a/scripts/analysis/findbugs-results.txt +++ b/scripts/analysis/findbugs-results.txt @@ -1 +1 @@ -470 \ No newline at end of file +441 \ No newline at end of file diff --git a/src/generic/java/com/nextcloud/client/di/VariantComponentsModule.java b/src/generic/java/com/nextcloud/client/di/VariantComponentsModule.java new file mode 100644 index 0000000000..6afc823f44 --- /dev/null +++ b/src/generic/java/com/nextcloud/client/di/VariantComponentsModule.java @@ -0,0 +1,26 @@ +/* + * Nextcloud Android client application + * + * @author Chris Narkiewicz + * Copyright (C) 2919 Chris Narkiewicz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ +package com.nextcloud.client.di; + +import dagger.Module; + +@Module +abstract class VariantComponentsModule { +} diff --git a/src/generic/java/com/owncloud/android/utils/PushUtils.java b/src/generic/java/com/owncloud/android/utils/PushUtils.java index f9929f316c..3f5d2ef888 100644 --- a/src/generic/java/com/owncloud/android/utils/PushUtils.java +++ b/src/generic/java/com/owncloud/android/utils/PushUtils.java @@ -2,7 +2,9 @@ * Nextcloud Android client application * * @author Mario Danic + * @author Chris Narkiewicz * Copyright (C) 2017 Mario Danic + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -22,6 +24,7 @@ package com.owncloud.android.utils; import android.content.Context; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.MainApp; import com.owncloud.android.datamodel.SignatureVerification; import com.nextcloud.client.preferences.AppPreferencesImpl; @@ -34,11 +37,11 @@ public final class PushUtils { private PushUtils() { } - public static void pushRegistrationToServer(final String pushToken) { + public static void pushRegistrationToServer(final UserAccountManager accountManager, final String pushToken) { // do nothing } - public static void reinitKeys() { + public static void reinitKeys(UserAccountManager accountManager) { Context context = MainApp.getAppContext(); AppPreferencesImpl.fromContext(context).setKeysReInitEnabled(); } @@ -47,7 +50,12 @@ public final class PushUtils { return null; } - public static SignatureVerification verifySignature(Context context, byte[] signatureBytes, byte[] subjectBytes) { + public static SignatureVerification verifySignature( + final Context context, + final UserAccountManager accountManager, + final byte[] signatureBytes, + final byte[] subjectBytes + ) { return null; } diff --git a/src/gplay/java/com/nextcloud/client/di/VariantComponentsModule.java b/src/gplay/java/com/nextcloud/client/di/VariantComponentsModule.java new file mode 100644 index 0000000000..09272ea665 --- /dev/null +++ b/src/gplay/java/com/nextcloud/client/di/VariantComponentsModule.java @@ -0,0 +1,30 @@ +/* + * Nextcloud Android client application + * + * @author Chris Narkiewicz + * Copyright (C) 2919 Chris Narkiewicz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ +package com.nextcloud.client.di; + +import com.owncloud.android.services.firebase.NCFirebaseInstanceIDService; + +import dagger.Module; +import dagger.android.ContributesAndroidInjector; + +@Module +abstract class VariantComponentsModule { + @ContributesAndroidInjector abstract NCFirebaseInstanceIDService ncFirebaseInstanceIDService(); +} diff --git a/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java b/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java index 21ac0565ae..de6371d46c 100644 --- a/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java +++ b/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseInstanceIDService.java @@ -23,19 +23,25 @@ import android.text.TextUtils; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.preferences.AppPreferences; -import com.nextcloud.client.preferences.AppPreferencesImpl; import com.owncloud.android.R; import com.owncloud.android.utils.PushUtils; +import javax.inject.Inject; + +import dagger.android.AndroidInjection; + public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { - private AppPreferences preferences; + + @Inject AppPreferences preferences; + @Inject UserAccountManager accountManager; @Override public void onCreate() { super.onCreate(); - preferences = AppPreferencesImpl.fromContext(this); + AndroidInjection.inject(this); } @Override @@ -43,7 +49,7 @@ public class NCFirebaseInstanceIDService extends FirebaseInstanceIdService { //You can implement this method to store the token on your server if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { preferences.setPushToken(FirebaseInstanceId.getInstance().getToken()); - PushUtils.pushRegistrationToServer(preferences.getPushToken()); + PushUtils.pushRegistrationToServer(accountManager, preferences.getPushToken()); } } } diff --git a/src/gplay/java/com/owncloud/android/utils/PushUtils.java b/src/gplay/java/com/owncloud/android/utils/PushUtils.java index 0890f0d286..fefb666f9d 100644 --- a/src/gplay/java/com/owncloud/android/utils/PushUtils.java +++ b/src/gplay/java/com/owncloud/android/utils/PushUtils.java @@ -2,7 +2,9 @@ * Nextcloud Android client application * * @author Mario Danic + * @author Chris Narkiewicz * Copyright (C) 2017-2018 Mario Danic + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -29,6 +31,7 @@ import android.util.Base64; import android.util.Log; import com.google.gson.Gson; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.AppPreferencesImpl; import com.owncloud.android.MainApp; @@ -194,7 +197,7 @@ public final class PushUtils { } } - public static void pushRegistrationToServer(final String token) { + public static void pushRegistrationToServer(final UserAccountManager accountManager, final String token) { arbitraryDataProvider = new ArbitraryDataProvider(MainApp.getAppContext().getContentResolver()); if (!TextUtils.isEmpty(MainApp.getAppContext().getResources().getString(R.string.push_server_url)) && @@ -213,7 +216,7 @@ public final class PushUtils { String providerValue; PushConfigurationState accountPushData = null; Gson gson = new Gson(); - for (Account account : AccountUtils.getAccounts(context)) { + for (Account account : accountManager.getAccounts()) { providerValue = arbitraryDataProvider.getValue(account, KEY_PUSH); if (!TextUtils.isEmpty(providerValue)) { accountPushData = gson.fromJson(providerValue, @@ -359,9 +362,9 @@ public final class PushUtils { return -1; } - public static void reinitKeys() { + public static void reinitKeys(final UserAccountManager accountManager) { Context context = MainApp.getAppContext(); - Account[] accounts = AccountUtils.getAccounts(context); + Account[] accounts = accountManager.getAccounts(); for (Account account : accounts) { deleteRegistrationForAccount(account); } @@ -375,7 +378,7 @@ public final class PushUtils { AppPreferences preferences = AppPreferencesImpl.fromContext(context); String pushToken = preferences.getPushToken(); - pushRegistrationToServer(pushToken); + pushRegistrationToServer(accountManager, pushToken); preferences.setKeysReInitEnabled(); } @@ -411,13 +414,18 @@ public final class PushUtils { } } - public static SignatureVerification verifySignature(Context context, byte[] signatureBytes, byte[] subjectBytes) { + public static SignatureVerification verifySignature( + final Context context, + final UserAccountManager accountManager, + final byte[] signatureBytes, + final byte[] subjectBytes + ) { Signature signature = null; PublicKey publicKey; SignatureVerification signatureVerification = new SignatureVerification(); signatureVerification.setSignatureValid(false); - Account[] accounts = AccountUtils.getAccounts(context); + Account[] accounts = accountManager.getAccounts(); ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(context.getContentResolver()); String arbitraryValue; diff --git a/src/main/java/com/nextcloud/client/account/UserAccountManager.java b/src/main/java/com/nextcloud/client/account/UserAccountManager.java new file mode 100644 index 0000000000..d534ba746b --- /dev/null +++ b/src/main/java/com/nextcloud/client/account/UserAccountManager.java @@ -0,0 +1,65 @@ +/* + * Nextcloud Android client application + * + * @author Chris Narkiewicz + * Copyright (C) 2019 Chris Narkiewicz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ +package com.nextcloud.client.account; + +import android.accounts.Account; + +import androidx.annotation.NonNull; + +public interface UserAccountManager { + + int ACCOUNT_VERSION = 1; + int ACCOUNT_VERSION_WITH_PROPER_ID = 2; + String ACCOUNT_USES_STANDARD_PASSWORD = "ACCOUNT_USES_STANDARD_PASSWORD"; + + /** + * Get configured NextCloud's user accounts. + * + * @return Array of accounts or empty array, if accounts are not configured. + */ + @NonNull + Account[] getAccounts(); + + /** + * Update the accounts in AccountManager to meet the current + * version of accounts expected by the app, if needed. + *

+ * Introduced to handle a change in the structure of stored account names + * needed to allow different Nextcloud servers in the same domain, but not in + * the same path. + */ + void updateAccountVersion(); + + /** + * Extract username from account. + * + * Full account name is in form of "username@nextcloud.domain". + * + * @param account Account instance + * @return User name (without domain) or null, if name cannot be extracted. + */ + static String getUsername(Account account) { + if (account != null && account.name != null) { + return account.name.substring(0, account.name.lastIndexOf('@')); + } else { + return null; + } + } +} diff --git a/src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java b/src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java new file mode 100644 index 0000000000..946be0674c --- /dev/null +++ b/src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java @@ -0,0 +1,196 @@ +/* + * Nextcloud Android client application + * + * @author Chris Narkiewicz + * Copyright (C) 2019 Chris Narkiewicz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ + +package com.nextcloud.client.account; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.content.Context; +import android.net.Uri; + +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.lib.common.OwnCloudAccount; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.UserInfo; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation; + +import javax.inject.Inject; + +import androidx.annotation.NonNull; + +public class UserAccountManagerImpl implements UserAccountManager { + + private static final String TAG = AccountUtils.class.getSimpleName(); + private static final String PREF_SELECT_OC_ACCOUNT = "select_oc_account"; + + private Context context; + private AccountManager accountManager; + + @Inject + public UserAccountManagerImpl(Context context, AccountManager accountManager) { + this.context = context; + this.accountManager = accountManager; + } + + @Override + @NonNull + public Account[] getAccounts() { + return accountManager.getAccountsByType(getAccountType()); + } + + public void updateAccountVersion() { + Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(context); + + if (currentAccount == null) { + return; + } + + final String currentAccountVersion = accountManager.getUserData(currentAccount, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_OC_ACCOUNT_VERSION); + final boolean needsUpdate = !String.valueOf(ACCOUNT_VERSION_WITH_PROPER_ID).equalsIgnoreCase(currentAccountVersion); + if (!needsUpdate) { + return; + } + + Log_OC.i(TAG, "Upgrading accounts to account version #" + ACCOUNT_VERSION_WITH_PROPER_ID); + + Account[] ocAccounts = accountManager.getAccountsByType(MainApp.getAccountType(context)); + String serverUrl; + String username; + String displayName; + String newAccountName; + Account newAccount; + GetRemoteUserInfoOperation remoteUserNameOperation = new GetRemoteUserInfoOperation(); + + for (Account account : ocAccounts) { + // build new account name + serverUrl = accountManager.getUserData(account, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_OC_BASE_URL); + + // update user name + try { + OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); + OwnCloudClient client = OwnCloudClientManagerFactory.getDefaultSingleton() + .getClientFor(ocAccount, context); + + RemoteOperationResult result = remoteUserNameOperation.execute(client); + + if (result.isSuccess()) { + UserInfo userInfo = (UserInfo) result.getData().get(0); + username = userInfo.id; + displayName = userInfo.displayName; + } else { + // skip account, try it next time + Log_OC.e(TAG, "Error while getting username for account: " + account.name); + continue; + } + } catch (Exception e) { + Log_OC.e(TAG, "Error while getting username: " + e.getMessage()); + continue; + } + + newAccountName = com.owncloud.android.lib.common.accounts.AccountUtils. + buildAccountName(Uri.parse(serverUrl), username); + + // migrate to a new account, if needed + if (!newAccountName.equals(account.name)) { + newAccount = migrateAccount(context, currentAccount, accountManager, serverUrl, newAccountName, + account); + + } else { + // servers which base URL is in the root of their domain need no change + Log_OC.d(TAG, account.name + " needs no upgrade "); + newAccount = account; + } + + accountManager.setUserData(newAccount, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_DISPLAY_NAME, displayName); + accountManager.setUserData(newAccount, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_USER_ID, username); + + // at least, upgrade account version + Log_OC.d(TAG, "Setting version " + ACCOUNT_VERSION_WITH_PROPER_ID + " to " + newAccountName); + accountManager.setUserData(newAccount, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_OC_ACCOUNT_VERSION, + Integer.toString(ACCOUNT_VERSION_WITH_PROPER_ID)); + } + } + + @NonNull + private Account migrateAccount(Context context, Account currentAccount, AccountManager accountMgr, + String serverUrl, String newAccountName, Account account) { + + Log_OC.d(TAG, "Upgrading " + account.name + " to " + newAccountName); + + // create the new account + Account newAccount = new Account(newAccountName, MainApp.getAccountType(context)); + String password = accountMgr.getPassword(account); + accountMgr.addAccountExplicitly(newAccount, (password != null) ? password : "", null); + + // copy base URL + accountMgr.setUserData(newAccount, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_OC_BASE_URL, serverUrl); + + // copy server version + accountMgr.setUserData( + newAccount, + com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_OC_VERSION, + accountMgr.getUserData(account, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_OC_VERSION) + ); + + // copy cookies + accountMgr.setUserData( + newAccount, + com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_COOKIES, + accountMgr.getUserData(account, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_COOKIES) + ); + + // copy type of authentication + final String isSamlStr = accountMgr.getUserData(account, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_SUPPORTS_SAML_WEB_SSO); + if (Boolean.parseBoolean(isSamlStr)) { + accountMgr.setUserData(newAccount, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_SUPPORTS_SAML_WEB_SSO, "TRUE"); + } + + final String isOauthStr = accountMgr.getUserData(account, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_SUPPORTS_OAUTH2); + if (Boolean.parseBoolean(isOauthStr)) { + accountMgr.setUserData(newAccount, com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_SUPPORTS_OAUTH2, "TRUE"); + } + + /* TODO - study if it's possible to run this method in a background thread to copy the authToken + if (isOAuth || isSaml) { + accountMgr.setAuthToken(newAccount, mAuthTokenType, mAuthToken); + } + */ + + // don't forget the account saved in preferences as the current one + if (currentAccount.name.equals(account.name)) { + AccountUtils.setCurrentOwnCloudAccount(context, newAccountName); + } + + // remove the old account + accountMgr.removeAccount(account, null, null); + + // will assume it succeeds, not a big deal otherwise + return newAccount; + } + + private String getAccountType() { + return context.getString(R.string.account_type); + } +} diff --git a/src/main/java/com/nextcloud/client/di/AppModule.java b/src/main/java/com/nextcloud/client/di/AppModule.java index 249c2334c7..5ce952dec1 100644 --- a/src/main/java/com/nextcloud/client/di/AppModule.java +++ b/src/main/java/com/nextcloud/client/di/AppModule.java @@ -20,25 +20,38 @@ package com.nextcloud.client.di; +import android.accounts.AccountManager; import android.app.Application; import android.content.Context; +import com.nextcloud.client.account.UserAccountManager; +import com.nextcloud.client.account.UserAccountManagerImpl; import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.AppPreferencesImpl; import dagger.Module; import dagger.Provides; -@Module(includes = {ComponentsModule.class}) +@Module(includes = {ComponentsModule.class, VariantComponentsModule.class}) class AppModule { + @Provides + AccountManager accountManager(Application application) { + return (AccountManager)application.getSystemService(Context.ACCOUNT_SERVICE); + } + @Provides Context context(Application application) { - return application.getApplicationContext(); + return application; } @Provides AppPreferences preferences(Application application) { return AppPreferencesImpl.fromContext(application); } + + @Provides + UserAccountManager userAccountManager(Context context, AccountManager accountManager) { + return new UserAccountManagerImpl(context, accountManager); + } } diff --git a/src/main/java/com/nextcloud/client/di/ComponentsModule.java b/src/main/java/com/nextcloud/client/di/ComponentsModule.java index 9b588aa563..8914b53d12 100644 --- a/src/main/java/com/nextcloud/client/di/ComponentsModule.java +++ b/src/main/java/com/nextcloud/client/di/ComponentsModule.java @@ -22,6 +22,8 @@ package com.nextcloud.client.di; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.authentication.DeepLinkLoginActivity; +import com.owncloud.android.files.BootupBroadcastReceiver; +import com.owncloud.android.providers.DocumentsStorageProvider; import com.owncloud.android.ui.activities.ActivitiesActivity; import com.owncloud.android.ui.activity.ConflictsResolveActivity; import com.owncloud.android.ui.activity.ContactsPreferenceActivity; @@ -109,4 +111,8 @@ abstract class ComponentsModule { @ContributesAndroidInjector abstract FileDetailFragment fileDetailFragment(); @ContributesAndroidInjector abstract LocalFileListFragment localFileListFragment(); @ContributesAndroidInjector abstract OCFileListFragment ocFileListFragment(); + + @ContributesAndroidInjector abstract BootupBroadcastReceiver bootupBroadcastReceiver(); + + @ContributesAndroidInjector abstract DocumentsStorageProvider documentsStorageProvider(); } diff --git a/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java b/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java index 2b8fd008f3..6c1e3af168 100644 --- a/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java +++ b/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java @@ -2,7 +2,9 @@ * ownCloud Android client application * * @author David A. Velasco + * @author Chris Narkiewicz Chris Narkiewicz * Copyright (C) 2016 ownCloud Inc. + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -71,14 +73,8 @@ public final class AppPreferencesImpl implements AppPreferences { private final SharedPreferences preferences; public static AppPreferences fromContext(Context context) { - Context appContext = context.getApplicationContext(); - SharedPreferences prefs = getDefaultSharedPreferences(appContext); - - return new AppPreferencesImpl(appContext, prefs); - } - - private static SharedPreferences getDefaultSharedPreferences(Context context) { - return android.preference.PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); + SharedPreferences prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(context); + return new AppPreferencesImpl(context, prefs); } AppPreferencesImpl(Context appContext, SharedPreferences preferences) { diff --git a/src/main/java/com/owncloud/android/MainApp.java b/src/main/java/com/owncloud/android/MainApp.java index 698f033525..a12e12a20a 100644 --- a/src/main/java/com/owncloud/android/MainApp.java +++ b/src/main/java/com/owncloud/android/MainApp.java @@ -3,7 +3,9 @@ * * @author masensio * @author David A. Velasco + * @author Chris Narkiewicz * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -26,6 +28,8 @@ import android.app.Activity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -40,6 +44,7 @@ import android.view.WindowManager; import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.ActivityInjector; import com.nextcloud.client.di.DaggerAppComponent; import com.nextcloud.client.preferences.AppPreferences; @@ -89,6 +94,8 @@ import androidx.multidex.MultiDexApplication; import dagger.android.AndroidInjector; import dagger.android.DispatchingAndroidInjector; import dagger.android.HasActivityInjector; +import dagger.android.HasBroadcastReceiverInjector; +import dagger.android.HasContentProviderInjector; import dagger.android.HasServiceInjector; import dagger.android.support.HasSupportFragmentInjector; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -105,7 +112,9 @@ import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFER public class MainApp extends MultiDexApplication implements HasActivityInjector, HasSupportFragmentInjector, - HasServiceInjector { + HasServiceInjector, + HasContentProviderInjector, + HasBroadcastReceiverInjector { public static final OwnCloudVersion OUTDATED_SERVER_VERSION = OwnCloudVersion.nextcloud_14; public static final OwnCloudVersion MINIMUM_SUPPORTED_SERVER_VERSION = OwnCloudVersion.nextcloud_12; @@ -137,24 +146,37 @@ public class MainApp extends MultiDexApplication implements @Inject DispatchingAndroidInjector dispatchingServiceInjector; + @Inject + DispatchingAndroidInjector dispatchingContentProviderInjector; + + @Inject + DispatchingAndroidInjector dispatchingBroadcastReceiverInjector; + + @Inject + UserAccountManager accountManager; + private PassCodeManager passCodeManager; @SuppressWarnings("unused") private boolean mBound; + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + DaggerAppComponent.builder() + .application(this) + .build() + .inject(this); + } + @SuppressFBWarnings("ST") @Override public void onCreate() { super.onCreate(); - DaggerAppComponent.builder() - .application(this) - .build() - .inject(this); - registerActivityLifecycleCallbacks(new ActivityInjector()); - JobManager.create(this).addJobCreator(new NCJobCreator()); + JobManager.create(this).addJobCreator(new NCJobCreator(getApplicationContext(), accountManager, preferences)); MainApp.mContext = getApplicationContext(); new SecurityUtils(); @@ -195,8 +217,8 @@ public class MainApp extends MultiDexApplication implements } } - initSyncOperations(); - initContactsBackup(); + initSyncOperations(accountManager); + initContactsBackup(accountManager); notificationChannels(); @@ -256,9 +278,9 @@ public class MainApp extends MultiDexApplication implements }); } - public static void initContactsBackup() { + public static void initContactsBackup(UserAccountManager accountManager) { ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(mContext.getContentResolver()); - Account[] accounts = AccountUtils.getAccounts(mContext); + Account[] accounts = accountManager.getAccounts(); for (Account account : accounts) { if (arbitraryDataProvider.getBooleanValue(account, PREFERENCE_CONTACTS_AUTOMATIC_BACKUP)) { @@ -320,7 +342,7 @@ public class MainApp extends MultiDexApplication implements } } - public static void initSyncOperations() { + public static void initSyncOperations(UserAccountManager accountManager) { updateToAutoUpload(); cleanOldEntries(); updateAutoUploadEntries(); @@ -338,17 +360,18 @@ public class MainApp extends MultiDexApplication implements initiateExistingAutoUploadEntries(); FilesSyncHelper.scheduleFilesSyncIfNeeded(mContext); - FilesSyncHelper.restartJobsIfNeeded(); + FilesSyncHelper.restartJobsIfNeeded(accountManager); FilesSyncHelper.scheduleOfflineSyncIfNeeded(); - ReceiversHelper.registerNetworkChangeReceiver(); + ReceiversHelper.registerNetworkChangeReceiver(accountManager); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - ReceiversHelper.registerPowerChangeReceiver(); + ReceiversHelper.registerPowerChangeReceiver(accountManager + ); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - ReceiversHelper.registerPowerSaveReceiver(); + ReceiversHelper.registerPowerSaveReceiver(accountManager); } } @@ -698,4 +721,14 @@ public class MainApp extends MultiDexApplication implements public AndroidInjector serviceInjector() { return dispatchingServiceInjector; } + + @Override + public AndroidInjector contentProviderInjector() { + return dispatchingContentProviderInjector; + } + + @Override + public AndroidInjector broadcastReceiverInjector() { + return dispatchingBroadcastReceiverInjector; + } } diff --git a/src/main/java/com/owncloud/android/authentication/AccountUtils.java b/src/main/java/com/owncloud/android/authentication/AccountUtils.java index 5ffb8ec759..893157f51b 100644 --- a/src/main/java/com/owncloud/android/authentication/AccountUtils.java +++ b/src/main/java/com/owncloud/android/authentication/AccountUtils.java @@ -103,7 +103,7 @@ public final class AccountUtils { return defaultAccount; } - public static Account[] getAccounts(Context context) { + private static Account[] getAccounts(Context context) { AccountManager accountManager = AccountManager.get(context); return accountManager.getAccountsByType(MainApp.getAccountType(context)); } @@ -131,20 +131,6 @@ public final class AccountUtils { return false; } - /** - * returns the user's name based on the account name. - * - * @param accountName the account name - * @return the user's name - */ - public static String getAccountUsername(String accountName) { - if (accountName != null) { - return accountName.substring(0, accountName.lastIndexOf('@')); - } else { - return null; - } - } - /** * Returns owncloud account identified by accountName or null if it does not exist. * @param context the context @@ -212,141 +198,6 @@ public final class AccountUtils { return getServerVersion(account).isSearchSupported(); } - /** - * Update the accounts in AccountManager to meet the current version of accounts expected by the app, if needed. - *

- * Introduced to handle a change in the structure of stored account names needed to allow different OC servers in - * the same domain, but not in the same path. - * - * @param context Used to access the AccountManager. - */ - public static void updateAccountVersion(Context context) { - Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(context); - AccountManager accountMgr = AccountManager.get(context); - - if (currentAccount != null) { - String currentAccountVersion = accountMgr.getUserData(currentAccount, Constants.KEY_OC_ACCOUNT_VERSION); - - if (!String.valueOf(ACCOUNT_VERSION_WITH_PROPER_ID).equalsIgnoreCase(currentAccountVersion)) { - Log_OC.i(TAG, "Upgrading accounts to account version #" + ACCOUNT_VERSION_WITH_PROPER_ID); - - Account[] ocAccounts = accountMgr.getAccountsByType(MainApp.getAccountType(context)); - String serverUrl; - String username; - String displayName; - String newAccountName; - Account newAccount; - GetRemoteUserInfoOperation remoteUserNameOperation = new GetRemoteUserInfoOperation(); - - for (Account account : ocAccounts) { - // build new account name - serverUrl = accountMgr.getUserData(account, Constants.KEY_OC_BASE_URL); - - // update user name - try { - OwnCloudAccount ocAccount = new OwnCloudAccount(account, context); - OwnCloudClient client = OwnCloudClientManagerFactory.getDefaultSingleton() - .getClientFor(ocAccount, context); - - RemoteOperationResult result = remoteUserNameOperation.execute(client); - - if (result.isSuccess()) { - UserInfo userInfo = (UserInfo) result.getData().get(0); - username = userInfo.id; - displayName = userInfo.displayName; - } else { - // skip account, try it next time - Log_OC.e(TAG, "Error while getting username for account: " + account.name); - continue; - } - } catch (Exception e) { - Log_OC.e(TAG, "Error while getting username: " + e.getMessage()); - continue; - } - - newAccountName = com.owncloud.android.lib.common.accounts.AccountUtils. - buildAccountName(Uri.parse(serverUrl), username); - - // migrate to a new account, if needed - if (!newAccountName.equals(account.name)) { - newAccount = migrateAccount(context, currentAccount, accountMgr, serverUrl, newAccountName, - account); - - } else { - // servers which base URL is in the root of their domain need no change - Log_OC.d(TAG, account.name + " needs no upgrade "); - newAccount = account; - } - - accountMgr.setUserData(newAccount, Constants.KEY_DISPLAY_NAME, displayName); - accountMgr.setUserData(newAccount, Constants.KEY_USER_ID, username); - - // at least, upgrade account version - Log_OC.d(TAG, "Setting version " + ACCOUNT_VERSION_WITH_PROPER_ID + " to " + newAccountName); - accountMgr.setUserData(newAccount, Constants.KEY_OC_ACCOUNT_VERSION, - Integer.toString(ACCOUNT_VERSION_WITH_PROPER_ID)); - } - } - } - } - - @NonNull - private static Account migrateAccount(Context context, Account currentAccount, AccountManager accountMgr, - String serverUrl, String newAccountName, Account account) { - - Log_OC.d(TAG, "Upgrading " + account.name + " to " + newAccountName); - - // create the new account - Account newAccount = new Account(newAccountName, MainApp.getAccountType(context)); - String password = accountMgr.getPassword(account); - accountMgr.addAccountExplicitly(newAccount, (password != null) ? password : "", null); - - // copy base URL - accountMgr.setUserData(newAccount, Constants.KEY_OC_BASE_URL, serverUrl); - - // copy server version - accountMgr.setUserData( - newAccount, - Constants.KEY_OC_VERSION, - accountMgr.getUserData(account, Constants.KEY_OC_VERSION) - ); - - // copy cookies - accountMgr.setUserData( - newAccount, - Constants.KEY_COOKIES, - accountMgr.getUserData(account, Constants.KEY_COOKIES) - ); - - // copy type of authentication - final String isSamlStr = accountMgr.getUserData(account, Constants.KEY_SUPPORTS_SAML_WEB_SSO); - if (Boolean.parseBoolean(isSamlStr)) { - accountMgr.setUserData(newAccount, Constants.KEY_SUPPORTS_SAML_WEB_SSO, "TRUE"); - } - - final String isOauthStr = accountMgr.getUserData(account, Constants.KEY_SUPPORTS_OAUTH2); - if (Boolean.parseBoolean(isOauthStr)) { - accountMgr.setUserData(newAccount, Constants.KEY_SUPPORTS_OAUTH2, "TRUE"); - } - - /* TODO - study if it's possible to run this method in a background thread to copy the authToken - if (isOAuth || isSaml) { - accountMgr.setAuthToken(newAccount, mAuthTokenType, mAuthToken); - } - */ - - // don't forget the account saved in preferences as the current one - if (currentAccount.name.equals(account.name)) { - AccountUtils.setCurrentOwnCloudAccount(context, newAccountName); - } - - // remove the old account - accountMgr.removeAccount(account, null, null); - - // will assume it succeeds, not a big deal otherwise - return newAccount; - } - /** * Checks if an account owns the file (file's ownerId is the same as account name) * @param file File to check diff --git a/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 8ff021501a..03e2bd5845 100644 --- a/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -3,7 +3,9 @@ * * @author Tobias Kaminsky * @author David A. Velasco + * @author Chris Narkiewicz * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -906,7 +908,7 @@ public final class ThumbnailsCacheManager { String newImageKey = "a_" + mUserId + "_" + mServerName + "_" + newETag; addBitmapToCache(newImageKey, avatar); } else { - return TextDrawable.createAvatar(mAccount.name, mAvatarRadius); + return TextDrawable.createAvatar(mAccount, mAvatarRadius); } break; @@ -923,7 +925,7 @@ public final class ThumbnailsCacheManager { } } catch (Exception e) { try { - return TextDrawable.createAvatar(mAccount.name, mAvatarRadius); + return TextDrawable.createAvatar(mAccount, mAvatarRadius); } catch (Exception e1) { Log_OC.e(TAG, "Error generating fallback avatar"); } @@ -936,7 +938,7 @@ public final class ThumbnailsCacheManager { if (avatar == null) { try { - return TextDrawable.createAvatar(mAccount.name, mAvatarRadius); + return TextDrawable.createAvatar(mAccount, mAvatarRadius); } catch (Exception e1) { return mResources.getDrawable(R.drawable.ic_user); } diff --git a/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java b/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java index 876760d825..0fb16bb11c 100644 --- a/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java +++ b/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java @@ -2,9 +2,11 @@ * ownCloud Android client application * * @author David A. Velasco + * @author Chris Narkiewicz * Copyright (C) 2012 Bartek Przybylski * Copyright (C) 2015 ownCloud Inc. * Copyright (C) 2017 Mario Danic + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -25,9 +27,14 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.MainApp; import com.owncloud.android.lib.common.utils.Log_OC; +import javax.inject.Inject; + +import dagger.android.AndroidInjection; + /** * App-registered receiver catching the broadcast intent reporting that the system was @@ -37,6 +44,9 @@ public class BootupBroadcastReceiver extends BroadcastReceiver { private static final String TAG = BootupBroadcastReceiver.class.getSimpleName(); + @Inject + UserAccountManager accountManager; + /** * Receives broadcast intent reporting that the system was just boot up. ** @@ -45,9 +55,11 @@ public class BootupBroadcastReceiver extends BroadcastReceiver { */ @Override public void onReceive(Context context, Intent intent) { + AndroidInjection.inject(this, context); + if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { - MainApp.initSyncOperations(); - MainApp.initContactsBackup(); + MainApp.initSyncOperations(accountManager); + MainApp.initContactsBackup(accountManager); } else { Log_OC.d(TAG, "Getting wrong intent: " + intent.getAction()); } diff --git a/src/main/java/com/owncloud/android/jobs/FilesSyncJob.java b/src/main/java/com/owncloud/android/jobs/FilesSyncJob.java index 2f3823aee6..b0349aeff1 100644 --- a/src/main/java/com/owncloud/android/jobs/FilesSyncJob.java +++ b/src/main/java/com/owncloud/android/jobs/FilesSyncJob.java @@ -2,8 +2,10 @@ * Nextcloud Android client application * * @author Mario Danic + * @author Chris Narkiewicz * Copyright (C) 2017 Mario Danic * Copyright (C) 2017 Nextcloud + * Copyright (C) 2919 Chris Narkiewicz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -31,7 +33,8 @@ import android.text.TextUtils; import com.evernote.android.job.Job; import com.evernote.android.job.util.support.PersistableBundleCompat; -import com.nextcloud.client.preferences.AppPreferencesImpl; +import com.nextcloud.client.account.UserAccountManager; +import com.nextcloud.client.preferences.AppPreferences; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; @@ -72,6 +75,14 @@ public class FilesSyncJob extends Job { public static final String OVERRIDE_POWER_SAVING = "overridePowerSaving"; private static final String WAKELOCK_TAG_SEPARATION = ":"; + private UserAccountManager userAccountManager; + private AppPreferences preferences; + + public FilesSyncJob(UserAccountManager userAccountManager, AppPreferences preferences) { + this.userAccountManager = userAccountManager; + this.preferences = preferences; + } + @NonNull @Override protected Result onRunJob(@NonNull Params params) { @@ -98,14 +109,14 @@ public class FilesSyncJob extends Job { boolean lightVersion = resources.getBoolean(R.bool.syncedFolder_light); final boolean skipCustom = bundle.getBoolean(SKIP_CUSTOM, false); - FilesSyncHelper.restartJobsIfNeeded(); - FilesSyncHelper.insertAllDBEntries(skipCustom); + FilesSyncHelper.restartJobsIfNeeded(userAccountManager); + FilesSyncHelper.insertAllDBEntries(preferences, skipCustom); // Create all the providers we'll need final ContentResolver contentResolver = context.getContentResolver(); final FilesystemDataProvider filesystemDataProvider = new FilesystemDataProvider(contentResolver); SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver, - AppPreferencesImpl.fromContext(context)); + preferences); Locale currentLocale = context.getResources().getConfiguration().locale; SimpleDateFormat sFormatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", currentLocale); diff --git a/src/main/java/com/owncloud/android/jobs/MediaFoldersDetectionJob.java b/src/main/java/com/owncloud/android/jobs/MediaFoldersDetectionJob.java index 56cdf1618f..e3e2ef7a77 100644 --- a/src/main/java/com/owncloud/android/jobs/MediaFoldersDetectionJob.java +++ b/src/main/java/com/owncloud/android/jobs/MediaFoldersDetectionJob.java @@ -3,8 +3,10 @@ * * @author Mario Danic * @author Andy Scherzinger + * @author Chris Narkiewicz * Copyright (C) 2018 Mario Danic * Copyright (C) 2018 Andy Scherzinger + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -36,10 +38,10 @@ import android.text.TextUtils; import com.evernote.android.job.Job; import com.google.gson.Gson; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.AppPreferencesImpl; import com.owncloud.android.R; -import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.MediaFolder; import com.owncloud.android.datamodel.MediaFoldersModel; @@ -72,8 +74,13 @@ public class MediaFoldersDetectionJob extends Job { private static final String DISABLE_DETECTION_CLICK = "DISABLE_DETECTION_CLICK"; + private UserAccountManager userAccountManager; private Random randomId = new Random(); + MediaFoldersDetectionJob(UserAccountManager accountManager) { + this.userAccountManager = accountManager; + } + @NonNull @Override protected Result onRunJob(@NonNull Params params) { @@ -114,7 +121,7 @@ public class MediaFoldersDetectionJob extends Job { videoMediaFolderPaths.removeAll(mediaFoldersModel.getVideoMediaFolders()); if (!imageMediaFolderPaths.isEmpty() || !videoMediaFolderPaths.isEmpty()) { - Account[] accounts = AccountUtils.getAccounts(getContext()); + Account[] accounts = userAccountManager.getAccounts(); List accountList = new ArrayList<>(); for (Account account : accounts) { if (!arbitraryDataProvider.getBooleanValue(account, ManageAccountsActivity.PENDING_FOR_REMOVAL)) { diff --git a/src/main/java/com/owncloud/android/jobs/NCJobCreator.java b/src/main/java/com/owncloud/android/jobs/NCJobCreator.java index a63b47485f..619fedad1a 100644 --- a/src/main/java/com/owncloud/android/jobs/NCJobCreator.java +++ b/src/main/java/com/owncloud/android/jobs/NCJobCreator.java @@ -2,8 +2,10 @@ * Nextcloud Android client application * * @author Mario Danic + * @author Chris Narkiewicz * Copyright (C) 2017 Mario Danic * Copyright (C) 2017 Nextcloud GmbH + * Copyright (C) 2019 Chris Narkiewicz *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -20,16 +22,33 @@ */ package com.owncloud.android.jobs; +import android.content.Context; + import com.evernote.android.job.Job; import com.evernote.android.job.JobCreator; +import com.nextcloud.client.account.UserAccountManager; +import com.nextcloud.client.preferences.AppPreferences; + +import androidx.annotation.NonNull; /** * Job creator for android-job */ public class NCJobCreator implements JobCreator { + + private final Context context; + private final UserAccountManager accountManager; + private final AppPreferences preferences; + + public NCJobCreator(Context context, UserAccountManager accountManager, AppPreferences preferences) { + this.context = context; + this.accountManager = accountManager; + this.preferences = preferences; + } + @Override - public Job create(String tag) { + public Job create(@NonNull String tag) { switch (tag) { case ContactsBackupJob.TAG: return new ContactsBackupJob(); @@ -38,13 +57,13 @@ public class NCJobCreator implements JobCreator { case AccountRemovalJob.TAG: return new AccountRemovalJob(); case FilesSyncJob.TAG: - return new FilesSyncJob(); + return new FilesSyncJob(accountManager, preferences); case OfflineSyncJob.TAG: - return new OfflineSyncJob(); + return new OfflineSyncJob(accountManager); case NotificationJob.TAG: - return new NotificationJob(); + return new NotificationJob(context, accountManager); case MediaFoldersDetectionJob.TAG: - return new MediaFoldersDetectionJob(); + return new MediaFoldersDetectionJob(accountManager); default: return null; } diff --git a/src/main/java/com/owncloud/android/jobs/NotificationJob.java b/src/main/java/com/owncloud/android/jobs/NotificationJob.java index d973efbd64..9e7ae04878 100644 --- a/src/main/java/com/owncloud/android/jobs/NotificationJob.java +++ b/src/main/java/com/owncloud/android/jobs/NotificationJob.java @@ -2,7 +2,9 @@ * Nextcloud application * * @author Mario Danic + * @author Chris Narkiewicz * Copyright (C) 2017-2018 Mario Danic + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,6 +40,7 @@ import android.util.Log; import com.evernote.android.job.Job; import com.evernote.android.job.util.support.PersistableBundleCompat; import com.google.gson.Gson; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.DecryptedPushMessage; @@ -92,6 +95,12 @@ public class NotificationJob extends Job { private SecureRandom randomId = new SecureRandom(); private Context context; + private UserAccountManager accountManager; + + public NotificationJob(final Context context, final UserAccountManager accountManager) { + this.context = context; + this.accountManager = accountManager; + } @NonNull @Override @@ -109,6 +118,7 @@ public class NotificationJob extends Job { try { SignatureVerification signatureVerification = PushUtils.verifySignature(context, + accountManager, base64DecodedSignature, base64DecodedSubject); diff --git a/src/main/java/com/owncloud/android/jobs/OfflineSyncJob.java b/src/main/java/com/owncloud/android/jobs/OfflineSyncJob.java index bb8983d4c9..fe433bde09 100644 --- a/src/main/java/com/owncloud/android/jobs/OfflineSyncJob.java +++ b/src/main/java/com/owncloud/android/jobs/OfflineSyncJob.java @@ -2,7 +2,9 @@ * Nextcloud Android client application * * @author Mario Danic + * @author Chris Narkiewicz * Copyright (C) 2018 Mario Danic + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -28,6 +30,7 @@ import com.evernote.android.job.Job; import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.Device; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.MainApp; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.FileDataStorageManager; @@ -49,6 +52,11 @@ public class OfflineSyncJob extends Job { public static final String TAG = "OfflineSyncJob"; private static final String WAKELOCK_TAG_SEPARATION = ":"; + private UserAccountManager userAccountManager; + + public OfflineSyncJob(UserAccountManager userAccountManager) { + this.userAccountManager = userAccountManager; + } @NonNull @Override @@ -76,7 +84,7 @@ public class OfflineSyncJob extends Job { } } - Account[] accounts = AccountUtils.getAccounts(context); + Account[] accounts = userAccountManager.getAccounts(); for (Account account : accounts) { FileDataStorageManager storageManager = new FileDataStorageManager(account, diff --git a/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java b/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java index 30bda29813..790f89cb99 100644 --- a/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java +++ b/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java @@ -2,7 +2,9 @@ * Nextcloud Android client application * * @author Bartosz Przybylski + * @author Chris Narkiewicz * Copyright (C) 2016 Bartosz Przybylski + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -43,6 +45,7 @@ import android.widget.Toast; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.Device; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.AppPreferencesImpl; import com.owncloud.android.MainApp; @@ -82,6 +85,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.inject.Inject; + +import dagger.android.AndroidInjection; + @TargetApi(Build.VERSION_CODES.KITKAT) public class DocumentsStorageProvider extends DocumentsProvider { @@ -91,6 +98,10 @@ public class DocumentsStorageProvider extends DocumentsProvider { private Map rootIdToStorageManager; private OwnCloudClient client; + @Inject UserAccountManager accountManager; + + + @Override public Cursor queryRoots(String[] projection) throws FileNotFoundException { Context context = MainApp.getAppContext(); @@ -104,7 +115,7 @@ public class DocumentsStorageProvider extends DocumentsProvider { final RootCursor result = new RootCursor(projection); - for (Account account : AccountUtils.getAccounts(getContext())) { + for (Account account : accountManager.getAccounts()) { result.addRoot(account, getContext()); } @@ -288,6 +299,7 @@ public class DocumentsStorageProvider extends DocumentsProvider { @Override public boolean onCreate() { + AndroidInjection.inject(this); return true; } @@ -587,7 +599,7 @@ public class DocumentsStorageProvider extends DocumentsProvider { ContentResolver contentResolver = context.getContentResolver(); - for (Account account : AccountUtils.getAccounts(getContext())) { + for (Account account : accountManager.getAccounts()) { final FileDataStorageManager storageManager = new FileDataStorageManager(account, contentResolver); final OCFile rootDir = storageManager.getFileByPath("/"); rootIdToStorageManager.put(rootDir.getFileId(), storageManager); diff --git a/src/main/java/com/owncloud/android/ui/TextDrawable.java b/src/main/java/com/owncloud/android/ui/TextDrawable.java index 1a59cb046a..792ef0ed6d 100644 --- a/src/main/java/com/owncloud/android/ui/TextDrawable.java +++ b/src/main/java/com/owncloud/android/ui/TextDrawable.java @@ -3,8 +3,10 @@ * * @author Andy Scherzinger * @author Tobias Kaminsiky + * @author Chris Narkiewicz * Copyright (C) 2016 ownCloud Inc. * Copyright (C) 2018 Andy Scherzinger + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -21,6 +23,7 @@ package com.owncloud.android.ui; +import android.accounts.Account; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; @@ -28,6 +31,7 @@ import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.NextcloudServer; @@ -91,7 +95,7 @@ public class TextDrawable extends Drawable { * creates an avatar in form of a TextDrawable with the first letter of the account name in a circle with the * given radius. * - * @param accountName the account name + * @param account user account * @param radiusInDp the circle's radius * @return the avatar as a TextDrawable * @throws UnsupportedEncodingException if the charset is not supported when calculating the color values @@ -99,9 +103,9 @@ public class TextDrawable extends Drawable { */ @NonNull @NextcloudServer(max = 12) - public static TextDrawable createAvatar(String accountName, float radiusInDp) throws + public static TextDrawable createAvatar(Account account, float radiusInDp) throws NoSuchAlgorithmException { - String username = AccountUtils.getAccountUsername(accountName); + String username = UserAccountManager.getUsername(account); return createNamedAvatar(username, radiusInDp); } diff --git a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 99d66ca01a..a93fac58de 100644 --- a/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -3,10 +3,12 @@ * * @author Andy Scherzinger * @author Tobias Kaminsky + * @author Chris Narkiewicz * Copyright (C) 2016 Andy Scherzinger * Copyright (C) 2017 Tobias Kaminsky * Copyright (C) 2016 Nextcloud * Copyright (C) 2016 ownCloud Inc. + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -54,6 +56,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.google.android.material.navigation.NavigationView; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.Injectable; import com.nextcloud.client.preferences.AppPreferences; import com.owncloud.android.MainApp; @@ -704,7 +707,7 @@ public abstract class DrawerActivity extends ToolbarActivity Menu.NONE, MENU_ORDER_ACCOUNT, account.name) - .setIcon(TextDrawable.createAvatar(account.name, mMenuAccountAvatarRadiusDimension)); + .setIcon(TextDrawable.createAvatar(account, mMenuAccountAvatarRadiusDimension)); DisplayUtils.setAvatar(account, this, mMenuAccountAvatarRadiusDimension, getResources(), accountMenuItem, this); } @@ -771,7 +774,7 @@ public abstract class DrawerActivity extends ToolbarActivity username.setTextColor(ThemeUtils.fontColor(this)); } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) { Log_OC.w(TAG, "Couldn't read display name of account fallback to account name"); - username.setText(AccountUtils.getAccountUsername(account.name)); + username.setText(UserAccountManager.getUsername(account)); } View currentAccountView = findNavigationViewChildById(R.id.drawer_current_account); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 682a740eae..d2cb484c46 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -2,8 +2,10 @@ * ownCloud Android client application * * @author David A. Velasco + * @author Chris Narkiewicz * Copyright (C) 2011 Bartek Przybylski * Copyright (C) 2016 ownCloud Inc. + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -37,6 +39,7 @@ import android.os.IBinder; import android.view.View; import com.google.android.material.snackbar.Snackbar; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; @@ -78,6 +81,8 @@ import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.FilesSyncHelper; import com.owncloud.android.utils.ThemeUtils; +import javax.inject.Inject; + import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -136,7 +141,7 @@ public abstract class FileActivity extends DrawerActivity private ServiceConnection mDownloadServiceConnection; private ServiceConnection mUploadServiceConnection; - + @Inject UserAccountManager accountManager; @Override public void showFiles(boolean onDeviceOnly) { @@ -174,7 +179,7 @@ public abstract class FileActivity extends DrawerActivity Thread t = new Thread(() -> { // best place, before any access to AccountManager or database - AccountUtils.updateAccountVersion(this); + accountManager.updateAccountVersion(); }); t.start(); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 71a0ecdc11..9e6de9d33e 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -4,9 +4,11 @@ * @author Bartek Przybylski * @author David A. Velasco * @author Andy Scherzinger + * @author Chris Narkiewicz * Copyright (C) 2011 Bartek Przybylski * Copyright (C) 2016 ownCloud Inc. * Copyright (C) 2018 Andy Scherzinger + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -56,6 +58,7 @@ import android.widget.ImageView; import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.snackbar.Snackbar; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.Injectable; import com.owncloud.android.MainApp; import com.owncloud.android.R; @@ -210,8 +213,8 @@ public class FileDisplayActivity extends FileActivity private boolean searchOpen; private SearchView searchView; - @Inject - AppPreferences preferences; + @Inject AppPreferences preferences; + @Inject UserAccountManager accountManager; @Override protected void onCreate(Bundle savedInstanceState) { @@ -2567,9 +2570,9 @@ public class FileDisplayActivity extends FileActivity @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessageEvent(TokenPushEvent event) { if (!preferences.isKeysReInitEnabled()) { - PushUtils.reinitKeys(); + PushUtils.reinitKeys(accountManager); } else { - PushUtils.pushRegistrationToServer(preferences.getPushToken()); + PushUtils.pushRegistrationToServer(accountManager, preferences.getPushToken()); } } diff --git a/src/main/java/com/owncloud/android/ui/activity/FirstRunActivity.java b/src/main/java/com/owncloud/android/ui/activity/FirstRunActivity.java index 4941d80845..ec728fd9f8 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FirstRunActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FirstRunActivity.java @@ -2,9 +2,11 @@ * Nextcloud Android client application * * @author Bartosz Przybylski + * @author Chris Narkiewicz * Copyright (C) 2015 Bartosz Przybylski * Copyright (C) 2015 ownCloud Inc. * Copyright (C) 2016 Nextcloud. + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -37,6 +39,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import androidx.viewpager.widget.ViewPager; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.Injectable; import com.nextcloud.client.preferences.AppPreferences; import com.owncloud.android.MainApp; @@ -60,6 +63,8 @@ public class FirstRunActivity extends BaseActivity implements ViewPager.OnPageCh public static final int FIRST_RUN_RESULT_CODE = 199; private ProgressIndicator progressIndicator; + + @Inject UserAccountManager userAccountManager; @Inject AppPreferences preferences; @Override @@ -112,7 +117,7 @@ public class FirstRunActivity extends BaseActivity implements ViewPager.OnPageCh if (isFirstRun(this)) { AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); if (am != null) { - for (Account account : AccountUtils.getAccounts(this)) { + for (Account account : userAccountManager.getAccounts()) { am.removeAccount(account, null, null); } } diff --git a/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java b/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java index ef6d33ef8f..aa9a1fc7fa 100644 --- a/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java @@ -3,9 +3,11 @@ * * @author Bartek Przybylski * @author David A. Velasco + * @author Chris Narkiewicz * Copyright (C) 2011 Bartek Przybylski * Copyright (C) 2016 ownCloud Inc. * Copyright (C) 2016 Nextcloud + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -55,6 +57,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.res.ResourcesCompat; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.Injectable; import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.AppPreferencesImpl; @@ -751,7 +754,7 @@ public class SettingsActivity extends PreferenceActivity if (serverBaseUri != null) { davDroidLoginIntent.putExtra("url", serverBaseUri.toString() + DAV_PATH); } - davDroidLoginIntent.putExtra("username", AccountUtils.getAccountUsername(account.name)); + davDroidLoginIntent.putExtra("username", UserAccountManager.getUsername(account)); startActivityForResult(davDroidLoginIntent, ACTION_REQUEST_CODE_DAVDROID_SETUP); } else { // DAVdroid not installed diff --git a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java index dd8f3ba24e..6cba55edc8 100755 --- a/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java @@ -2,8 +2,10 @@ * Nextcloud Android client application * * @author Tobias Kaminsky + * @author Chris Narkiewicz * Copyright (C) 2018 Tobias Kaminsky * Copyright (C) 2018 Nextcloud + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -42,6 +44,7 @@ import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.support.PersistableBundleCompat; import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.R; import com.owncloud.android.datamodel.UploadsStorageManager; import com.owncloud.android.files.services.FileUploader; @@ -60,6 +63,8 @@ import com.owncloud.android.utils.ThemeUtils; import java.util.Set; +import javax.inject.Inject; + import androidx.recyclerview.widget.GridLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import butterknife.BindString; @@ -103,6 +108,7 @@ public class UploadListActivity extends FileActivity { public String noResultsMessage; private Unbinder unbinder; + @Inject UserAccountManager userAccountManager; @Override public void showFiles(boolean onDeviceOnly) { @@ -275,7 +281,7 @@ public class UploadListActivity extends FileActivity { protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == FileActivity.REQUEST_CODE__UPDATE_CREDENTIALS && resultCode == RESULT_OK) { - FilesSyncHelper.restartJobsIfNeeded(); + FilesSyncHelper.restartJobsIfNeeded(userAccountManager); } } @@ -295,7 +301,7 @@ public class UploadListActivity extends FileActivity { } else { // already updated -> just retry! - FilesSyncHelper.restartJobsIfNeeded(); + FilesSyncHelper.restartJobsIfNeeded(userAccountManager); } } else { diff --git a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 26e1766a95..74bc99e00e 100644 --- a/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -3,9 +3,11 @@ * * @author Mario Danic * @author Andy Scherzinger + * @author Chris Narkiewicz * Copyright (C) 2017 Mario Danic * Copyright (C) 2017 Andy Scherzinger * Copyright (C) 2017 Nextcloud GmbH. + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -51,6 +53,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.google.gson.Gson; +import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.Injectable; import com.nextcloud.client.preferences.AppPreferences; import com.owncloud.android.R; @@ -117,6 +120,7 @@ public class UserInfoActivity extends FileActivity implements Injectable { @BindString(R.string.user_information_retrieval_error) protected String sorryMessage; @Inject AppPreferences preferences; + @Inject UserAccountManager accountManager; private float mCurrentAccountAvatarRadiusDimension; private Unbinder unbinder; @@ -443,7 +447,7 @@ public class UserInfoActivity extends FileActivity implements Injectable { @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessageEvent(TokenPushEvent event) { - PushUtils.pushRegistrationToServer(preferences.getPushToken()); + PushUtils.pushRegistrationToServer(accountManager, preferences.getPushToken()); } diff --git a/src/main/java/com/owncloud/android/ui/adapter/AccountListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/AccountListAdapter.java index ad69d283eb..f377580c71 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/AccountListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/AccountListAdapter.java @@ -2,7 +2,9 @@ * ownCloud Android client application * * @author Andy Scherzinger + * @author Chris Narkiewicz * Copyright (C) 2016 ownCloud Inc. + * Copyright (C) 2019 Chris Narkiewicz *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -29,6 +31,7 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.lib.common.OwnCloudAccount; @@ -173,7 +176,7 @@ public class AccountListAdapter extends ArrayAdapter implements viewHolder.usernameViewItem.setText(oca.getDisplayName()); } catch (Exception e) { Log_OC.w(TAG, "Account not found right after being read; using account name instead"); - viewHolder.usernameViewItem.setText(AccountUtils.getAccountUsername(account.name)); + viewHolder.usernameViewItem.setText(UserAccountManager.getUsername(account)); } viewHolder.usernameViewItem.setTag(account.name); } diff --git a/src/main/java/com/owncloud/android/utils/FilesSyncHelper.java b/src/main/java/com/owncloud/android/utils/FilesSyncHelper.java index 09cb9abf7e..c92b07c44a 100644 --- a/src/main/java/com/owncloud/android/utils/FilesSyncHelper.java +++ b/src/main/java/com/owncloud/android/utils/FilesSyncHelper.java @@ -2,8 +2,10 @@ * Nextcloud Android client application * * @author Mario Danic + * @author Chris Narkiewicz * Copyright (C) 2017 Mario Danic * Copyright (C) 2017 Nextcloud + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -36,9 +38,9 @@ import android.util.Log; import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.Device; -import com.nextcloud.client.preferences.AppPreferencesImpl; +import com.nextcloud.client.account.UserAccountManager; +import com.nextcloud.client.preferences.AppPreferences; import com.owncloud.android.MainApp; -import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.FilesystemDataProvider; import com.owncloud.android.datamodel.MediaFolderType; @@ -155,11 +157,11 @@ public final class FilesSyncHelper { } } - public static void insertAllDBEntries(boolean skipCustom) { + public static void insertAllDBEntries(AppPreferences preferences, boolean skipCustom) { final Context context = MainApp.getAppContext(); final ContentResolver contentResolver = context.getContentResolver(); SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver, - AppPreferencesImpl.fromContext(context)); + preferences); for (SyncedFolder syncedFolder : syncedFolderProvider.getSyncedFolders()) { if (syncedFolder.isEnabled() && (MediaFolderType.CUSTOM != syncedFolder.getType() || !skipCustom)) { @@ -212,7 +214,7 @@ public final class FilesSyncHelper { } } - public static void restartJobsIfNeeded() { + public static void restartJobsIfNeeded(UserAccountManager accountManager) { final Context context = MainApp.getAppContext(); FileUploader.UploadRequester uploadRequester = new FileUploader.UploadRequester(); @@ -226,7 +228,7 @@ public final class FilesSyncHelper { accountExists = false; // check if accounts still exists - for (Account account : AccountUtils.getAccounts(context)) { + for (Account account : accountManager.getAccounts()) { if (account.name.equals(failedUpload.getAccountName())) { accountExists = true; break; diff --git a/src/main/java/com/owncloud/android/utils/ReceiversHelper.java b/src/main/java/com/owncloud/android/utils/ReceiversHelper.java index e1feb1bbd2..f0b2ed9fad 100644 --- a/src/main/java/com/owncloud/android/utils/ReceiversHelper.java +++ b/src/main/java/com/owncloud/android/utils/ReceiversHelper.java @@ -1,9 +1,11 @@ -/** +/* * Nextcloud Android client application * * @author Mario Danic + * @author Chris Narkiewicz * Copyright (C) 2017 Mario Danic * Copyright (C) 2017 Nextcloud + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -27,6 +29,7 @@ import android.content.IntentFilter; import com.evernote.android.job.JobRequest; import com.evernote.android.job.util.Device; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.MainApp; /** @@ -38,7 +41,7 @@ public final class ReceiversHelper { // utility class -> private constructor } - public static void registerNetworkChangeReceiver() { + public static void registerNetworkChangeReceiver(final UserAccountManager accountManager) { Context context = MainApp.getAppContext(); IntentFilter intentFilter = new IntentFilter(); @@ -49,7 +52,7 @@ public final class ReceiversHelper { @Override public void onReceive(Context context, Intent intent) { if (!Device.getNetworkType(context).equals(JobRequest.NetworkType.ANY)) { - FilesSyncHelper.restartJobsIfNeeded(); + FilesSyncHelper.restartJobsIfNeeded(accountManager); } } }; @@ -57,7 +60,7 @@ public final class ReceiversHelper { context.registerReceiver(broadcastReceiver, intentFilter); } - public static void registerPowerChangeReceiver() { + public static void registerPowerChangeReceiver(final UserAccountManager accountManager) { Context context = MainApp.getAppContext(); IntentFilter intentFilter = new IntentFilter(); @@ -68,7 +71,7 @@ public final class ReceiversHelper { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_POWER_CONNECTED.equals(intent.getAction())) { - FilesSyncHelper.restartJobsIfNeeded(); + FilesSyncHelper.restartJobsIfNeeded(accountManager); } } }; @@ -76,7 +79,7 @@ public final class ReceiversHelper { context.registerReceiver(broadcastReceiver, intentFilter); } - public static void registerPowerSaveReceiver() { + public static void registerPowerSaveReceiver(final UserAccountManager accountManager) { Context context = MainApp.getAppContext(); IntentFilter intentFilter = new IntentFilter(); @@ -86,7 +89,7 @@ public final class ReceiversHelper { @Override public void onReceive(Context context, Intent intent) { if (!PowerUtils.isPowerSaveMode(context)) { - FilesSyncHelper.restartJobsIfNeeded(); + FilesSyncHelper.restartJobsIfNeeded(accountManager); } } }; diff --git a/src/versionDev/java/com/nextcloud/client/di/VariantComponentsModule.java b/src/versionDev/java/com/nextcloud/client/di/VariantComponentsModule.java new file mode 100644 index 0000000000..6afc823f44 --- /dev/null +++ b/src/versionDev/java/com/nextcloud/client/di/VariantComponentsModule.java @@ -0,0 +1,26 @@ +/* + * Nextcloud Android client application + * + * @author Chris Narkiewicz + * Copyright (C) 2919 Chris Narkiewicz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ +package com.nextcloud.client.di; + +import dagger.Module; + +@Module +abstract class VariantComponentsModule { +} diff --git a/src/versionDev/java/com/owncloud/android/utils/PushUtils.java b/src/versionDev/java/com/owncloud/android/utils/PushUtils.java index 5998908654..8bbea47ab1 100644 --- a/src/versionDev/java/com/owncloud/android/utils/PushUtils.java +++ b/src/versionDev/java/com/owncloud/android/utils/PushUtils.java @@ -2,7 +2,9 @@ * Nextcloud Android client application * * @author Mario Danic + * @author Chris Narkiewicz * Copyright (C) 2017 Mario Danic + * Copyright (C) 2019 Chris Narkiewicz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -22,6 +24,7 @@ package com.owncloud.android.utils; import android.content.Context; +import com.nextcloud.client.account.UserAccountManager; import com.owncloud.android.MainApp; import com.owncloud.android.datamodel.SignatureVerification; import com.nextcloud.client.preferences.AppPreferencesImpl; @@ -34,11 +37,14 @@ public final class PushUtils { private PushUtils() { } - public static void pushRegistrationToServer(final String pushToken) { + public static void pushRegistrationToServer( + final UserAccountManager accountManager, + final String pushToken) + { // do nothing } - public static void reinitKeys() { + public static void reinitKeys(final UserAccountManager accountManager) { Context context = MainApp.getAppContext(); AppPreferencesImpl.fromContext(context).setKeysReInitEnabled(); } @@ -47,7 +53,11 @@ public final class PushUtils { return null; } - public static SignatureVerification verifySignature(Context context, byte[] signatureBytes, byte[] subjectBytes) { + public static SignatureVerification verifySignature( + final Context context, + final UserAccountManager accountManager, + final byte[] signatureBytes, final byte[] subjectBytes + ) { return null; } }