Search in sources :

Example 1 with Account

use of it.niedermann.owncloud.notes.persistence.entity.Account in project nextcloud-notes by stefan-niedermann.

the class MainActivity method onCreate.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
    categoryViewModel = new ViewModelProvider(this).get(CategoryViewModel.class);
    CapabilitiesWorker.update(this);
    binding = DrawerLayoutBinding.inflate(getLayoutInflater());
    activityBinding = ActivityNotesListViewBinding.bind(binding.activityNotesListView.getRoot());
    setContentView(binding.getRoot());
    this.coordinatorLayout = binding.activityNotesListView.activityNotesListView;
    this.swipeRefreshLayout = binding.activityNotesListView.swiperefreshlayout;
    this.fabCreate = binding.activityNotesListView.fabCreate;
    this.listView = binding.activityNotesListView.recyclerView;
    gridView = isGridViewEnabled();
    if (!gridView || isDarkThemeActive(this)) {
        activityBinding.activityNotesListView.setBackgroundColor(ContextCompat.getColor(this, R.color.primary));
    }
    setupToolbars();
    setupNavigationList();
    setupNotesList();
    mainViewModel.getAccountsCount().observe(this, (count) -> {
        if (count == 0) {
            startActivityForResult(new Intent(this, ImportAccountActivity.class), ImportAccountActivity.REQUEST_CODE_IMPORT_ACCOUNT);
        } else {
            executor.submit(() -> {
                try {
                    final var account = mainViewModel.getLocalAccountByAccountName(SingleAccountHelper.getCurrentSingleSignOnAccount(getApplicationContext()).name);
                    runOnUiThread(() -> mainViewModel.postCurrentAccount(account));
                } catch (NextcloudFilesAppAccountNotFoundException e) {
                    // Verbose log output for https://github.com/stefan-niedermann/nextcloud-notes/issues/1256
                    runOnUiThread(() -> new AlertDialog.Builder(this).setTitle(NextcloudFilesAppAccountNotFoundException.class.getSimpleName()).setMessage(R.string.backup).setPositiveButton(R.string.simple_backup, (a, b) -> executor.submit(() -> {
                        final var modifiedNotes = new LinkedList<Note>();
                        for (final var account : mainViewModel.getAccounts()) {
                            modifiedNotes.addAll(mainViewModel.getLocalModifiedNotes(account.getId()));
                        }
                        if (modifiedNotes.size() == 1) {
                            final var note = modifiedNotes.get(0);
                            ShareUtil.openShareDialog(this, note.getTitle(), note.getContent());
                        } else {
                            ShareUtil.openShareDialog(this, getResources().getQuantityString(R.plurals.share_multiple, modifiedNotes.size(), modifiedNotes.size()), mainViewModel.collectNoteContents(modifiedNotes.stream().map(Note::getId).collect(Collectors.toList())));
                        }
                    })).setNegativeButton(R.string.simple_error, (a, b) -> {
                        final var ssoPreferences = AccountImporter.getSharedPreferences(getApplicationContext());
                        final var ssoPreferencesString = new StringBuilder().append("Current SSO account: ").append(ssoPreferences.getString("PREF_CURRENT_ACCOUNT_STRING", null)).append("\n").append("\n").append("SSO SharedPreferences: ").append("\n");
                        for (final var entry : ssoPreferences.getAll().entrySet()) {
                            ssoPreferencesString.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
                        }
                        ssoPreferencesString.append("\n").append("Available accounts in DB: ").append(TextUtils.join(", ", mainViewModel.getAccounts().stream().map(Account::getAccountName).collect(Collectors.toList())));
                        runOnUiThread(() -> ExceptionDialogFragment.newInstance(new RuntimeException(e.getMessage(), new RuntimeException(ssoPreferencesString.toString(), e))).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()));
                    }).show());
                } catch (NoCurrentAccountSelectedException e) {
                    runOnUiThread(() -> ExceptionDialogFragment.newInstance(e).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()));
                }
            });
        }
    });
    mainViewModel.hasMultipleAccountsConfigured().observe(this, hasMultipleAccountsConfigured -> canMoveNoteToAnotherAccounts = hasMultipleAccountsConfigured);
    mainViewModel.getSyncStatus().observe(this, syncStatus -> swipeRefreshLayout.setRefreshing(syncStatus));
    mainViewModel.getSyncErrors().observe(this, exceptions -> {
        if (mainViewModel.containsNonInfrastructureRelatedItems(exceptions)) {
            BrandedSnackbar.make(coordinatorLayout, R.string.error_synchronization, Snackbar.LENGTH_LONG).setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(exceptions).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())).show();
        }
    });
    mainViewModel.getSelectedCategory().observe(this, (selectedCategory) -> {
        binding.activityNotesListView.emptyContentView.getRoot().setVisibility(GONE);
        adapter.setShowCategory(selectedCategory.getType() == RECENT || selectedCategory.getType() == FAVORITES);
        fabCreate.show();
        switch(selectedCategory.getType()) {
            case RECENT:
                {
                    activityBinding.searchText.setText(getString(R.string.search_in_all));
                    break;
                }
            case FAVORITES:
                {
                    activityBinding.searchText.setText(getString(R.string.search_in_category, getString(R.string.label_favorites)));
                    break;
                }
            case UNCATEGORIZED:
                {
                    activityBinding.searchText.setText(getString(R.string.search_in_category, getString(R.string.action_uncategorized)));
                    break;
                }
            case DEFAULT_CATEGORY:
            default:
                {
                    final String category = selectedCategory.getCategory();
                    if (category == null) {
                        throw new IllegalStateException(NavigationCategory.class.getSimpleName() + " type is " + DEFAULT_CATEGORY + ", but category is null.");
                    }
                    activityBinding.searchText.setText(getString(R.string.search_in_category, NoteUtil.extendCategory(category)));
                    break;
                }
        }
        fabCreate.setOnClickListener((View view) -> {
            final var createIntent = new Intent(getApplicationContext(), EditNoteActivity.class);
            createIntent.putExtra(EditNoteActivity.PARAM_CATEGORY, selectedCategory);
            if (activityBinding.searchView.getQuery().length() > 0) {
                createIntent.putExtra(EditNoteActivity.PARAM_CONTENT, activityBinding.searchView.getQuery().toString());
                invalidateOptionsMenu();
            }
            startActivityForResult(createIntent, REQUEST_CODE_CREATE_NOTE);
        });
    });
    mainViewModel.getNotesListLiveData().observe(this, notes -> {
        // https://stackoverflow.com/a/37342327
        itemTouchHelper.attachToRecyclerView(null);
        itemTouchHelper.attachToRecyclerView(listView);
        adapter.setItemList(notes);
        binding.activityNotesListView.progressCircular.setVisibility(GONE);
        binding.activityNotesListView.emptyContentView.getRoot().setVisibility(notes.size() > 0 ? GONE : VISIBLE);
        // Remove deleted notes from the selection
        if (tracker.hasSelection()) {
            final var deletedNotes = new LinkedList<Long>();
            for (final var id : tracker.getSelection()) {
                if (notes.stream().filter(item -> !item.isSection()).map(item -> (Note) item).noneMatch(item -> item.getId() == id)) {
                    deletedNotes.add(id);
                }
            }
            for (final var id : deletedNotes) {
                tracker.deselect(id);
            }
        }
    });
    mainViewModel.getSearchTerm().observe(this, adapter::setHighlightSearchQuery);
    mainViewModel.getCategorySortingMethodOfSelectedCategory().observe(this, methodOfCategory -> {
        updateSortMethodIcon(methodOfCategory.second);
        activityBinding.sortingMethod.setOnClickListener((v) -> {
            if (methodOfCategory.first != null) {
                var newMethod = methodOfCategory.second;
                if (newMethod == CategorySortingMethod.SORT_LEXICOGRAPHICAL_ASC) {
                    newMethod = CategorySortingMethod.SORT_MODIFIED_DESC;
                } else {
                    newMethod = CategorySortingMethod.SORT_LEXICOGRAPHICAL_ASC;
                }
                final var modifyLiveData = mainViewModel.modifyCategoryOrder(methodOfCategory.first, newMethod);
                modifyLiveData.observe(this, (next) -> modifyLiveData.removeObservers(this));
            }
        });
    });
    mainViewModel.getNavigationCategories().observe(this, navigationItems -> this.adapterCategories.setItems(navigationItems));
    mainViewModel.getCurrentAccount().observe(this, (nextAccount) -> {
        fabCreate.hide();
        Glide.with(this).load(nextAccount.getUrl() + "/index.php/avatar/" + Uri.encode(nextAccount.getUserName()) + "/64").placeholder(R.drawable.ic_account_circle_grey_24dp).error(R.drawable.ic_account_circle_grey_24dp).apply(RequestOptions.circleCropTransform()).into(activityBinding.launchAccountSwitcher);
        mainViewModel.synchronizeNotes(nextAccount, new IResponseCallback<>() {

            @Override
            public void onSuccess(Void v) {
                Log.d(TAG, "Successfully synchronized notes for " + nextAccount.getAccountName());
            }

            @Override
            public void onError(@NonNull Throwable t) {
                runOnUiThread(() -> {
                    if (t instanceof IntendedOfflineException) {
                        Log.i(TAG, "Capabilities and notes not updated because " + nextAccount.getAccountName() + " is offline by intention.");
                    } else if (t instanceof NetworkErrorException) {
                        BrandedSnackbar.make(coordinatorLayout, getString(R.string.error_sync, getString(R.string.error_no_network)), Snackbar.LENGTH_LONG).show();
                    } else {
                        BrandedSnackbar.make(coordinatorLayout, R.string.error_synchronization, Snackbar.LENGTH_LONG).setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(t).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())).show();
                    }
                });
            }
        });
        fabCreate.show();
        activityBinding.launchAccountSwitcher.setOnClickListener((v) -> AccountSwitcherDialog.newInstance(nextAccount.getId()).show(getSupportFragmentManager(), AccountSwitcherDialog.class.getSimpleName()));
        if (menuAdapter == null) {
            menuAdapter = new MenuAdapter(getApplicationContext(), nextAccount, REQUEST_CODE_SERVER_SETTINGS, (menuItem) -> {
                @Nullable Integer resultCode = menuItem.getResultCode();
                if (resultCode == null) {
                    startActivity(menuItem.getIntent());
                } else {
                    startActivityForResult(menuItem.getIntent(), resultCode);
                }
            });
            binding.navigationMenu.setAdapter(menuAdapter);
        } else {
            menuAdapter.updateAccount(this, nextAccount);
        }
    });
}
Also used : AlertDialog(androidx.appcompat.app.AlertDialog) HttpURLConnection(java.net.HttpURLConnection) ImportAccountActivity(it.niedermann.owncloud.notes.importaccount.ImportAccountActivity) NotesApplication.isDarkThemeActive(it.niedermann.owncloud.notes.NotesApplication.isDarkThemeActive) Bundle(android.os.Bundle) BrandedSnackbar(it.niedermann.owncloud.notes.branding.BrandedSnackbar) NonNull(androidx.annotation.NonNull) NoteClickListener(it.niedermann.owncloud.notes.shared.model.NoteClickListener) Uri(android.net.Uri) NotesColorUtil.contrastRatioIsSufficient(it.niedermann.owncloud.notes.shared.util.NotesColorUtil.contrastRatioIsSufficient) AccountPickerListener(it.niedermann.owncloud.notes.accountpicker.AccountPickerListener) SDK_INT(android.os.Build.VERSION.SDK_INT) ItemSelectionTracker(it.niedermann.owncloud.notes.main.items.selection.ItemSelectionTracker) GridItemDecoration(it.niedermann.owncloud.notes.main.items.grid.GridItemDecoration) UNCATEGORIZED(it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.UNCATEGORIZED) IntendedOfflineException(it.niedermann.owncloud.notes.exception.IntendedOfflineException) ApiProvider(it.niedermann.owncloud.notes.persistence.ApiProvider) ActionBarDrawerToggle(androidx.appcompat.app.ActionBarDrawerToggle) ActivityNotesListViewBinding(it.niedermann.owncloud.notes.databinding.ActivityNotesListViewBinding) FloatingActionButton(com.google.android.material.floatingactionbutton.FloatingActionButton) ItemAdapter(it.niedermann.owncloud.notes.main.items.ItemAdapter) VISIBLE(android.view.View.VISIBLE) View(android.view.View) CategoryDialogFragment(it.niedermann.owncloud.notes.edit.category.CategoryDialogFragment) RecyclerView(androidx.recyclerview.widget.RecyclerView) ContextCompat(androidx.core.content.ContextCompat) TokenMismatchException(com.nextcloud.android.sso.exceptions.TokenMismatchException) Log(android.util.Log) AccountSwitcherDialog(it.niedermann.owncloud.notes.accountswitcher.AccountSwitcherDialog) NavigationAdapter(it.niedermann.owncloud.notes.main.navigation.NavigationAdapter) IResponseCallback(it.niedermann.owncloud.notes.shared.model.IResponseCallback) CoordinatorLayout(androidx.coordinatorlayout.widget.CoordinatorLayout) O(android.os.Build.VERSION_CODES.O) CategoryViewModel(it.niedermann.owncloud.notes.edit.category.CategoryViewModel) R(it.niedermann.owncloud.notes.R) SearchView(androidx.appcompat.widget.SearchView) PorterDuff(android.graphics.PorterDuff) Collectors(java.util.stream.Collectors) Executors(java.util.concurrent.Executors) NetworkErrorException(android.accounts.NetworkErrorException) AccountImporter(com.nextcloud.android.sso.AccountImporter) Nullable(androidx.annotation.Nullable) UnknownErrorException(com.nextcloud.android.sso.exceptions.UnknownErrorException) SingleAccountHelper(com.nextcloud.android.sso.helper.SingleAccountHelper) GONE(android.view.View.GONE) RECENT(it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT) LinearLayoutManager(androidx.recyclerview.widget.LinearLayoutManager) SearchManager(android.app.SearchManager) Snackbar(com.google.android.material.snackbar.Snackbar) StaggeredGridLayoutManager(androidx.recyclerview.widget.StaggeredGridLayoutManager) Account(it.niedermann.owncloud.notes.persistence.entity.Account) Note(it.niedermann.owncloud.notes.persistence.entity.Note) AlertDialog(androidx.appcompat.app.AlertDialog) LockedActivity(it.niedermann.owncloud.notes.LockedActivity) CategorySortingMethod(it.niedermann.owncloud.notes.shared.model.CategorySortingMethod) NotesApplication.isGridViewEnabled(it.niedermann.owncloud.notes.NotesApplication.isGridViewEnabled) NavigationClickListener(it.niedermann.owncloud.notes.main.navigation.NavigationClickListener) Intent(android.content.Intent) CapabilitiesWorker(it.niedermann.owncloud.notes.persistence.CapabilitiesWorker) DEFAULT_CATEGORY(it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.DEFAULT_CATEGORY) DrawableCompat(androidx.core.graphics.drawable.DrawableCompat) NextcloudFilesAppAccountNotFoundException(com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException) BrandingUtil.getSecondaryForegroundColorDependingOnTheme(it.niedermann.owncloud.notes.branding.BrandingUtil.getSecondaryForegroundColorDependingOnTheme) NavigationCategory(it.niedermann.owncloud.notes.shared.model.NavigationCategory) CustomAppGlideModule(it.niedermann.owncloud.notes.shared.util.CustomAppGlideModule) NoteUtil(it.niedermann.owncloud.notes.shared.util.NoteUtil) MenuAdapter(it.niedermann.owncloud.notes.main.menu.MenuAdapter) LinkedList(java.util.LinkedList) ExecutorService(java.util.concurrent.ExecutorService) RequestOptions(com.bumptech.glide.request.RequestOptions) ViewModelProvider(androidx.lifecycle.ViewModelProvider) ActivityCompat(androidx.core.app.ActivityCompat) SwipeRefreshLayout(androidx.swiperefreshlayout.widget.SwipeRefreshLayout) FAVORITES(it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES) DrawerLayoutBinding(it.niedermann.owncloud.notes.databinding.DrawerLayoutBinding) NotesListViewItemTouchHelper(it.niedermann.owncloud.notes.main.items.list.NotesListViewItemTouchHelper) GravityCompat(androidx.core.view.GravityCompat) AccountImportCancelledException(com.nextcloud.android.sso.exceptions.AccountImportCancelledException) NextcloudHttpRequestFailedException(com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException) CapabilitiesClient(it.niedermann.owncloud.notes.persistence.CapabilitiesClient) NavigationItem(it.niedermann.owncloud.notes.main.navigation.NavigationItem) TextUtils(android.text.TextUtils) AccountSwitcherListener(it.niedermann.owncloud.notes.accountswitcher.AccountSwitcherListener) ShareUtil(it.niedermann.owncloud.notes.shared.util.ShareUtil) ActionMode(androidx.appcompat.view.ActionMode) AnimatorInflater(android.animation.AnimatorInflater) Color(android.graphics.Color) ExceptionDialogFragment(it.niedermann.owncloud.notes.exception.ExceptionDialogFragment) SelectionTracker(androidx.recyclerview.selection.SelectionTracker) NoCurrentAccountSelectedException(com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException) Observer(androidx.lifecycle.Observer) Glide(com.bumptech.glide.Glide) EditNoteActivity(it.niedermann.owncloud.notes.edit.EditNoteActivity) SectionItemDecoration(it.niedermann.owncloud.notes.main.items.section.SectionItemDecoration) SSOUtil.askForNewAccount(it.niedermann.owncloud.notes.shared.util.SSOUtil.askForNewAccount) Account(it.niedermann.owncloud.notes.persistence.entity.Account) SSOUtil.askForNewAccount(it.niedermann.owncloud.notes.shared.util.SSOUtil.askForNewAccount) NavigationCategory(it.niedermann.owncloud.notes.shared.model.NavigationCategory) ViewModelProvider(androidx.lifecycle.ViewModelProvider) NextcloudFilesAppAccountNotFoundException(com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException) CategoryViewModel(it.niedermann.owncloud.notes.edit.category.CategoryViewModel) MenuAdapter(it.niedermann.owncloud.notes.main.menu.MenuAdapter) Intent(android.content.Intent) NoCurrentAccountSelectedException(com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException) View(android.view.View) RecyclerView(androidx.recyclerview.widget.RecyclerView) SearchView(androidx.appcompat.widget.SearchView) ImportAccountActivity(it.niedermann.owncloud.notes.importaccount.ImportAccountActivity) LinkedList(java.util.LinkedList) NetworkErrorException(android.accounts.NetworkErrorException) ExceptionDialogFragment(it.niedermann.owncloud.notes.exception.ExceptionDialogFragment) IntendedOfflineException(it.niedermann.owncloud.notes.exception.IntendedOfflineException) Note(it.niedermann.owncloud.notes.persistence.entity.Note)

