Loading app/src/main/AndroidManifest.xml +6 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,12 @@ android:name=".android.activity.ExceptionActivity" android:label="@string/app_name" /> <activity android:name=".manageaccounts.ManageAccountsActivity" android:label="@string/manage_accounts" android:parentActivityName=".android.activity.NotesListViewActivity" android:windowSoftInputMode="stateHidden" /> <activity android:name=".android.activity.PreferencesActivity" android:label="@string/action_settings" Loading app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherAdapter.java +2 −17 Original line number Diff line number Diff line Loading @@ -4,7 +4,6 @@ import android.view.LayoutInflater; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.util.Consumer; import androidx.recyclerview.widget.RecyclerView; Loading @@ -20,12 +19,9 @@ public class AccountSwitcherAdapter extends RecyclerView.Adapter<AccountSwitcher private final List<LocalAccount> localAccounts = new ArrayList<>(); @NonNull private final Consumer<LocalAccount> onAccountClick; @Nullable private final Consumer<LocalAccount> onAccountDelete; public AccountSwitcherAdapter(@NonNull Consumer<LocalAccount> onAccountClick, @Nullable Consumer<LocalAccount> onAccountDelete) { public AccountSwitcherAdapter(@NonNull Consumer<LocalAccount> onAccountClick) { this.onAccountClick = onAccountClick; this.onAccountDelete = onAccountDelete; setHasStableIds(true); } Loading @@ -42,18 +38,7 @@ public class AccountSwitcherAdapter extends RecyclerView.Adapter<AccountSwitcher @Override public void onBindViewHolder(@NonNull AccountSwitcherViewHolder holder, int position) { holder.bind(localAccounts.get(position), onAccountClick, (localAccount -> { if (onAccountDelete != null) { for (int i = 0; i < localAccounts.size(); i++) { if (localAccounts.get(i).getId() == localAccount.getId()) { localAccounts.remove(i); notifyItemRemoved(i); break; } } onAccountDelete.accept(localAccount); } })); holder.bind(localAccounts.get(position), onAccountClick); } @Override Loading app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java +10 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ package it.niedermann.owncloud.notes.accountswitcher; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.net.Uri; Loading @@ -19,9 +20,12 @@ import java.util.List; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.DialogAccountSwitcherBinding; import it.niedermann.owncloud.notes.manageaccounts.ManageAccountsActivity; import it.niedermann.owncloud.notes.model.LocalAccount; import it.niedermann.owncloud.notes.persistence.NotesDatabase; import static it.niedermann.owncloud.notes.android.activity.NotesListViewActivity.manage_account; public class AccountSwitcherDialog extends DialogFragment { private static final String KEY_CURRENT_ACCOUNT_ID = "current_account_id"; Loading Loading @@ -72,7 +76,7 @@ public class AccountSwitcherDialog extends DialogFragment { AccountSwitcherAdapter adapter = new AccountSwitcherAdapter((localAccount -> { accountSwitcherListener.onAccountChosen(localAccount); dismiss(); }), (localAccount) -> accountSwitcherListener.onAccountDeleted(localAccount)); })); binding.accountsList.setAdapter(adapter); List<LocalAccount> localAccounts = db.getAccounts(); for (LocalAccount localAccount : localAccounts) { Loading @@ -88,6 +92,11 @@ public class AccountSwitcherDialog extends DialogFragment { dismiss(); }); binding.manageAccounts.setOnClickListener((v) -> { requireActivity().startActivityForResult(new Intent(requireContext(), ManageAccountsActivity.class), manage_account); dismiss(); }); return new AlertDialog.Builder(requireContext()) .setView(binding.getRoot()) .create(); Loading app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherViewHolder.java +2 −8 Original line number Diff line number Diff line Loading @@ -4,7 +4,6 @@ import android.net.Uri; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.util.Consumer; import androidx.recyclerview.widget.RecyclerView; Loading @@ -24,7 +23,7 @@ public class AccountSwitcherViewHolder extends RecyclerView.ViewHolder { binding = ItemAccountChooseBinding.bind(itemView); } public void bind(@NonNull LocalAccount localAccount, @NonNull Consumer<LocalAccount> onAccountClick, @Nullable Consumer<LocalAccount> onAccountDelete) { public void bind(@NonNull LocalAccount localAccount, @NonNull Consumer<LocalAccount> onAccountClick) { binding.accountItemLabel.setText(localAccount.getAccountName()); Glide.with(itemView.getContext()) .load(localAccount.getUrl() + "/index.php/avatar/" + Uri.encode(localAccount.getUserName()) + "/64") Loading @@ -32,11 +31,6 @@ public class AccountSwitcherViewHolder extends RecyclerView.ViewHolder { .apply(RequestOptions.circleCropTransform()) .into(binding.accountItemAvatar); itemView.setOnClickListener((v) -> onAccountClick.accept(localAccount)); if (onAccountDelete == null) { binding.delete.setVisibility(View.GONE); } else { binding.delete.setVisibility(View.VISIBLE); binding.delete.setOnClickListener((v) -> onAccountDelete.accept(localAccount)); } } } app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +19 −3 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi private final static int show_single_note_cmd = 1; private final static int server_settings = 2; private final static int about = 3; public final static int manage_account = 4; /** * Used to detect the onResume() call after the import dialog has been displayed. Loading @@ -124,6 +125,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi private NavigationItem itemRecent; private NavigationItem itemFavorites; private NavigationItem itemUncategorized; @NonNull private Category navigationSelection = new Category(null, null); private String navigationOpen = ""; private ActionMode mActionMode; Loading Loading @@ -160,7 +162,10 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi navigationSelection = new Category(null, true); } } else { navigationSelection = (Category) savedInstanceState.getSerializable(SAVED_STATE_NAVIGATION_SELECTION); Object savedCategory = savedInstanceState.getSerializable(SAVED_STATE_NAVIGATION_SELECTION); if (savedCategory != null) { navigationSelection = (Category) savedCategory; } navigationOpen = savedInstanceState.getString(SAVED_STATE_NAVIGATION_OPEN); categoryAdapterSelectedItem = savedInstanceState.getString(SAVED_STATE_NAVIGATION_ADAPTER_SLECTION); } Loading Loading @@ -227,14 +232,21 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi } refreshLists(); fabCreate.show(); activityBinding.launchAccountSwitcher.setOnClickListener((v) -> AccountSwitcherDialog.newInstance(localAccount.getId()).show(getSupportFragmentManager(), AccountSwitcherDialog.class.getSimpleName())); activityBinding.launchAccountSwitcher.setOnClickListener((v) -> { if (localAccount == null) { handleNotAuthorizedAccount(); } else { AccountSwitcherDialog.newInstance(localAccount.getId()).show(getSupportFragmentManager(), AccountSwitcherDialog.class.getSimpleName()); } }); setupNavigationList(ADAPTER_KEY_RECENT); updateCurrentAccountAvatar(); } else { if (!notAuthorizedAccountHandled) { handleNotAuthorizedAccount(); } binding.navigationList.setAdapter(null); } updateCurrentAccountAvatar(); } private void handleNotAuthorizedAccount() { Loading Loading @@ -676,6 +688,10 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi // Recreate activity completely, because theme switching makes problems when only invalidating the views. // @see https://github.com/stefan-niedermann/nextcloud-notes/issues/529 recreate(); } else if (requestCode == manage_account) { if (resultCode == RESULT_FIRST_USER) { selectAccount(null); } } else { try { AccountImporter.onActivityResult(requestCode, resultCode, data, this, (ssoAccount) -> { Loading Loading
app/src/main/AndroidManifest.xml +6 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,12 @@ android:name=".android.activity.ExceptionActivity" android:label="@string/app_name" /> <activity android:name=".manageaccounts.ManageAccountsActivity" android:label="@string/manage_accounts" android:parentActivityName=".android.activity.NotesListViewActivity" android:windowSoftInputMode="stateHidden" /> <activity android:name=".android.activity.PreferencesActivity" android:label="@string/action_settings" Loading
app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherAdapter.java +2 −17 Original line number Diff line number Diff line Loading @@ -4,7 +4,6 @@ import android.view.LayoutInflater; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.util.Consumer; import androidx.recyclerview.widget.RecyclerView; Loading @@ -20,12 +19,9 @@ public class AccountSwitcherAdapter extends RecyclerView.Adapter<AccountSwitcher private final List<LocalAccount> localAccounts = new ArrayList<>(); @NonNull private final Consumer<LocalAccount> onAccountClick; @Nullable private final Consumer<LocalAccount> onAccountDelete; public AccountSwitcherAdapter(@NonNull Consumer<LocalAccount> onAccountClick, @Nullable Consumer<LocalAccount> onAccountDelete) { public AccountSwitcherAdapter(@NonNull Consumer<LocalAccount> onAccountClick) { this.onAccountClick = onAccountClick; this.onAccountDelete = onAccountDelete; setHasStableIds(true); } Loading @@ -42,18 +38,7 @@ public class AccountSwitcherAdapter extends RecyclerView.Adapter<AccountSwitcher @Override public void onBindViewHolder(@NonNull AccountSwitcherViewHolder holder, int position) { holder.bind(localAccounts.get(position), onAccountClick, (localAccount -> { if (onAccountDelete != null) { for (int i = 0; i < localAccounts.size(); i++) { if (localAccounts.get(i).getId() == localAccount.getId()) { localAccounts.remove(i); notifyItemRemoved(i); break; } } onAccountDelete.accept(localAccount); } })); holder.bind(localAccounts.get(position), onAccountClick); } @Override Loading
app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java +10 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ package it.niedermann.owncloud.notes.accountswitcher; import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.net.Uri; Loading @@ -19,9 +20,12 @@ import java.util.List; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.DialogAccountSwitcherBinding; import it.niedermann.owncloud.notes.manageaccounts.ManageAccountsActivity; import it.niedermann.owncloud.notes.model.LocalAccount; import it.niedermann.owncloud.notes.persistence.NotesDatabase; import static it.niedermann.owncloud.notes.android.activity.NotesListViewActivity.manage_account; public class AccountSwitcherDialog extends DialogFragment { private static final String KEY_CURRENT_ACCOUNT_ID = "current_account_id"; Loading Loading @@ -72,7 +76,7 @@ public class AccountSwitcherDialog extends DialogFragment { AccountSwitcherAdapter adapter = new AccountSwitcherAdapter((localAccount -> { accountSwitcherListener.onAccountChosen(localAccount); dismiss(); }), (localAccount) -> accountSwitcherListener.onAccountDeleted(localAccount)); })); binding.accountsList.setAdapter(adapter); List<LocalAccount> localAccounts = db.getAccounts(); for (LocalAccount localAccount : localAccounts) { Loading @@ -88,6 +92,11 @@ public class AccountSwitcherDialog extends DialogFragment { dismiss(); }); binding.manageAccounts.setOnClickListener((v) -> { requireActivity().startActivityForResult(new Intent(requireContext(), ManageAccountsActivity.class), manage_account); dismiss(); }); return new AlertDialog.Builder(requireContext()) .setView(binding.getRoot()) .create(); Loading
app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherViewHolder.java +2 −8 Original line number Diff line number Diff line Loading @@ -4,7 +4,6 @@ import android.net.Uri; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.util.Consumer; import androidx.recyclerview.widget.RecyclerView; Loading @@ -24,7 +23,7 @@ public class AccountSwitcherViewHolder extends RecyclerView.ViewHolder { binding = ItemAccountChooseBinding.bind(itemView); } public void bind(@NonNull LocalAccount localAccount, @NonNull Consumer<LocalAccount> onAccountClick, @Nullable Consumer<LocalAccount> onAccountDelete) { public void bind(@NonNull LocalAccount localAccount, @NonNull Consumer<LocalAccount> onAccountClick) { binding.accountItemLabel.setText(localAccount.getAccountName()); Glide.with(itemView.getContext()) .load(localAccount.getUrl() + "/index.php/avatar/" + Uri.encode(localAccount.getUserName()) + "/64") Loading @@ -32,11 +31,6 @@ public class AccountSwitcherViewHolder extends RecyclerView.ViewHolder { .apply(RequestOptions.circleCropTransform()) .into(binding.accountItemAvatar); itemView.setOnClickListener((v) -> onAccountClick.accept(localAccount)); if (onAccountDelete == null) { binding.delete.setVisibility(View.GONE); } else { binding.delete.setVisibility(View.VISIBLE); binding.delete.setOnClickListener((v) -> onAccountDelete.accept(localAccount)); } } }
app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +19 −3 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi private final static int show_single_note_cmd = 1; private final static int server_settings = 2; private final static int about = 3; public final static int manage_account = 4; /** * Used to detect the onResume() call after the import dialog has been displayed. Loading @@ -124,6 +125,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi private NavigationItem itemRecent; private NavigationItem itemFavorites; private NavigationItem itemUncategorized; @NonNull private Category navigationSelection = new Category(null, null); private String navigationOpen = ""; private ActionMode mActionMode; Loading Loading @@ -160,7 +162,10 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi navigationSelection = new Category(null, true); } } else { navigationSelection = (Category) savedInstanceState.getSerializable(SAVED_STATE_NAVIGATION_SELECTION); Object savedCategory = savedInstanceState.getSerializable(SAVED_STATE_NAVIGATION_SELECTION); if (savedCategory != null) { navigationSelection = (Category) savedCategory; } navigationOpen = savedInstanceState.getString(SAVED_STATE_NAVIGATION_OPEN); categoryAdapterSelectedItem = savedInstanceState.getString(SAVED_STATE_NAVIGATION_ADAPTER_SLECTION); } Loading Loading @@ -227,14 +232,21 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi } refreshLists(); fabCreate.show(); activityBinding.launchAccountSwitcher.setOnClickListener((v) -> AccountSwitcherDialog.newInstance(localAccount.getId()).show(getSupportFragmentManager(), AccountSwitcherDialog.class.getSimpleName())); activityBinding.launchAccountSwitcher.setOnClickListener((v) -> { if (localAccount == null) { handleNotAuthorizedAccount(); } else { AccountSwitcherDialog.newInstance(localAccount.getId()).show(getSupportFragmentManager(), AccountSwitcherDialog.class.getSimpleName()); } }); setupNavigationList(ADAPTER_KEY_RECENT); updateCurrentAccountAvatar(); } else { if (!notAuthorizedAccountHandled) { handleNotAuthorizedAccount(); } binding.navigationList.setAdapter(null); } updateCurrentAccountAvatar(); } private void handleNotAuthorizedAccount() { Loading Loading @@ -676,6 +688,10 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi // Recreate activity completely, because theme switching makes problems when only invalidating the views. // @see https://github.com/stefan-niedermann/nextcloud-notes/issues/529 recreate(); } else if (requestCode == manage_account) { if (resultCode == RESULT_FIRST_USER) { selectAccount(null); } } else { try { AccountImporter.onActivityResult(requestCode, resultCode, data, this, (ssoAccount) -> { Loading