Search in sources :

Example 1 with Book

use of com.orgzly.android.db.entity.Book in project orgzly-android by orgzly.

the class MainActivity method setupViewModel.

private void setupViewModel() {
    sharedMainActivityViewModel.getDrawerLockState().observe(this, isLocked -> {
        DrawerLayout layout = mDrawerLayout;
        if (layout != null) {
            if (isLocked == null || !isLocked) {
                layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            } else {
                layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            }
        }
    });
    sharedMainActivityViewModel.getFragmentState().observe(this, state -> {
        if (BuildConfig.LOG_DEBUG)
            LogUtils.d(TAG, "Observed fragment state: " + state);
        if (state != null) {
            getSupportActionBar().setTitle(state.getTitle());
            // Clean up whitespace for multi-line query
            CharSequence subTitle = state.getSubTitle();
            if (subTitle != null) {
                subTitle = subTitle.toString().replaceAll("\\s{2,}", " ");
            }
            getSupportActionBar().setSubtitle(subTitle);
            drawerNavigationView.updateActiveFragment(state.getTag());
            /* Update floating action button. */
            MainFab.updateFab(this, state.getTag(), state.getSelectionCount());
        }
    });
    viewModel.getOpenNoteWithPropertyRequestEvent().observeSingle(this, pair -> {
        if (pair != null) {
            UseCase action = pair.getFirst();
            UseCaseResult result = pair.getSecond();
            if (action instanceof NoteFindWithProperty) {
                NoteFindWithProperty thisAction = (NoteFindWithProperty) action;
                if (result.getUserData() != null) {
                    NoteDao.NoteIdBookId note = (NoteDao.NoteIdBookId) result.getUserData();
                    DisplayManager.displayExistingNote(getSupportFragmentManager(), note.getBookId(), note.getNoteId());
                } else {
                    showSnackbar(getString(R.string.no_such_link_target, thisAction.getName(), thisAction.getValue()));
                }
            }
        }
    });
    viewModel.getOpenFileLinkRequestEvent().observeSingle(this, result -> {
        if (result != null && result.getUserData() != null) {
            Object userData = result.getUserData();
            if (userData instanceof Book) {
                Book book = (Book) userData;
                Intent intent = new Intent(AppIntent.ACTION_OPEN_BOOK);
                intent.putExtra(AppIntent.EXTRA_BOOK_ID, book.getId());
                LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
                if (BuildConfig.LOG_DEBUG)
                    LogUtils.d(TAG, "sending intent", intent);
            } else if (userData instanceof File) {
                File file = (File) userData;
                openFileIfExists(file);
            }
        }
    });
    viewModel.getOpenNoteRequestEvent().observeSingle(this, note -> MainActivity.openSpecificNote(note.getPosition().getBookId(), note.getId()));
    viewModel.getSetBookLinkRequestEvent().observeSingle(this, result -> {
        Book book = result.getBook();
        List<Repo> links = result.getLinks();
        CharSequence[] urls = result.getUrls();
        int checked = result.getSelected();
        if (links.isEmpty()) {
            showSnackbarWithReposLink(getString(R.string.no_repos));
        } else {
            ArrayAdapter<Repo> adapter = new ArrayAdapter<>(this, R.layout.item_repo, R.id.item_repo_url);
            adapter.addAll(links);
            dialog = new AlertDialog.Builder(this).setTitle(R.string.book_link).setSingleChoiceItems(urls, checked, (d, which) -> {
                mSyncFragment.run(new BookLinkUpdate(book.getId(), links.get(which)));
                dialog.dismiss();
                dialog = null;
            }).setNeutralButton(R.string.remove_notebook_link, (dialog, which) -> {
                mSyncFragment.run(new BookLinkUpdate(book.getId()));
            }).setNegativeButton(R.string.cancel, null).show();
        }
    });
    viewModel.getSavedSearchedExportEvent().observeSingle(this, count -> {
        showSnackbar(getResources().getQuantityString(R.plurals.exported_searches, count, count));
    });
    viewModel.getSavedSearchedImportEvent().observeSingle(this, count -> {
        showSnackbar(getResources().getQuantityString(R.plurals.imported_searches, count, count));
    });
    viewModel.getErrorEvent().observeSingle(this, error -> {
        if (error != null) {
            showSnackbar(error.getLocalizedMessage());
        }
    });
}
Also used : Bundle(android.os.Bundle) NonNull(androidx.annotation.NonNull) Uri(android.net.Uri) NoteDelete(com.orgzly.android.usecase.NoteDelete) UseCase(com.orgzly.android.usecase.UseCase) ActivityUtils(com.orgzly.android.ui.util.ActivityUtils) Query(com.orgzly.android.query.Query) Handler(android.os.Handler) Fragment(androidx.fragment.app.Fragment) BookFormat(com.orgzly.android.BookFormat) DrawerNavigationView(com.orgzly.android.ui.drawer.DrawerNavigationView) NoteUpdateState(com.orgzly.android.usecase.NoteUpdateState) NoteFindWithProperty(com.orgzly.android.usecase.NoteFindWithProperty) IntentFilter(android.content.IntentFilter) Set(java.util.Set) SearchView(androidx.appcompat.widget.SearchView) Book(com.orgzly.android.db.entity.Book) BuildConfig(com.orgzly.BuildConfig) CommonActivity(com.orgzly.android.ui.CommonActivity) Note(com.orgzly.android.db.entity.Note) BookImportFromUri(com.orgzly.android.usecase.BookImportFromUri) DottedQueryBuilder(com.orgzly.android.query.user.DottedQueryBuilder) DrawerLayout(androidx.drawerlayout.widget.DrawerLayout) NotePaste(com.orgzly.android.usecase.NotePaste) BookExportToUri(com.orgzly.android.usecase.BookExportToUri) SavedSearchUpdate(com.orgzly.android.usecase.SavedSearchUpdate) NoteDao(com.orgzly.android.db.dao.NoteDao) SavedSearchFragment(com.orgzly.android.ui.savedsearch.SavedSearchFragment) R(com.orgzly.R) SyncService(com.orgzly.android.sync.SyncService) Menu(android.view.Menu) NoteFragment(com.orgzly.android.ui.note.NoteFragment) ActionModeListener(com.orgzly.android.ui.ActionModeListener) BookFragment(com.orgzly.android.ui.notes.book.BookFragment) ViewModelProvider(androidx.lifecycle.ViewModelProvider) NoteDemote(com.orgzly.android.usecase.NoteDemote) IOException(java.io.IOException) SavedSearchMoveUp(com.orgzly.android.usecase.SavedSearchMoveUp) File(java.io.File) ArrayAdapter(android.widget.ArrayAdapter) NotePromote(com.orgzly.android.usecase.NotePromote) Configuration(android.content.res.Configuration) BottomActionBar(com.orgzly.android.ui.BottomActionBar) Notifications(com.orgzly.android.ui.notifications.Notifications) LogUtils(com.orgzly.android.util.LogUtils) SavedSearchCreate(com.orgzly.android.usecase.SavedSearchCreate) BookForceSave(com.orgzly.android.usecase.BookForceSave) NoteUpdateDeadlineTime(com.orgzly.android.usecase.NoteUpdateDeadlineTime) SavedSearchExport(com.orgzly.android.usecase.SavedSearchExport) BookSparseTreeForNote(com.orgzly.android.usecase.BookSparseTreeForNote) ActionBarDrawerToggle(androidx.appcompat.app.ActionBarDrawerToggle) View(android.view.View) NoteMove(com.orgzly.android.usecase.NoteMove) NoteUpdateStateToggle(com.orgzly.android.usecase.NoteUpdateStateToggle) BroadcastReceiver(android.content.BroadcastReceiver) ViewGroup(android.view.ViewGroup) AlertDialog(android.app.AlertDialog) Nullable(org.jetbrains.annotations.Nullable) Repo(com.orgzly.android.db.entity.Repo) List(java.util.List) App(com.orgzly.android.App) BookCreate(com.orgzly.android.usecase.BookCreate) Toolbar(androidx.appcompat.widget.Toolbar) BookPrefaceFragment(com.orgzly.android.ui.notes.book.BookPrefaceFragment) BookImportGettingStarted(com.orgzly.android.usecase.BookImportGettingStarted) SimpleOneLinerDialog(com.orgzly.android.ui.dialogs.SimpleOneLinerDialog) BooksFragment(com.orgzly.android.ui.books.BooksFragment) ReposActivity(com.orgzly.android.ui.repos.ReposActivity) NotNull(org.jetbrains.annotations.NotNull) Snackbar(com.google.android.material.snackbar.Snackbar) OrgDateTime(com.orgzly.org.datetime.OrgDateTime) AutoSync(com.orgzly.android.sync.AutoSync) BookExport(com.orgzly.android.usecase.BookExport) Context(android.content.Context) UseCaseRunner(com.orgzly.android.usecase.UseCaseRunner) SavedSearchMoveDown(com.orgzly.android.usecase.SavedSearchMoveDown) NavigationView(com.google.android.material.navigation.NavigationView) Intent(android.content.Intent) LocalBroadcastManager(androidx.localbroadcastmanager.content.LocalBroadcastManager) DisplayManager(com.orgzly.android.ui.DisplayManager) AppPermissions(com.orgzly.android.util.AppPermissions) MenuItem(android.view.MenuItem) SettingsActivity(com.orgzly.android.ui.settings.SettingsActivity) Lifecycle(androidx.lifecycle.Lifecycle) NoteCut(com.orgzly.android.usecase.NoteCut) AppPreferences(com.orgzly.android.prefs.AppPreferences) LifecycleOwner(androidx.lifecycle.LifecycleOwner) AppIntent(com.orgzly.android.AppIntent) SavedSearchDelete(com.orgzly.android.usecase.SavedSearchDelete) Place(com.orgzly.android.ui.Place) OutputStream(java.io.OutputStream) SavedSearchesFragment(com.orgzly.android.ui.savedsearches.SavedSearchesFragment) NotesClipboard(com.orgzly.android.db.NotesClipboard) BookLinkUpdate(com.orgzly.android.usecase.BookLinkUpdate) GravityCompat(androidx.core.view.GravityCompat) SavedSearch(com.orgzly.android.db.entity.SavedSearch) ActionMode(androidx.appcompat.view.ActionMode) NotePlace(com.orgzly.android.ui.NotePlace) NoteCopy(com.orgzly.android.usecase.NoteCopy) UseCaseResult(com.orgzly.android.usecase.UseCaseResult) BookForceLoad(com.orgzly.android.usecase.BookForceLoad) Condition(com.orgzly.android.query.Condition) BookUpdatePreface(com.orgzly.android.usecase.BookUpdatePreface) NoteUpdateScheduledTime(com.orgzly.android.usecase.NoteUpdateScheduledTime) BookName(com.orgzly.android.BookName) NoteDao(com.orgzly.android.db.dao.NoteDao) DottedQueryBuilder(com.orgzly.android.query.user.DottedQueryBuilder) UseCase(com.orgzly.android.usecase.UseCase) UseCaseResult(com.orgzly.android.usecase.UseCaseResult) Intent(android.content.Intent) AppIntent(com.orgzly.android.AppIntent) NoteFindWithProperty(com.orgzly.android.usecase.NoteFindWithProperty) Repo(com.orgzly.android.db.entity.Repo) Book(com.orgzly.android.db.entity.Book) BookLinkUpdate(com.orgzly.android.usecase.BookLinkUpdate) DrawerLayout(androidx.drawerlayout.widget.DrawerLayout) File(java.io.File) ArrayAdapter(android.widget.ArrayAdapter)

