diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-05-11 15:45:22 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2021-05-12 11:58:43 +0300 |
commit | ccc812dc6edb0b42976ab0199f87e804ef5b2f74 (patch) | |
tree | 636c29b9024764919b8a29d3ac5f9d4e32f5774a /app/src/main/java | |
parent | 1bc0d8c9c1a4acc653360e8479bd01e972b281d0 (diff) |
#1079 Show DisplayName instead of uid attribute for LDAP users
Diffstat (limited to 'app/src/main/java')
15 files changed, 144 insertions, 36 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java b/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java index f5643d86..e1ba3e8e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java @@ -67,7 +67,7 @@ public class AccountSwitcherDialog extends BrandedDialogFragment { account$.observe(requireActivity(), (currentLocalAccount) -> { account$.removeObservers(requireActivity()); - binding.accountName.setText(currentLocalAccount.getUserName()); + binding.accountName.setText(currentLocalAccount.getDisplayName()); binding.accountHost.setText(Uri.parse(currentLocalAccount.getUrl()).getHost()); Glide.with(requireContext()) .load(currentLocalAccount.getUrl() + "/index.php/avatar/" + Uri.encode(currentLocalAccount.getUserName()) + "/64") diff --git a/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherViewHolder.java index 70f8004b..852c7d40 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherViewHolder.java @@ -25,7 +25,7 @@ public class AccountSwitcherViewHolder extends RecyclerView.ViewHolder { } public void bind(@NonNull Account localAccount, @NonNull Consumer<Account> onAccountClick) { - binding.accountName.setText(localAccount.getUserName()); + binding.accountName.setText(localAccount.getDisplayName()); binding.accountHost.setText(Uri.parse(localAccount.getUrl()).getHost()); Glide.with(itemView.getContext()) .load(new SingleSignOnUrl(localAccount.getAccountName(), localAccount.getUrl() + "/index.php/avatar/" + Uri.encode(localAccount.getUserName()) + "/64")) 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 0761306d..37a0bde6 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 @@ -1,9 +1,7 @@ package it.niedermann.owncloud.notes.importaccount; -import android.content.Context; import android.accounts.NetworkErrorException; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -93,7 +91,8 @@ public class ImportAccountActivity extends AppCompatActivity { try { Log.i(TAG, "Loading capabilities for " + ssoAccount.name); final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplicationContext(), ssoAccount, null); - importAccountViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, new IResponseCallback<Account>() { + final String displayName = CapabilitiesClient.getDisplayName(getApplicationContext(), ssoAccount); + importAccountViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, displayName, new IResponseCallback<Account>() { /** * Update syncing when adding account diff --git a/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountViewModel.java index 905a59b1..70b3b565 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountViewModel.java @@ -3,6 +3,7 @@ package it.niedermann.owncloud.notes.importaccount; import android.app.Application; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; @@ -23,7 +24,7 @@ public class ImportAccountViewModel extends AndroidViewModel { this.repo = NotesRepository.getInstance(application); } - public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @NonNull IResponseCallback<Account> callback) { - repo.addAccount(url, username, accountName, capabilities, callback); + public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @Nullable String displayName, @NonNull IResponseCallback<Account> callback) { + repo.addAccount(url, username, accountName, capabilities, displayName, callback); } } 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 d889689d..26ae3548 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 @@ -657,7 +657,8 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A try { Log.i(TAG, "Refreshing capabilities for " + ssoAccount.name); final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplicationContext(), ssoAccount, null); - mainViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, new IResponseCallback<Account>() { + final String displayName = CapabilitiesClient.getDisplayName(getApplicationContext(), ssoAccount); + mainViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, displayName, new IResponseCallback<Account>() { @Override public void onSuccess(Account result) { new Thread(() -> { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java index ec0e71c7..aa1af633 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java @@ -20,6 +20,7 @@ import com.nextcloud.android.sso.AccountImporter; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException; import com.nextcloud.android.sso.helper.SingleAccountHelper; +import com.nextcloud.android.sso.model.SingleSignOnAccount; import java.util.ArrayList; import java.util.Collection; @@ -394,26 +395,31 @@ public class MainViewModel extends AndroidViewModel { } if (repo.isSyncPossible()) { try { - final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplication(), AccountImporter.getSingleSignOnAccount(getApplication(), localAccount.getAccountName()), localAccount.getCapabilitiesETag()); - repo.updateCapabilitiesETag(localAccount.getId(), capabilities.getETag()); - repo.updateBrand(localAccount.getId(), capabilities.getColor(), capabilities.getTextColor()); - localAccount.setColor(capabilities.getColor()); - localAccount.setTextColor(capabilities.getTextColor()); - BrandingUtil.saveBrandColors(getApplication(), localAccount.getColor(), localAccount.getTextColor()); - repo.updateApiVersion(localAccount.getId(), capabilities.getApiVersion()); - callback.onSuccess(null); + final SingleSignOnAccount ssoAccount = AccountImporter.getSingleSignOnAccount(getApplication(), localAccount.getAccountName()); + try { + final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplication(), ssoAccount, localAccount.getCapabilitiesETag()); + repo.updateCapabilitiesETag(localAccount.getId(), capabilities.getETag()); + repo.updateBrand(localAccount.getId(), capabilities.getColor(), capabilities.getTextColor()); + localAccount.setColor(capabilities.getColor()); + localAccount.setTextColor(capabilities.getTextColor()); + BrandingUtil.saveBrandColors(getApplication(), localAccount.getColor(), localAccount.getTextColor()); + repo.updateApiVersion(localAccount.getId(), capabilities.getApiVersion()); + callback.onSuccess(null); + } catch (Throwable t) { + if (t.getClass() == NextcloudHttpRequestFailedException.class || t instanceof NextcloudHttpRequestFailedException) { + if (((NextcloudHttpRequestFailedException) t).getStatusCode() == HTTP_NOT_MODIFIED) { + Log.d(TAG, "Server returned HTTP Status Code " + ((NextcloudHttpRequestFailedException) t).getStatusCode() + " - Capabilities not modified."); + callback.onSuccess(null); + return; + } + } + callback.onError(t); + } finally { + repo.updateDisplayName(localAccount.getId(), CapabilitiesClient.getDisplayName(getApplication(), ssoAccount)); + } } catch (NextcloudFilesAppAccountNotFoundException e) { repo.deleteAccount(localAccount); callback.onError(e); - } catch (Throwable t) { - if (t.getClass() == NextcloudHttpRequestFailedException.class || t instanceof NextcloudHttpRequestFailedException) { - if (((NextcloudHttpRequestFailedException) t).getStatusCode() == HTTP_NOT_MODIFIED) { - Log.d(TAG, "Server returned HTTP Status Code " + ((NextcloudHttpRequestFailedException) t).getStatusCode() + " - Capabilities not modified."); - callback.onSuccess(null); - return; - } - } - callback.onError(t); } } else { if (repo.isNetworkConnected() && repo.isSyncOnlyOnWifi()) { @@ -528,8 +534,8 @@ public class MainViewModel extends AndroidViewModel { }); } - public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @NonNull IResponseCallback<Account> callback) { - repo.addAccount(url, username, accountName, capabilities, callback); + public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @Nullable String displayName, @NonNull IResponseCallback<Account> callback) { + repo.addAccount(url, username, accountName, capabilities, displayName, callback); } public LiveData<Note> getFullNote$(long id) { 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 8afc64b8..960984ff 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 @@ -14,6 +14,9 @@ import java.util.Map; import it.niedermann.owncloud.notes.persistence.sync.OcsAPI; import it.niedermann.owncloud.notes.shared.model.Capabilities; +import it.niedermann.owncloud.notes.shared.model.OcsResponse; +import it.niedermann.owncloud.notes.shared.model.User; +import retrofit2.Response; @WorkerThread public class CapabilitiesClient { @@ -22,6 +25,7 @@ public class CapabilitiesClient { private static final String HEADER_KEY_ETAG = "ETag"; + @WorkerThread public static Capabilities getCapabilities(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount, @Nullable String lastETag) throws Throwable { final OcsAPI ocsAPI = ApiProvider.getOcsAPI(context, ssoAccount); try { @@ -36,11 +40,33 @@ public class CapabilitiesClient { return capabilities; } catch (RuntimeException e) { final Throwable cause = e.getCause(); - if(cause != null) { + if (cause != null) { throw cause; } else { throw e; } } } + + @WorkerThread + @Nullable + public static String getDisplayName(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount) { + final OcsAPI ocsAPI = ApiProvider.getOcsAPI(context, ssoAccount); + try { + final Response<OcsResponse<User>> userResponse = ocsAPI.getUser(ssoAccount.userId).execute(); + if (userResponse.isSuccessful()) { + final OcsResponse<User> ocsResponse = userResponse.body(); + if (ocsResponse != null) { + return ocsResponse.ocs.data.displayName; + } else { + Log.w(TAG, "ocsResponse is null"); + } + } else { + Log.w(TAG, "Fetching user was not successful."); + } + } catch (Throwable t) { + t.printStackTrace(); + } + return null; + } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/CapabilitiesWorker.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/CapabilitiesWorker.java index 1dff46cf..32edbed7 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/CapabilitiesWorker.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/CapabilitiesWorker.java @@ -52,6 +52,7 @@ public class CapabilitiesWorker extends Worker { repo.updateBrand(account.getId(), capabilities.getColor(), capabilities.getTextColor()); repo.updateApiVersion(account.getId(), capabilities.getApiVersion()); Log.i(TAG, capabilities.toString()); + repo.updateDisplayName(account.getId(), CapabilitiesClient.getDisplayName(getApplicationContext(), ssoAccount)); } catch (Throwable e) { if (e instanceof NextcloudHttpRequestFailedException) { if (((NextcloudHttpRequestFailedException) e).getStatusCode() == HttpURLConnection.HTTP_NOT_MODIFIED) { 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 37116e4b..861987f0 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 @@ -161,8 +161,8 @@ public class NotesRepository { // Accounts @AnyThread - public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @NonNull IResponseCallback<Account> callback) { - final Account createdAccount = db.getAccountDao().getAccountById(db.getAccountDao().insert(new Account(url, username, accountName, capabilities))); + public void addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @Nullable String displayName, @NonNull IResponseCallback<Account> callback) { + final Account createdAccount = db.getAccountDao().getAccountById(db.getAccountDao().insert(new Account(url, username, accountName, displayName, capabilities))); if (createdAccount == null) { callback.onError(new Exception("Could not read created account.")); } else { @@ -921,4 +921,8 @@ public class NotesRepository { public LiveData<ArrayList<Throwable>> getSyncErrors() { return this.syncErrors; } + + public void updateDisplayName(long id, @Nullable String displayName) { + db.getAccountDao().updateDisplayName(id, displayName); + } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/AccountDao.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/AccountDao.java index 085c0a16..7723e1f0 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/AccountDao.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/AccountDao.java @@ -1,6 +1,7 @@ package it.niedermann.owncloud.notes.persistence.dao; import androidx.annotation.ColorInt; +import androidx.annotation.Nullable; import androidx.lifecycle.LiveData; import androidx.room.Dao; import androidx.room.Delete; @@ -18,10 +19,10 @@ public interface AccountDao { long insert(Account localAccount); @Delete - int deleteAccount(Account localAccount); + void deleteAccount(Account localAccount); - String getAccounts = "SELECT * FROM Account"; - String getAccountById = "SELECT * FROM Account WHERE ID = :accountId"; + String getAccounts = "SELECT id, url, userName, accountName, eTag, modified, apiVersion, color, textColor, capabilitiesEtag, COALESCE(displayName, userName) as displayName FROM Account"; + String getAccountById = "SELECT id, url, userName, accountName, eTag, modified, apiVersion, color, textColor, capabilitiesEtag, COALESCE(displayName, userName) as displayName FROM Account WHERE ID = :accountId"; @Query(getAccounts) LiveData<List<Account>> getAccounts$(); @@ -35,7 +36,7 @@ public interface AccountDao { @Query(getAccountById) Account getAccountById(long accountId); - @Query("SELECT * FROM Account WHERE ACCOUNTNAME = :accountName") + @Query("SELECT id, url, userName, accountName, eTag, modified, apiVersion, color, textColor, capabilitiesEtag, COALESCE(displayName, userName) as displayName FROM Account WHERE ACCOUNTNAME = :accountName") Account getAccountByName(String accountName); @Query("SELECT COUNT(*) FROM Account") @@ -55,4 +56,7 @@ public interface AccountDao { @Query("UPDATE Account SET APIVERSION = :apiVersion WHERE id = :id AND ((APIVERSION IS NULL AND :apiVersion IS NOT NULL) OR (APIVERSION IS NOT NULL AND :apiVersion IS NULL) OR APIVERSION <> :apiVersion)") int updateApiVersion(Long id, String apiVersion); + + @Query("UPDATE Account SET DISPLAYNAME = :displayName WHERE id = :id") + void updateDisplayName(long id, @Nullable String displayName); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Account.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Account.java index 09f3fc26..07d91afc 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Account.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Account.java @@ -58,15 +58,18 @@ public class Account implements Serializable { private int textColor = Color.WHITE; @Nullable private String capabilitiesETag; + @Nullable + private String displayName; public Account() { // Default constructor } - public Account(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities) { + public Account(@NonNull String url, @NonNull String username, @NonNull String accountName, @Nullable String displayName, @NonNull Capabilities capabilities) { setUrl(url); setUserName(username); setAccountName(accountName); + setDisplayName(displayName); setCapabilities(capabilities); } @@ -189,6 +192,15 @@ public class Account implements Serializable { this.capabilitiesETag = capabilitiesETag; } + @Nullable + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(@Nullable String displayName) { + this.displayName = displayName; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/OcsAPI.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/OcsAPI.java index 27ef57c4..d22113fa 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/OcsAPI.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/OcsAPI.java @@ -5,8 +5,12 @@ import com.nextcloud.android.sso.api.ParsedResponse; import io.reactivex.Observable; import it.niedermann.owncloud.notes.shared.model.Capabilities; +import it.niedermann.owncloud.notes.shared.model.OcsResponse; +import it.niedermann.owncloud.notes.shared.model.User; +import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Header; +import retrofit2.http.Path; /** * @link <a href="https://deck.readthedocs.io/en/latest/API/">Deck REST API</a> @@ -15,4 +19,7 @@ public interface OcsAPI { @GET("capabilities?format=json") Observable<ParsedResponse<Capabilities>> getCapabilities(@Header("If-None-Match") String eTag); + + @GET("users/{userId}?format=json") + Call<OcsResponse<User>> getUser(@Path("userId") String userId); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/account/AccountChooserViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/account/AccountChooserViewHolder.java index 7688b1b1..5d3d2963 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/account/AccountChooserViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/account/AccountChooserViewHolder.java @@ -31,7 +31,7 @@ public class AccountChooserViewHolder extends RecyclerView.ViewHolder { .into(binding.accountItemAvatar); binding.accountLayout.setOnClickListener((v) -> targetAccountConsumer.accept(localAccount)); - binding.accountName.setText(localAccount.getUserName()); + binding.accountName.setText(localAccount.getDisplayName()); binding.accountHost.setText(Uri.parse(localAccount.getUrl()).getHost()); } }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java new file mode 100644 index 00000000..c47b4151 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/OcsResponse.java @@ -0,0 +1,32 @@ +package it.niedermann.owncloud.notes.shared.model; + +import com.google.gson.annotations.Expose; + +import java.io.Serializable; + +/** + * <a href="https://www.open-collaboration-services.org/">OpenCollaborationServices</a> + * + * @param <T> defines the payload of this {@link OcsResponse}. + */ +public class OcsResponse<T> implements Serializable { + + @Expose + public OcsWrapper<T> ocs; + + public static class OcsWrapper<T> { + @Expose + public OcsMeta meta; + @Expose + public T data; + } + + public static class OcsMeta { + @Expose + public String status; + @Expose + public int statuscode; + @Expose + public String message; + } +}
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java new file mode 100644 index 00000000..0033b610 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/User.java @@ -0,0 +1,15 @@ +package it.niedermann.owncloud.notes.shared.model; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class User implements Serializable { + @Expose + @SerializedName("id") + public String userId; + @Expose + @SerializedName("displayname") + public String displayName; +}
\ No newline at end of file |