Example 2 with Account

use of it.niedermann.owncloud.notes.persistence.entity.Account in project nextcloud-notes by stefan-niedermann.

the class ManageAccountsActivity method onChangeNotesPath.

private void onChangeNotesPath(@NonNull Account localAccount) {
    final var repository = NotesRepository.getInstance(getApplicationContext());
    final var editText = new EditText(this);
    final var wrapper = createDialogViewWrapper();
    final var dialog = new BrandedAlertDialogBuilder(this).setTitle(R.string.settings_notes_path).setMessage(R.string.settings_notes_path_description).setView(wrapper).setNeutralButton(android.R.string.cancel, null).setPositiveButton(R.string.action_edit_save, (v, d) -> new Thread(() -> {
        try {
            final var putSettingsCall = repository.putServerSettings(AccountImporter.getSingleSignOnAccount(this, localAccount.getAccountName()), new NotesSettings(editText.getText().toString(), null), getPreferredApiVersion(localAccount.getApiVersion()));
            putSettingsCall.enqueue(new Callback<>() {

                @Override
                public void onResponse(@NonNull Call<NotesSettings> call, @NonNull Response<NotesSettings> response) {
                    final var body = response.body();
                    if (response.isSuccessful() && body != null) {
                        runOnUiThread(() -> Toast.makeText(ManageAccountsActivity.this, getString(R.string.settings_notes_path_success, body.getNotesPath()), Toast.LENGTH_LONG).show());
                    } else {
                        runOnUiThread(() -> Toast.makeText(ManageAccountsActivity.this, getString(R.string.http_status_code, response.code()), Toast.LENGTH_LONG).show());
                    }
                }

                @Override
                public void onFailure(@NonNull Call<NotesSettings> call, @NonNull Throwable t) {
                    runOnUiThread(() -> ExceptionDialogFragment.newInstance(t).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()));
                }
            });
        } catch (NextcloudFilesAppAccountNotFoundException e) {
            ExceptionDialogFragment.newInstance(e).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName());
        }
    }).start()).show();
    try {
        repository.getServerSettings(AccountImporter.getSingleSignOnAccount(this, localAccount.getAccountName()), getPreferredApiVersion(localAccount.getApiVersion())).enqueue(new Callback<>() {

            @Override
            public void onResponse(@NonNull Call<NotesSettings> call, @NonNull Response<NotesSettings> response) {
                runOnUiThread(() -> {
                    final var body = response.body();
                    if (response.isSuccessful() && body != null) {
                        wrapper.removeAllViews();
                        final var editText = new EditText(ManageAccountsActivity.this);
                        editText.setText(body.getNotesPath());
                        wrapper.addView(editText);
                    } else {
                        dialog.dismiss();
                        ExceptionDialogFragment.newInstance(new NetworkErrorException(getString(R.string.http_status_code, response.code()))).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName());
                    }
                });
            }

            @Override
            public void onFailure(@NonNull Call<NotesSettings> call, @NonNull Throwable t) {
                runOnUiThread(() -> {
                    dialog.dismiss();
                    ExceptionDialogFragment.newInstance(t).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName());
                });
            }
        });
    } catch (NextcloudFilesAppAccountNotFoundException e) {
        dialog.dismiss();
        ExceptionDialogFragment.newInstance(e).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName());
    }
}
Also used : EditText(android.widget.EditText) AttrRes(androidx.annotation.AttrRes) Bundle(android.os.Bundle) AlertDialog(androidx.appcompat.app.AlertDialog) LockedActivity(it.niedermann.owncloud.notes.LockedActivity) ProgressBar(android.widget.ProgressBar) NonNull(androidx.annotation.NonNull) FrameLayout(android.widget.FrameLayout) Response(retrofit2.Response) NextcloudFilesAppAccountNotFoundException(com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException) SDK_INT(android.os.Build.VERSION.SDK_INT) Px(androidx.annotation.Px) LOLLIPOP_MR1(android.os.Build.VERSION_CODES.LOLLIPOP_MR1) ActivityManageAccountsBinding(it.niedermann.owncloud.notes.databinding.ActivityManageAccountsBinding) Toast(android.widget.Toast) NotesSettings(it.niedermann.owncloud.notes.shared.model.NotesSettings) IResponseCallback(it.niedermann.owncloud.notes.shared.model.IResponseCallback) ViewModelProvider(androidx.lifecycle.ViewModelProvider) R(it.niedermann.owncloud.notes.R) ViewGroup(android.view.ViewGroup) Spinner(android.widget.Spinner) ExceptionDialogFragment(it.niedermann.owncloud.notes.exception.ExceptionDialogFragment) NotesRepository(it.niedermann.owncloud.notes.persistence.NotesRepository) NetworkErrorException(android.accounts.NetworkErrorException) ArrayAdapter(android.widget.ArrayAdapter) AccountImporter(com.nextcloud.android.sso.AccountImporter) BrandedAlertDialogBuilder(it.niedermann.owncloud.notes.branding.BrandedAlertDialogBuilder) Nullable(androidx.annotation.Nullable) TypedValue(android.util.TypedValue) Callback(retrofit2.Callback) ApiVersionUtil.getPreferredApiVersion(it.niedermann.owncloud.notes.shared.util.ApiVersionUtil.getPreferredApiVersion) BrandedDeleteAlertDialogBuilder(it.niedermann.owncloud.notes.branding.BrandedDeleteAlertDialogBuilder) Call(retrofit2.Call) EditText(android.widget.EditText) Account(it.niedermann.owncloud.notes.persistence.entity.Account) Call(retrofit2.Call) NotesSettings(it.niedermann.owncloud.notes.shared.model.NotesSettings) BrandedAlertDialogBuilder(it.niedermann.owncloud.notes.branding.BrandedAlertDialogBuilder) Response(retrofit2.Response) NetworkErrorException(android.accounts.NetworkErrorException) ExceptionDialogFragment(it.niedermann.owncloud.notes.exception.ExceptionDialogFragment) IResponseCallback(it.niedermann.owncloud.notes.shared.model.IResponseCallback) Callback(retrofit2.Callback) NonNull(androidx.annotation.NonNull) NextcloudFilesAppAccountNotFoundException(com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException)