Example 2 with Book

use of com.orgzly.android.db.entity.Book in project orgzly-android by orgzly.

the class SyncTest method testDummyShouldNotBeSavedWhenHavingOneRepo.

@Test
public void testDummyShouldNotBeSavedWhenHavingOneRepo() {
    Repo repoA = testUtils.setupRepo(RepoType.MOCK, "mock://repo-a");
    Repo repoB = testUtils.setupRepo(RepoType.MOCK, "mock://repo-b");
    testUtils.setupRook(repoA, "mock://repo-a/booky.org", "", "1abcdef", 1400067155);
    testUtils.setupRook(repoB, "mock://repo-b/booky.org", "", "2abcdef", 1400067156);
    Book book;
    Map<String, BookNamesake> namesakes;
    namesakes = testUtils.sync();
    book = dataRepository.getBook("booky");
    assertEquals(BookSyncStatus.DUMMY_WITHOUT_LINK_AND_MULTIPLE_ROOKS, namesakes.get("booky").getStatus());
    assertTrue(book.isDummy());
    testUtils.deleteRepo("mock://repo-a");
    testUtils.deleteRepo("mock://repo-b");
    testUtils.setupRepo(RepoType.MOCK, "mock://repo-c");
    namesakes = testUtils.sync();
    book = dataRepository.getBook("booky");
    assertEquals(BookSyncStatus.ONLY_DUMMY, namesakes.get("booky").getStatus());
    // TODO: We should delete it, no point of having a dummy and no remote book
    assertTrue(book.isDummy());
}
Also used : Repo(com.orgzly.android.db.entity.Repo) Book(com.orgzly.android.db.entity.Book) BookNamesake(com.orgzly.android.sync.BookNamesake) OrgzlyTest(com.orgzly.android.OrgzlyTest) Test(org.junit.Test)

