mirror of
https://github.com/nextcloud/notes-android.git
synced 2024-11-23 13:26:15 +03:00
parent
287300a94f
commit
cd90f4dc84
8 changed files with 77 additions and 91 deletions
|
@ -113,6 +113,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, V
|
|||
public static final String CREATED_NOTE = "it.niedermann.owncloud.notes.created_notes";
|
||||
public static final String ADAPTER_KEY_RECENT = "recent";
|
||||
public static final String ADAPTER_KEY_STARRED = "starred";
|
||||
public static final String ADAPTER_KEY_UNCATEGORIZED = "uncategorized";
|
||||
|
||||
protected ItemAdapter adapter;
|
||||
|
||||
|
|
|
@ -157,8 +157,7 @@ public class MainViewModel extends AndroidViewModel {
|
|||
@NonNull
|
||||
public LiveData<List<NavigationItem>> getNavigationCategories(String navigationOpen) {
|
||||
Account currentAccount = getCurrentAccount().getValue();
|
||||
NavigationCategory selectedCategory = getSelectedCategory().getValue();
|
||||
if (currentAccount != null && selectedCategory != null) {
|
||||
if (currentAccount != null) {
|
||||
return distinctUntilChanged(
|
||||
map(db.getCategoryDao().getCategoriesLiveData(currentAccount.getId()), fromDatabase -> {
|
||||
List<NavigationItem.CategoryNavigationItem> categories = convertToCategoryNavigationItem(getApplication(), db.getCategoryDao().getCategories(currentAccount.getId()));
|
||||
|
|
|
@ -17,6 +17,7 @@ import java.util.List;
|
|||
|
||||
import it.niedermann.owncloud.notes.R;
|
||||
import it.niedermann.owncloud.notes.branding.BrandingUtil;
|
||||
import it.niedermann.owncloud.notes.main.MainActivity;
|
||||
|
||||
import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.UNCATEGORIZED;
|
||||
|
||||
|
@ -75,6 +76,7 @@ public class NavigationAdapter extends RecyclerView.Adapter<NavigationViewHolder
|
|||
public void setItems(@NonNull List<NavigationItem> items) {
|
||||
for (NavigationItem item : items) {
|
||||
if (TextUtils.isEmpty(item.label)) {
|
||||
item.id = MainActivity.ADAPTER_KEY_UNCATEGORIZED;
|
||||
item.label = context.getString(R.string.action_uncategorized);
|
||||
item.icon = NavigationAdapter.ICON_NOFOLDER;
|
||||
item.type = UNCATEGORIZED;
|
||||
|
|
|
@ -468,7 +468,6 @@ public abstract class NotesDatabase extends RoomDatabase {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Modifies the sorting method for one category, the category can be normal category or
|
||||
* one of "All notes", "Favorite", and "Uncategorized".
|
||||
|
|
|
@ -28,7 +28,6 @@ public interface NoteDao {
|
|||
@Query("DELETE FROM NOTE WHERE accountId = :accountId")
|
||||
int deleteByAccountId(Long accountId);
|
||||
|
||||
|
||||
@Query("SELECT NOTE.id, NOTE.accountId, NOTE.title, NOTE.excerpt, NOTE.favorite, NOTE.modified, CATEGORY.title as 'category' FROM NOTE INNER JOIN CATEGORY ON categoryId = CATEGORY.id WHERE NOTE.accountId = :accountId AND status != 'LOCAL_DELETED' AND ( " +
|
||||
"NOTE.title LIKE :query OR content LIKE :query OR CATEGORY.title LIKE :query) AND (CATEGORY.title = :category OR CATEGORY.title LIKE :category + '/%' " +
|
||||
") ORDER BY categoryId, favorite DESC, :sortingMethod")
|
||||
|
@ -46,15 +45,6 @@ public interface NoteDao {
|
|||
"NOTE.title LIKE :query OR content LIKE :query OR CATEGORY.title LIKE :query) ORDER BY favorite DESC, categoryId DESC, :sortingMethod")
|
||||
LiveData<List<NoteWithCategory>> searchRecent(long accountId, String query, String sortingMethod);
|
||||
|
||||
|
||||
/**
|
||||
* Returns a list of all Notes in the Database
|
||||
*
|
||||
* @return List<Note>
|
||||
*/
|
||||
@Query("SELECT * FROM NOTE WHERE accountId = :accountId AND status != 'LOCAL_DELETED' ORDER BY favorite DESC, modified DESC")
|
||||
List<Note> getNotes(long accountId);
|
||||
|
||||
@Query("DELETE FROM NOTE WHERE id = :id and status = :forceDBStatus")
|
||||
void deleteByCardId(long id, DBStatus forceDBStatus);
|
||||
|
||||
|
@ -111,9 +101,6 @@ public interface NoteDao {
|
|||
@Query("UPDATE NOTE SET status = 'LOCAL_EDITED', favorite = ((favorite | 1) - (favorite & 1)) WHERE id = :id")
|
||||
void toggleFavorite(long id);
|
||||
|
||||
@Query("SELECT * FROM NOTE WHERE accountId = :accountId AND status != 'LOCAL_DELETED' AND (title LIKE :query OR content LIKE :query OR categoryId LIKE :query) AND (categoryId = :category OR title LIKE :category + '/%') AND favorite = :favorite ORDER BY favorite DESC, :sortingMethod")
|
||||
List<Note> searchNotes(long accountId, String query, String category, Boolean favorite, CategorySortingMethod sortingMethod);
|
||||
|
||||
@Query("UPDATE NOTE SET remoteId = :remoteId WHERE id = :id")
|
||||
void updateRemoteId(long id, long remoteId);
|
||||
|
||||
|
@ -125,7 +112,6 @@ public interface NoteDao {
|
|||
"WHERE id = :id AND content = :content AND favorite = :favorite AND categoryId = :categoryTitle")
|
||||
void updateIfModifiedLocallyDuringSync(long id, long modified, String title, Boolean favorite, String categoryTitle, String eTag, String content);
|
||||
|
||||
|
||||
/**
|
||||
* used by: {@link NoteServerSyncHelper.SyncTask#pullRemoteChanges()} update only, if not modified locally (i.e. STATUS="") and if modified remotely (i.e. any (!) column has changed)
|
||||
*/
|
||||
|
|
|
@ -5,6 +5,8 @@ import androidx.room.ForeignKey;
|
|||
import androidx.room.Index;
|
||||
import androidx.room.PrimaryKey;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import it.niedermann.owncloud.notes.shared.model.CategorySortingMethod;
|
||||
|
||||
@Entity(
|
||||
|
@ -23,7 +25,7 @@ import it.niedermann.owncloud.notes.shared.model.CategorySortingMethod;
|
|||
@Index(name = "IDX_CATEGORIES_TITLE", value = "title")
|
||||
}
|
||||
)
|
||||
public class Category {
|
||||
public class Category implements Serializable {
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
private long id;
|
||||
private long accountId;
|
||||
|
|
|
@ -3,7 +3,6 @@ package it.niedermann.owncloud.notes.widget.notelist;
|
|||
import android.app.Activity;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.Intent;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
@ -30,9 +29,13 @@ import it.niedermann.owncloud.notes.persistence.NotesDatabase;
|
|||
import it.niedermann.owncloud.notes.persistence.entity.Account;
|
||||
import it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData;
|
||||
|
||||
import static androidx.lifecycle.Transformations.distinctUntilChanged;
|
||||
import static androidx.lifecycle.Transformations.map;
|
||||
import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_ALL;
|
||||
import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_CATEGORY;
|
||||
import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_STARRED;
|
||||
import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES;
|
||||
import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT;
|
||||
import static it.niedermann.owncloud.notes.shared.util.DisplayUtils.convertToCategoryNavigationItem;
|
||||
|
||||
|
||||
|
@ -44,8 +47,6 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity {
|
|||
private Account localAccount = null;
|
||||
|
||||
private NavigationAdapter adapterCategories;
|
||||
private NavigationItem itemRecent;
|
||||
private NavigationItem itemFavorites;
|
||||
private NotesDatabase db = null;
|
||||
|
||||
@Override
|
||||
|
@ -77,14 +78,6 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity {
|
|||
finish();
|
||||
}
|
||||
|
||||
itemRecent = new NavigationItem(MainActivity.ADAPTER_KEY_RECENT,
|
||||
getString(R.string.label_all_notes),
|
||||
null,
|
||||
R.drawable.ic_access_time_grey600_24dp);
|
||||
itemFavorites = new NavigationItem(MainActivity.ADAPTER_KEY_STARRED,
|
||||
getString(R.string.label_favorites),
|
||||
null,
|
||||
R.drawable.ic_star_yellow_24dp);
|
||||
RecyclerView recyclerView;
|
||||
RecyclerView.LayoutManager layoutManager;
|
||||
|
||||
|
@ -94,17 +87,30 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity {
|
|||
NotesListWidgetData data = new NotesListWidgetData();
|
||||
|
||||
data.setId(appWidgetId);
|
||||
if (itemRecent.equals(item)) {
|
||||
data.setMode(MODE_DISPLAY_ALL);
|
||||
} else if (itemFavorites.equals(item)) {
|
||||
data.setMode(MODE_DISPLAY_STARRED);
|
||||
} else {
|
||||
data.setMode(MODE_DISPLAY_CATEGORY);
|
||||
if (item instanceof NavigationItem.CategoryNavigationItem) {
|
||||
data.setCategoryId(((NavigationItem.CategoryNavigationItem) item).categoryId);
|
||||
} else {
|
||||
throw new IllegalStateException("Tried to choose a category, but ");
|
||||
if (item.type != null) {
|
||||
switch (item.type) {
|
||||
case RECENT: {
|
||||
data.setMode(MODE_DISPLAY_ALL);
|
||||
break;
|
||||
}
|
||||
case FAVORITES: {
|
||||
data.setMode(MODE_DISPLAY_STARRED);
|
||||
break;
|
||||
}
|
||||
case UNCATEGORIZED:
|
||||
default: {
|
||||
if (item.getClass() == NavigationItem.CategoryNavigationItem.class) {
|
||||
data.setMode(MODE_DISPLAY_CATEGORY);
|
||||
data.setCategoryId(((NavigationItem.CategoryNavigationItem) item).categoryId);
|
||||
} else {
|
||||
data.setMode(MODE_DISPLAY_ALL);
|
||||
Log.e(TAG, "Unknown item navigation type. Fallback to show " + RECENT);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
data.setMode(MODE_DISPLAY_ALL);
|
||||
Log.e(TAG, "Unknown item navigation type. Fallback to show " + RECENT);
|
||||
}
|
||||
|
||||
data.setAccountId(localAccount.getId());
|
||||
|
@ -130,53 +136,30 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity {
|
|||
layoutManager = new LinearLayoutManager(this);
|
||||
recyclerView.setLayoutManager(layoutManager);
|
||||
recyclerView.setAdapter(adapterCategories);
|
||||
}
|
||||
distinctUntilChanged(
|
||||
map(db.getCategoryDao().getCategoriesLiveData(localAccount.getId()), fromDatabase -> {
|
||||
List<NavigationItem.CategoryNavigationItem> categories = convertToCategoryNavigationItem(NoteListWidgetConfigurationActivity.this, fromDatabase);
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
new LoadCategoryListTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
ArrayList<NavigationItem> items = new ArrayList<>(fromDatabase.size() + 3);
|
||||
items.add(new NavigationItem(MainActivity.ADAPTER_KEY_RECENT, getString(R.string.label_all_notes), db.getNoteDao().count(localAccount.getId()), R.drawable.ic_access_time_grey600_24dp, RECENT));
|
||||
items.add(new NavigationItem(MainActivity.ADAPTER_KEY_STARRED, getString(R.string.label_favorites), db.getNoteDao().getFavoritesCount(localAccount.getId()), R.drawable.ic_star_yellow_24dp, FAVORITES));
|
||||
|
||||
if (categories.size() > 2 && categories.get(2).label.isEmpty()) {
|
||||
items.add(new NavigationItem(MainActivity.ADAPTER_KEY_UNCATEGORIZED, getString(R.string.action_uncategorized), null, NavigationAdapter.ICON_NOFOLDER));
|
||||
}
|
||||
|
||||
for (NavigationItem item : categories) {
|
||||
int slashIndex = item.label.indexOf('/');
|
||||
|
||||
item.label = slashIndex < 0 ? item.label : item.label.substring(0, slashIndex);
|
||||
item.id = "category:" + item.label;
|
||||
items.add(item);
|
||||
}
|
||||
return items;
|
||||
})).observe(this, (navigationItems) -> adapterCategories.setItems(navigationItems));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyBrand(int mainColor, int textColor) {
|
||||
}
|
||||
|
||||
private class LoadCategoryListTask extends AsyncTask<Void, Void, List<NavigationItem>> {
|
||||
@Override
|
||||
protected List<NavigationItem> doInBackground(Void... voids) {
|
||||
if (localAccount == null) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
NavigationItem itemUncategorized;
|
||||
List<NavigationItem.CategoryNavigationItem> categories = convertToCategoryNavigationItem(NoteListWidgetConfigurationActivity.this, db.getCategoryDao().getCategories(localAccount.getId()));
|
||||
|
||||
if (!categories.isEmpty() && categories.get(0).label.isEmpty()) {
|
||||
itemUncategorized = categories.get(0);
|
||||
itemUncategorized.label = getString(R.string.action_uncategorized);
|
||||
itemUncategorized.icon = NavigationAdapter.ICON_NOFOLDER;
|
||||
}
|
||||
|
||||
itemFavorites.count = db.getNoteDao().getFavoritesCount(localAccount.getId());
|
||||
itemRecent.count = db.getNoteDao().count(localAccount.getId());
|
||||
|
||||
ArrayList<NavigationItem> items = new ArrayList<>();
|
||||
items.add(itemRecent);
|
||||
items.add(itemFavorites);
|
||||
|
||||
for (NavigationItem item : categories) {
|
||||
int slashIndex = item.label.indexOf('/');
|
||||
|
||||
item.label = slashIndex < 0 ? item.label : item.label.substring(0, slashIndex);
|
||||
item.id = "category:" + item.label;
|
||||
items.add(item);
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(List<NavigationItem> items) {
|
||||
adapterCategories.setItems(items);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,9 @@ import android.util.Log;
|
|||
import android.widget.RemoteViews;
|
||||
import android.widget.RemoteViewsService;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import it.niedermann.owncloud.notes.NotesApplication;
|
||||
|
@ -16,8 +19,10 @@ import it.niedermann.owncloud.notes.R;
|
|||
import it.niedermann.owncloud.notes.edit.EditNoteActivity;
|
||||
import it.niedermann.owncloud.notes.persistence.NotesDatabase;
|
||||
import it.niedermann.owncloud.notes.persistence.entity.Note;
|
||||
import it.niedermann.owncloud.notes.persistence.entity.NoteWithCategory;
|
||||
import it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData;
|
||||
import it.niedermann.owncloud.notes.preferences.DarkModeSetting;
|
||||
import it.niedermann.owncloud.notes.shared.model.CategorySortingMethod;
|
||||
|
||||
import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_ALL;
|
||||
import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_CATEGORY;
|
||||
|
@ -31,7 +36,9 @@ public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFact
|
|||
private final NotesListWidgetData data;
|
||||
private final boolean darkTheme;
|
||||
private NotesDatabase db;
|
||||
private List<Note> noteEntities;
|
||||
private LiveData<List<NoteWithCategory>> noteEntitiesLiveData;
|
||||
private Observer<List<NoteWithCategory>> noteEntitiesObserver = (notes) -> this.noteEntities = notes;
|
||||
private List<NoteWithCategory> noteEntities;
|
||||
|
||||
NoteListWidgetFactory(Context context, Intent intent) {
|
||||
this.context = context;
|
||||
|
@ -46,28 +53,35 @@ public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFact
|
|||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataSetChanged() {
|
||||
if (noteEntitiesLiveData != null) {
|
||||
noteEntitiesLiveData.removeObserver(noteEntitiesObserver);
|
||||
}
|
||||
try {
|
||||
Log.v(TAG, "--- data - " + data);
|
||||
switch (data.getMode()) {
|
||||
case MODE_DISPLAY_ALL:
|
||||
noteEntities = db.getNoteDao().getNotes(data.getAccountId());
|
||||
noteEntitiesLiveData = db.getNoteDao().searchRecent(data.getAccountId(), "%", CategorySortingMethod.SORT_MODIFIED_DESC.getSorder());
|
||||
break;
|
||||
case MODE_DISPLAY_STARRED:
|
||||
noteEntities = db.getNoteDao().searchNotes(data.getAccountId(), null, null, true, null);
|
||||
noteEntitiesLiveData = db.getNoteDao().searchFavorites(data.getAccountId(), "%", CategorySortingMethod.SORT_MODIFIED_DESC.getSorder());
|
||||
break;
|
||||
case MODE_DISPLAY_CATEGORY:
|
||||
if (data.getCategoryId() != null) {
|
||||
noteEntities = db.getNoteDao().searchNotes(data.getAccountId(), null, db.getCategoryDao().getCategoryTitleById(data.getCategoryId()), null, null);
|
||||
// FIXME
|
||||
noteEntitiesLiveData = db.getNoteDao().searchByCategory(data.getAccountId(), "%", db.getCategoryDao().getCategoryTitleById(data.getCategoryId()), CategorySortingMethod.SORT_MODIFIED_DESC.getSorder());
|
||||
} else {
|
||||
noteEntitiesLiveData = db.getNoteDao().searchUncategorized(data.getAccountId(), "%", CategorySortingMethod.SORT_MODIFIED_DESC.getSorder());
|
||||
}
|
||||
break;
|
||||
}
|
||||
} catch (IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
noteEntitiesLiveData.observeForever(noteEntitiesObserver);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataSetChanged() {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -98,7 +112,7 @@ public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFact
|
|||
return null;
|
||||
}
|
||||
|
||||
Note note = noteEntities.get(position);
|
||||
Note note = noteEntities.get(position).getNote();
|
||||
final Intent fillInIntent = new Intent();
|
||||
final Bundle extras = new Bundle();
|
||||
|
||||
|
|
Loading…
Reference in a new issue