Example 3 with Account

use of it.niedermann.owncloud.notes.persistence.entity.Account in project nextcloud-notes by stefan-niedermann.

the class MainViewModel method restoreInstanceState.

public void restoreInstanceState() {
    Log.v(TAG, "[restoreInstanceState]");
    final Account account = state.get(KEY_CURRENT_ACCOUNT);
    if (account != null) {
        postCurrentAccount(account);
    }
    postSearchTerm(state.get(KEY_SEARCH_TERM));
    final NavigationCategory selectedCategory = state.get(KEY_SELECTED_CATEGORY);
    if (selectedCategory != null) {
        postSelectedCategory(selectedCategory);
        Log.v(TAG, "[restoreInstanceState] - selectedCategory: " + selectedCategory);
    }
    postExpandedCategory(state.get(KEY_EXPANDED_CATEGORY));
}
Also used : Account(it.niedermann.owncloud.notes.persistence.entity.Account) NavigationCategory(it.niedermann.owncloud.notes.shared.model.NavigationCategory)

Example 4 with Account

use of it.niedermann.owncloud.notes.persistence.entity.Account in project nextcloud-notes by stefan-niedermann.

the class NotesRepository method addAccount.

// Accounts
@AnyThread
public LiveData<ImportStatus> addAccount(@NonNull String url, @NonNull String username, @NonNull String accountName, @NonNull Capabilities capabilities, @Nullable String displayName, @NonNull IResponseCallback<Account> callback) {
    final var account = db.getAccountDao().getAccountById(db.getAccountDao().insert(new Account(url, username, accountName, displayName, capabilities)));
    if (account == null) {
        callback.onError(new Exception("Could not read created account."));
    } else {
        if (isSyncPossible()) {
            syncActive.put(account.getId(), true);
            try {
                Log.d(TAG, "… starting now");
                final NotesImportTask importTask = new NotesImportTask(context, this, account, importExecutor, apiProvider);
                return importTask.importNotes(new IResponseCallback<>() {

                    @Override
                    public void onSuccess(Void result) {
                        callback.onSuccess(account);
                    }

                    @Override
                    public void onError(@NonNull Throwable t) {
                        callback.onError(t);
                    }
                });
            } catch (NextcloudFilesAppAccountNotFoundException e) {
                Log.e(TAG, "… Could not find " + SingleSignOnAccount.class.getSimpleName() + " for account name " + account.getAccountName());
                callback.onError(e);
            }
        } else {
            callback.onError(new NetworkErrorException());
        }
    }
    return new MutableLiveData<>(new ImportStatus());
}
Also used : Account(it.niedermann.owncloud.notes.persistence.entity.Account) SingleSignOnAccount(com.nextcloud.android.sso.model.SingleSignOnAccount) SingleSignOnAccount(com.nextcloud.android.sso.model.SingleSignOnAccount) NetworkErrorException(android.accounts.NetworkErrorException) NextcloudFilesAppAccountNotFoundException(com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException) NoCurrentAccountSelectedException(com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException) NetworkErrorException(android.accounts.NetworkErrorException) ImportStatus(it.niedermann.owncloud.notes.shared.model.ImportStatus) MutableLiveData(androidx.lifecycle.MutableLiveData) NextcloudFilesAppAccountNotFoundException(com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException) AnyThread(androidx.annotation.AnyThread)