Example 3 with Book

use of com.orgzly.android.db.entity.Book in project orgzly-android by orgzly.

the class ShareActivity method getDataFromIntent.

public Data getDataFromIntent(Intent intent) {
    Data data = new Data();
    mError = null;
    String action = intent.getAction();
    String type = intent.getType();
    if (action == null) {
    // mError = getString(R.string.share_action_not_set);
    } else if (type == null) {
    // mError = getString(R.string.share_type_not_set);
    } else if (action.equals(Intent.ACTION_SEND)) {
        if (type.startsWith("text/")) {
            if (intent.hasExtra(Intent.EXTRA_TEXT)) {
                data.title = intent.getStringExtra(Intent.EXTRA_TEXT);
            } else if (intent.hasExtra(Intent.EXTRA_STREAM)) {
                Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
                data.title = uri.getLastPathSegment();
                /*
                     * Store file's content as note content.
                     */
                try {
                    File file = new File(uri.getPath());
                    /* Don't read large files. */
                    if (file.length() > MAX_TEXT_FILE_LENGTH_FOR_CONTENT) {
                        mError = "File has " + file.length() + " bytes (refusing to read files larger then " + MAX_TEXT_FILE_LENGTH_FOR_CONTENT + " bytes)";
                    } else {
                        data.content = MiscUtils.readStringFromFile(file);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    mError = "Failed reading the content of " + uri.toString() + ": " + e.toString();
                }
            }
            if (data.title != null && data.content == null && intent.hasExtra(Intent.EXTRA_SUBJECT)) {
                data.content = data.title;
                data.title = intent.getStringExtra(Intent.EXTRA_SUBJECT);
            }
            if (intent.hasExtra(AppIntent.EXTRA_QUERY_STRING)) {
                Query query = new DottedQueryParser().parse(intent.getStringExtra(AppIntent.EXTRA_QUERY_STRING));
                String bookName = QueryUtils.extractFirstBookNameFromQuery(query.getCondition());
                if (bookName != null) {
                    Book book = dataRepository.getBook(bookName);
                    if (book != null) {
                        data.bookId = book.getId();
                    }
                }
            }
            if (intent.hasExtra(AppIntent.EXTRA_BOOK_ID)) {
                data.bookId = intent.getLongExtra(AppIntent.EXTRA_BOOK_ID, 0L);
            }
        } else if (type.startsWith("image/")) {
            // Handle single image being sent
            handleSendImage(intent, data);
        } else {
            mError = getString(R.string.share_type_not_supported, type);
        }
    } else if (action.equals("com.google.android.gm.action.AUTO_SEND")) {
        if (type.startsWith("text/") && intent.hasExtra(Intent.EXTRA_TEXT)) {
            data.title = intent.getStringExtra(Intent.EXTRA_TEXT);
        }
    } else {
        mError = getString(R.string.share_action_not_supported, action);
    }
    /* Make sure that title is never empty. */
    if (data.title == null) {
        data.title = "";
    }
    return data;
}
Also used : Query(com.orgzly.android.query.Query) Book(com.orgzly.android.db.entity.Book) DottedQueryParser(com.orgzly.android.query.user.DottedQueryParser) IOException(java.io.IOException) Uri(android.net.Uri) File(java.io.File)

Example 4 with Book

use of com.orgzly.android.db.entity.Book in project orgzly-android by orgzly.

the class TemplateChooserActivity method onBookClicked.

@Override
public void onBookClicked(long bookId) {
    if (action == null) {
        return;
    }
    if (!action.equals(Intent.ACTION_CREATE_SHORTCUT)) {
        return;
    }
    Book book = dataRepository.getBook(bookId);
    if (book == null) {
        Toast.makeText(this, R.string.book_does_not_exist_anymore, Toast.LENGTH_SHORT).show();
        setResult(RESULT_CANCELED);
        finish();
        return;
    }
    String id = "template-" + bookId;
    String name = book.getName();
    String title = BookUtils.getFragmentTitleForBook(book);
    Intent launchIntent = ShareActivity.createNewNoteInNotebookIntent(this, bookId);
    IconCompat icon = createIcon();
    ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(this, id).setShortLabel(name).setLongLabel(title).setIcon(icon).setIntent(launchIntent).build();
    setResult(RESULT_OK, ShortcutManagerCompat.createShortcutResultIntent(this, shortcut));
    finish();
}
Also used : Book(com.orgzly.android.db.entity.Book) IconCompat(androidx.core.graphics.drawable.IconCompat) Intent(android.content.Intent) ShortcutInfoCompat(androidx.core.content.pm.ShortcutInfoCompat)

Example 5 with Book

use of com.orgzly.android.db.entity.Book in project orgzly-android by orgzly.

the class MainActivity method setupSearchView.

/**
 * SearchView setup and query text listeners.
 * TODO: http://developer.android.com/training/search/setup.html
 */
private void setupSearchView(Menu menu) {
    final MenuItem searchItem = menu.findItem(R.id.activity_action_search);
    final SearchView searchView = (SearchView) searchItem.getActionView();
    searchView.setQueryHint(getString(R.string.search_hint));
    /* When user starts the search, fill the search box with text depending on current fragment. */
    searchView.setOnSearchClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            /* Make search as wide as possible. */
            ViewGroup.LayoutParams layoutParams = searchView.getLayoutParams();
            layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
            /* For Query fragment, fill the box with full query. */
            String q = DisplayManager.getDisplayedQuery(getSupportFragmentManager());
            if (q != null) {
                searchView.setQuery(q + " ", false);
            } else {
                /* If searching from book, add book name to query. */
                Book book = getActiveFragmentBook();
                if (book != null) {
                    DottedQueryBuilder builder = new DottedQueryBuilder();
                    String query = builder.build(new Query(new Condition.InBook(book.getName())));
                    searchView.setQuery(query + " ", false);
                }
            }
        }
    });
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextChange(String str) {
            return false;
        }

        @Override
        public boolean onQueryTextSubmit(String str) {
            if (BuildConfig.LOG_DEBUG)
                LogUtils.d(TAG, str);
            /* Close search. */
            searchItem.collapseActionView();
            DisplayManager.displayQuery(getSupportFragmentManager(), str.trim());
            return true;
        }
    });
}
Also used : Condition(com.orgzly.android.query.Condition) Query(com.orgzly.android.query.Query) MenuItem(android.view.MenuItem) DrawerNavigationView(com.orgzly.android.ui.drawer.DrawerNavigationView) SearchView(androidx.appcompat.widget.SearchView) View(android.view.View) NavigationView(com.google.android.material.navigation.NavigationView) DottedQueryBuilder(com.orgzly.android.query.user.DottedQueryBuilder) SearchView(androidx.appcompat.widget.SearchView) Book(com.orgzly.android.db.entity.Book)

Aggregations

Book (com.orgzly.android.db.entity.Book)7 Intent (android.content.Intent)3 Uri (android.net.Uri)2 MenuItem (android.view.MenuItem)2 View (android.view.View)2 SearchView (androidx.appcompat.widget.SearchView)2 ShortcutInfoCompat (androidx.core.content.pm.ShortcutInfoCompat)2 IconCompat (androidx.core.graphics.drawable.IconCompat)2 NavigationView (com.google.android.material.navigation.NavigationView)2 AppIntent (com.orgzly.android.AppIntent)2 OrgzlyTest (com.orgzly.android.OrgzlyTest)2 Repo (com.orgzly.android.db.entity.Repo)2 Query (com.orgzly.android.query.Query)2 File (java.io.File)2 AlertDialog (android.app.AlertDialog)1 BroadcastReceiver (android.content.BroadcastReceiver)1 Context (android.content.Context)1 IntentFilter (android.content.IntentFilter)1 Configuration (android.content.res.Configuration)1 Bundle (android.os.Bundle)1