Example 5 with Account

use of it.niedermann.owncloud.notes.persistence.entity.Account in project nextcloud-notes by stefan-niedermann.

the class NoteListWidgetFactory method getViewAt.

@Override
public RemoteViews getViewAt(int position) {
    final RemoteViews note_content;
    if (position == 0) {
        final Account localAccount = repo.getAccountById(data.getAccountId());
        final Intent openIntent = new Intent(Intent.ACTION_MAIN).setComponent(new ComponentName(context.getPackageName(), MainActivity.class.getName()));
        final Intent createIntent = new Intent(context, EditNoteActivity.class);
        final Bundle extras = new Bundle();
        extras.putSerializable(PARAM_CATEGORY, data.getMode() == MODE_DISPLAY_STARRED ? new NavigationCategory(ENavigationCategoryType.FAVORITES) : new NavigationCategory(localAccount.getId(), data.getCategory()));
        extras.putLong(EditNoteActivity.PARAM_ACCOUNT_ID, data.getAccountId());
        createIntent.putExtras(extras);
        createIntent.setData(Uri.parse(createIntent.toUri(Intent.URI_INTENT_SCHEME)));
        note_content = new RemoteViews(context.getPackageName(), R.layout.widget_entry_add);
        note_content.setOnClickFillInIntent(R.id.widget_entry_content_tv, openIntent);
        note_content.setOnClickFillInIntent(R.id.widget_entry_fav_icon, createIntent);
        note_content.setTextViewText(R.id.widget_entry_content_tv, getCategoryTitle(context, data.getMode(), data.getCategory()));
        note_content.setImageViewResource(R.id.widget_entry_fav_icon, R.drawable.ic_add_blue_24dp);
        note_content.setInt(R.id.widget_entry_fav_icon, "setColorFilter", NotesColorUtil.contrastRatioIsSufficient(ContextCompat.getColor(context, R.color.widget_background), localAccount.getColor()) ? localAccount.getColor() : ContextCompat.getColor(context, R.color.widget_foreground));
    } else {
        position--;
        if (position > dbNotes.size() - 1 || dbNotes.get(position) == null) {
            Log.e(TAG, "Could not find position \"" + position + "\" in dbNotes list.");
            return null;
        }
        final Note note = dbNotes.get(position);
        final Intent fillInIntent = new Intent(context, EditNoteActivity.class);
        final Bundle extras = new Bundle();
        extras.putLong(EditNoteActivity.PARAM_NOTE_ID, note.getId());
        extras.putLong(EditNoteActivity.PARAM_ACCOUNT_ID, note.getAccountId());
        fillInIntent.putExtras(extras);
        fillInIntent.setData(Uri.parse(fillInIntent.toUri(Intent.URI_INTENT_SCHEME)));
        note_content = new RemoteViews(context.getPackageName(), R.layout.widget_entry);
        note_content.setOnClickFillInIntent(R.id.widget_note_list_entry, fillInIntent);
        note_content.setTextViewText(R.id.widget_entry_content_tv, note.getTitle());
        note_content.setImageViewResource(R.id.widget_entry_fav_icon, note.getFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp);
    }
    return note_content;
}
Also used : Account(it.niedermann.owncloud.notes.persistence.entity.Account) RemoteViews(android.widget.RemoteViews) Bundle(android.os.Bundle) NavigationCategory(it.niedermann.owncloud.notes.shared.model.NavigationCategory) Note(it.niedermann.owncloud.notes.persistence.entity.Note) Intent(android.content.Intent) ComponentName(android.content.ComponentName)

Aggregations

Account (it.niedermann.owncloud.notes.persistence.entity.Account)16 Capabilities (it.niedermann.owncloud.notes.shared.model.Capabilities)7 Bundle (android.os.Bundle)6 Test (org.junit.Test)6 NetworkErrorException (android.accounts.NetworkErrorException)5 NonNull (androidx.annotation.NonNull)5 AlertDialog (androidx.appcompat.app.AlertDialog)5 NextcloudFilesAppAccountNotFoundException (com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException)5 R (it.niedermann.owncloud.notes.R)5 Intent (android.content.Intent)4 SDK_INT (android.os.Build.VERSION.SDK_INT)4 Nullable (androidx.annotation.Nullable)4 ViewModelProvider (androidx.lifecycle.ViewModelProvider)4 AccountImporter (com.nextcloud.android.sso.AccountImporter)4 LockedActivity (it.niedermann.owncloud.notes.LockedActivity)4 ExceptionDialogFragment (it.niedermann.owncloud.notes.exception.ExceptionDialogFragment)4 Note (it.niedermann.owncloud.notes.persistence.entity.Note)4 IResponseCallback (it.niedermann.owncloud.notes.shared.model.IResponseCallback)4 Uri (android.net.Uri)3 SingleSignOnAccount (com.nextcloud.android.sso.model.SingleSignOnAccount)3