Loading app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +10 −4 Original line number Diff line number Diff line Loading @@ -52,9 +52,9 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap public final static String CREATED_NOTE = "it.niedermann.owncloud.notes.created_notes"; public final static String CREDENTIALS_CHANGED = "it.niedermann.owncloud.notes.CREDENTIALS_CHANGED"; public static final String ADAPTER_KEY_RECENT = "recent"; public static final String ADAPTER_KEY_STARRED = "starred"; private static final String ADAPTER_KEY_RECENT = "recent"; private static final String ADAPTER_KEY_STARRED = "starred"; private static final String SAVED_STATE_NAVIGATION_SELECTION = "navigationSelection"; private static final String SAVED_STATE_NAVIGATION_ADAPTER_SLECTION = "navigationAdapterSelection"; private static final String SAVED_STATE_NAVIGATION_OPEN = "navigationOpen"; Loading Loading @@ -231,7 +231,7 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap if (closeNavigation) { drawerLayout.closeDrawers(); } refreshLists(); refreshLists(true); } @Override Loading Loading @@ -428,6 +428,9 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap } private void refreshLists() { refreshLists(false); } private void refreshLists(final boolean scrollToTop) { String subtitle = ""; if (navigationSelection.category != null) { if (navigationSelection.category.isEmpty()) { Loading @@ -451,6 +454,9 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap public void onNotesLoaded(List<Item> notes, boolean showCategory) { adapter.setShowCategory(showCategory); adapter.setItemList(notes); if(scrollToTop) { listView.scrollToPosition(0); } } }; new LoadNotesListTask(getApplicationContext(), callback, navigationSelection, query).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); Loading Loading @@ -545,8 +551,8 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap DBNote createdNote = (DBNote) data.getExtras().getSerializable(CREATED_NOTE); adapter.add(createdNote); // TODO scroll to top } listView.scrollToPosition(0); } else if (requestCode == server_settings) { // Create new Instance with new URL and credentials db = NoteSQLiteOpenHelper.getInstance(this); Loading app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidget.java +75 −49 Original line number Diff line number Diff line Loading @@ -6,75 +6,101 @@ import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.preference.PreferenceManager; import android.widget.RemoteViews; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.activity.EditNoteActivity; import it.niedermann.owncloud.notes.android.activity.NotesListViewActivity; import static android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE; public class NoteListWidget extends AppWidgetProvider { public static final String WIDGET_MODE_KEY = "NLW_mode"; public static final String WIDGET_CATEGORY_KEY = "NLW_cat"; public static final int NLW_DISPLAY_ALL = 0; public static final int NLW_DISPLAY_STARRED = 1; public static final int NLW_DISPLAY_CATEGORY = 2; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { private static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { for (int appWidgetId : appWidgetIds) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); int displayMode = sp.getInt(NoteListWidget.WIDGET_MODE_KEY + appWidgetId, -1); String category = sp.getString(NoteListWidget.WIDGET_CATEGORY_KEY + appWidgetId, null); Intent serviceIntent = new Intent(context, NoteListWidgetService.class); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list); serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); serviceIntent.putExtra(NoteListWidget.WIDGET_MODE_KEY + appWidgetId, displayMode); // Launch application when user taps the header icon or app title Intent intent = new Intent("android.intent.action.MAIN"); intent.setComponent(new ComponentName(context.getPackageName(), NotesListViewActivity.class.getName())); PendingIntent pendingIntent = PendingIntent.getActivity( context, 0, PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.widget_note_header_icon, pendingIntent); views.setOnClickPendingIntent(R.id.widget_note_list_title, pendingIntent); views.setOnClickPendingIntent(R.id.widget_note_list_title_tv, pendingIntent); // Launch create note activity if user taps "+" sign in header intent = new Intent(context, EditNoteActivity.class); pendingIntent = PendingIntent.getActivity( context, 0, pendingIntent = PendingIntent.getActivity(context,0, intent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.widget_note_list_create_icon, pendingIntent); Intent templateIntent = new Intent(context, EditNoteActivity.class); PendingIntent templatePI = PendingIntent.getActivity( context, 0, templateIntent, PendingIntent templatePI = PendingIntent.getActivity(context, 0, templateIntent, PendingIntent.FLAG_UPDATE_CURRENT); Intent serviceIntent = new Intent(context, NoteListWidgetService.class); serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); if (displayMode == 2) { serviceIntent.putExtra(NoteListWidget.WIDGET_CATEGORY_KEY + appWidgetId, category); } serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); views.setPendingIntentTemplate(R.id.note_list_widget_lv, templatePI); views.setRemoteAdapter(R.id.note_list_widget_lv, serviceIntent); views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv, serviceIntent); views.setEmptyView(R.id.note_list_widget_lv, R.id.widget_note_list_placeholder_tv); appWidgetManager.updateAppWidget(appWidgetId, views); } super.onUpdate(context, appWidgetManager, appWidgetIds); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { public void onReceive(Context context, Intent intent) { AppWidgetManager awm = AppWidgetManager.getInstance(context); int appWidgetIds[] = awm.getAppWidgetIds(new ComponentName(context, NoteListWidget.class)); for (int appWidgetId : appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetId); if (ACTION_APPWIDGET_UPDATE.equals(intent.getAction())) { awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv); } } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); } @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); AppWidgetManager manager = AppWidgetManager.getInstance(context); int[] appWidgetIds = manager.getAppWidgetIds(new ComponentName(context, NoteListWidget.class)); SharedPreferences.Editor editor = PreferenceManager .getDefaultSharedPreferences(context).edit(); for (int appWidgetId : appWidgetIds) { editor.remove(WIDGET_MODE_KEY + appWidgetId); editor.remove(WIDGET_CATEGORY_KEY + appWidgetId); } manager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.note_list_widget_lv); editor.apply(); } } app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidgetConfiguration.java +132 −16 Original line number Diff line number Diff line Loading @@ -3,46 +3,162 @@ package it.niedermann.owncloud.notes.android.appwidget; import android.app.Activity; import android.appwidget.AppWidgetManager; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import java.util.Map; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.activity.NotesListViewActivity; import it.niedermann.owncloud.notes.model.NavigationAdapter; import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; import it.niedermann.owncloud.notes.persistence.NoteServerSyncHelper; public class NoteListWidgetConfiguration extends AppCompatActivity { private static final String TAG = Activity.class.getSimpleName(); private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; private NavigationAdapter adapterCategories; private NavigationAdapter.NavigationItem itemRecent, itemFavorites; private NoteSQLiteOpenHelper db = null; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setResult(RESULT_CANCELED); setContentView(R.layout.activity_note_list_configuration); Intent intent = getIntent(); if (!(NoteServerSyncHelper.isConfigured(this))) { Toast.makeText(this, R.string.widget_not_logged_in, Toast.LENGTH_LONG).show(); if (intent.getExtras() == null) { // TODO Present user with app login screen Log.w(TAG, "onCreate: user not logged in"); finish(); return; } int mAppWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, db = NoteSQLiteOpenHelper.getInstance(this); final Bundle extras = getIntent().getExtras(); if (extras != null) { mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } if (!(NoteServerSyncHelper.isConfigured(this))) { Toast.makeText(this, R.string.widget_not_logged_in, Toast.LENGTH_LONG).show(); if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish(); } // TODO Present user with app login screen Log.w(TAG, "onCreate: user not logged in"); itemRecent = new NavigationAdapter.NavigationItem(NotesListViewActivity.ADAPTER_KEY_RECENT, getString(R.string.label_all_notes), null, R.drawable.ic_access_time_grey600_24dp); itemFavorites = new NavigationAdapter.NavigationItem(NotesListViewActivity.ADAPTER_KEY_STARRED, getString(R.string.label_favorites), null, R.drawable.ic_star_grey600_24dp); RecyclerView recyclerView; RecyclerView.LayoutManager layoutManager; adapterCategories = new NavigationAdapter(new NavigationAdapter.ClickListener() { @Override public void onItemClick(NavigationAdapter.NavigationItem item) { SharedPreferences.Editor sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit(); if (item == itemRecent) { sp.putInt(NoteListWidget.WIDGET_MODE_KEY + mAppWidgetId, NoteListWidget.NLW_DISPLAY_ALL); } else if (item == itemFavorites) { sp.putInt(NoteListWidget.WIDGET_MODE_KEY + mAppWidgetId, NoteListWidget.NLW_DISPLAY_STARRED); } else { Intent retIntent = new Intent(this, NoteListWidget.class); retIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); retIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); sendBroadcast(retIntent); setResult(RESULT_OK, retIntent); String category = ""; if (!item.label.equals(getString(R.string.action_uncategorized))) { category = item.label; } sp.putInt(NoteListWidget.WIDGET_MODE_KEY + mAppWidgetId, NoteListWidget.NLW_DISPLAY_CATEGORY); sp.putString(NoteListWidget.WIDGET_CATEGORY_KEY + mAppWidgetId, category); } sp.apply(); Intent updateIntent = new Intent(getApplicationContext(), NoteListWidget.class); updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); sendBroadcast(updateIntent); setResult(RESULT_OK, updateIntent); finish(); } public void onIconClick(NavigationAdapter.NavigationItem item) { onItemClick(item); } }, false); recyclerView = findViewById(R.id.nlw_config_recyclerv); recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(adapterCategories); } @Override protected void onResume() { super.onResume(); new LoadCategoryListTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } private class LoadCategoryListTask extends AsyncTask<Void, Void, List<NavigationAdapter.NavigationItem>> { @Override protected List<NavigationAdapter.NavigationItem> doInBackground(Void... voids) { NavigationAdapter.NavigationItem itemUncategorized; List<NavigationAdapter.NavigationItem> categories = db.getCategories(); if (!categories.isEmpty() && categories.get(0).label.isEmpty()) { itemUncategorized = categories.get(0); itemUncategorized.label = getString(R.string.action_uncategorized); itemUncategorized.icon = NavigationAdapter.ICON_NOFOLDER; } Map<String, Integer> favorites = db.getFavoritesCount(); int numFavorites = favorites.containsKey("1") ? favorites.get("1") : 0; int numNonFavorites = favorites.containsKey("0") ? favorites.get("0") : 0; itemFavorites.count = numFavorites; itemRecent.count = numFavorites + numNonFavorites; ArrayList<NavigationAdapter.NavigationItem> items = new ArrayList<>(); items.add(itemRecent); items.add(itemFavorites); for (NavigationAdapter.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<NavigationAdapter.NavigationItem> items) { adapterCategories.setItems(items); } } } app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidgetFactory.java +45 −8 Original line number Diff line number Diff line package it.niedermann.owncloud.notes.android.appwidget; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService; Loading @@ -16,24 +19,58 @@ import it.niedermann.owncloud.notes.model.DBNote; import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFactory { private final Context mContext; private final Context context; private final int displayMode; private final int appWidgetId; private String category; private final SharedPreferences sp; private NoteSQLiteOpenHelper db; private List<DBNote> dbNotes; NoteListWidgetFactory(Context context, Intent intent) { mContext = context; this.context = context; appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); sp = PreferenceManager.getDefaultSharedPreferences(this.context); displayMode = sp.getInt(NoteListWidget.WIDGET_MODE_KEY + appWidgetId, -1); } @Override public void onCreate() { db = NoteSQLiteOpenHelper.getInstance(mContext); db = NoteSQLiteOpenHelper.getInstance(context); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list); AppWidgetManager awm = AppWidgetManager.getInstance(context); switch (displayMode) { case 0: views.setTextViewText(R.id.widget_note_list_title_tv, context.getString(R.string.app_name)); break; case 1: views.setTextViewText(R.id.widget_note_list_title_tv, "Starred"); break; case 2: category = sp.getString(NoteListWidget.WIDGET_CATEGORY_KEY + appWidgetId, null); if (category.equals("")) { views.setTextViewText(R.id.widget_note_list_title_tv, context.getString(R.string.action_uncategorized)); } else { views.setTextViewText(R.id.widget_note_list_title_tv, category); } break; } awm.updateAppWidget(appWidgetId, views); } @Override public void onDataSetChanged() { // Stores all db notes using the default sort order (starred, modified) // which is how they are displayed by the widget if (displayMode == NoteListWidget.NLW_DISPLAY_ALL) { dbNotes = db.getNotes(); } else if (displayMode == NoteListWidget.NLW_DISPLAY_STARRED) { dbNotes = db.searchNotes(null,null, true); } else if (displayMode == NoteListWidget.NLW_DISPLAY_CATEGORY) { dbNotes = db.searchNotes(null, category, null); } } @Override Loading Loading @@ -61,7 +98,7 @@ public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFact return null; } RemoteViews note_content = new RemoteViews(mContext.getPackageName(), RemoteViews note_content = new RemoteViews(context.getPackageName(), R.layout.widget_entry); DBNote note = dbNotes.get(i); final Intent fillInIntent = new Intent(); Loading app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +1 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ public class PreferencesFragment extends PreferenceFragment { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Boolean darkTheme = (Boolean) newValue; Notes.setTheme(darkTheme); Notes.setAppTheme(darkTheme); getActivity().setResult(Activity.RESULT_OK); getActivity().finish(); Loading Loading
app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +10 −4 Original line number Diff line number Diff line Loading @@ -52,9 +52,9 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap public final static String CREATED_NOTE = "it.niedermann.owncloud.notes.created_notes"; public final static String CREDENTIALS_CHANGED = "it.niedermann.owncloud.notes.CREDENTIALS_CHANGED"; public static final String ADAPTER_KEY_RECENT = "recent"; public static final String ADAPTER_KEY_STARRED = "starred"; private static final String ADAPTER_KEY_RECENT = "recent"; private static final String ADAPTER_KEY_STARRED = "starred"; private static final String SAVED_STATE_NAVIGATION_SELECTION = "navigationSelection"; private static final String SAVED_STATE_NAVIGATION_ADAPTER_SLECTION = "navigationAdapterSelection"; private static final String SAVED_STATE_NAVIGATION_OPEN = "navigationOpen"; Loading Loading @@ -231,7 +231,7 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap if (closeNavigation) { drawerLayout.closeDrawers(); } refreshLists(); refreshLists(true); } @Override Loading Loading @@ -428,6 +428,9 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap } private void refreshLists() { refreshLists(false); } private void refreshLists(final boolean scrollToTop) { String subtitle = ""; if (navigationSelection.category != null) { if (navigationSelection.category.isEmpty()) { Loading @@ -451,6 +454,9 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap public void onNotesLoaded(List<Item> notes, boolean showCategory) { adapter.setShowCategory(showCategory); adapter.setItemList(notes); if(scrollToTop) { listView.scrollToPosition(0); } } }; new LoadNotesListTask(getApplicationContext(), callback, navigationSelection, query).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); Loading Loading @@ -545,8 +551,8 @@ public class NotesListViewActivity extends AppCompatActivity implements ItemAdap DBNote createdNote = (DBNote) data.getExtras().getSerializable(CREATED_NOTE); adapter.add(createdNote); // TODO scroll to top } listView.scrollToPosition(0); } else if (requestCode == server_settings) { // Create new Instance with new URL and credentials db = NoteSQLiteOpenHelper.getInstance(this); Loading
app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidget.java +75 −49 Original line number Diff line number Diff line Loading @@ -6,75 +6,101 @@ import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.preference.PreferenceManager; import android.widget.RemoteViews; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.activity.EditNoteActivity; import it.niedermann.owncloud.notes.android.activity.NotesListViewActivity; import static android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE; public class NoteListWidget extends AppWidgetProvider { public static final String WIDGET_MODE_KEY = "NLW_mode"; public static final String WIDGET_CATEGORY_KEY = "NLW_cat"; public static final int NLW_DISPLAY_ALL = 0; public static final int NLW_DISPLAY_STARRED = 1; public static final int NLW_DISPLAY_CATEGORY = 2; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { private static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { for (int appWidgetId : appWidgetIds) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); int displayMode = sp.getInt(NoteListWidget.WIDGET_MODE_KEY + appWidgetId, -1); String category = sp.getString(NoteListWidget.WIDGET_CATEGORY_KEY + appWidgetId, null); Intent serviceIntent = new Intent(context, NoteListWidgetService.class); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list); serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); serviceIntent.putExtra(NoteListWidget.WIDGET_MODE_KEY + appWidgetId, displayMode); // Launch application when user taps the header icon or app title Intent intent = new Intent("android.intent.action.MAIN"); intent.setComponent(new ComponentName(context.getPackageName(), NotesListViewActivity.class.getName())); PendingIntent pendingIntent = PendingIntent.getActivity( context, 0, PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.widget_note_header_icon, pendingIntent); views.setOnClickPendingIntent(R.id.widget_note_list_title, pendingIntent); views.setOnClickPendingIntent(R.id.widget_note_list_title_tv, pendingIntent); // Launch create note activity if user taps "+" sign in header intent = new Intent(context, EditNoteActivity.class); pendingIntent = PendingIntent.getActivity( context, 0, pendingIntent = PendingIntent.getActivity(context,0, intent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.widget_note_list_create_icon, pendingIntent); Intent templateIntent = new Intent(context, EditNoteActivity.class); PendingIntent templatePI = PendingIntent.getActivity( context, 0, templateIntent, PendingIntent templatePI = PendingIntent.getActivity(context, 0, templateIntent, PendingIntent.FLAG_UPDATE_CURRENT); Intent serviceIntent = new Intent(context, NoteListWidgetService.class); serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); if (displayMode == 2) { serviceIntent.putExtra(NoteListWidget.WIDGET_CATEGORY_KEY + appWidgetId, category); } serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); views.setPendingIntentTemplate(R.id.note_list_widget_lv, templatePI); views.setRemoteAdapter(R.id.note_list_widget_lv, serviceIntent); views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv, serviceIntent); views.setEmptyView(R.id.note_list_widget_lv, R.id.widget_note_list_placeholder_tv); appWidgetManager.updateAppWidget(appWidgetId, views); } super.onUpdate(context, appWidgetManager, appWidgetIds); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { public void onReceive(Context context, Intent intent) { AppWidgetManager awm = AppWidgetManager.getInstance(context); int appWidgetIds[] = awm.getAppWidgetIds(new ComponentName(context, NoteListWidget.class)); for (int appWidgetId : appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetId); if (ACTION_APPWIDGET_UPDATE.equals(intent.getAction())) { awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv); } } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); } @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); AppWidgetManager manager = AppWidgetManager.getInstance(context); int[] appWidgetIds = manager.getAppWidgetIds(new ComponentName(context, NoteListWidget.class)); SharedPreferences.Editor editor = PreferenceManager .getDefaultSharedPreferences(context).edit(); for (int appWidgetId : appWidgetIds) { editor.remove(WIDGET_MODE_KEY + appWidgetId); editor.remove(WIDGET_CATEGORY_KEY + appWidgetId); } manager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.note_list_widget_lv); editor.apply(); } }
app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidgetConfiguration.java +132 −16 Original line number Diff line number Diff line Loading @@ -3,46 +3,162 @@ package it.niedermann.owncloud.notes.android.appwidget; import android.app.Activity; import android.appwidget.AppWidgetManager; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import java.util.Map; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.activity.NotesListViewActivity; import it.niedermann.owncloud.notes.model.NavigationAdapter; import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; import it.niedermann.owncloud.notes.persistence.NoteServerSyncHelper; public class NoteListWidgetConfiguration extends AppCompatActivity { private static final String TAG = Activity.class.getSimpleName(); private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; private NavigationAdapter adapterCategories; private NavigationAdapter.NavigationItem itemRecent, itemFavorites; private NoteSQLiteOpenHelper db = null; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setResult(RESULT_CANCELED); setContentView(R.layout.activity_note_list_configuration); Intent intent = getIntent(); if (!(NoteServerSyncHelper.isConfigured(this))) { Toast.makeText(this, R.string.widget_not_logged_in, Toast.LENGTH_LONG).show(); if (intent.getExtras() == null) { // TODO Present user with app login screen Log.w(TAG, "onCreate: user not logged in"); finish(); return; } int mAppWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, db = NoteSQLiteOpenHelper.getInstance(this); final Bundle extras = getIntent().getExtras(); if (extras != null) { mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } if (!(NoteServerSyncHelper.isConfigured(this))) { Toast.makeText(this, R.string.widget_not_logged_in, Toast.LENGTH_LONG).show(); if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish(); } // TODO Present user with app login screen Log.w(TAG, "onCreate: user not logged in"); itemRecent = new NavigationAdapter.NavigationItem(NotesListViewActivity.ADAPTER_KEY_RECENT, getString(R.string.label_all_notes), null, R.drawable.ic_access_time_grey600_24dp); itemFavorites = new NavigationAdapter.NavigationItem(NotesListViewActivity.ADAPTER_KEY_STARRED, getString(R.string.label_favorites), null, R.drawable.ic_star_grey600_24dp); RecyclerView recyclerView; RecyclerView.LayoutManager layoutManager; adapterCategories = new NavigationAdapter(new NavigationAdapter.ClickListener() { @Override public void onItemClick(NavigationAdapter.NavigationItem item) { SharedPreferences.Editor sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit(); if (item == itemRecent) { sp.putInt(NoteListWidget.WIDGET_MODE_KEY + mAppWidgetId, NoteListWidget.NLW_DISPLAY_ALL); } else if (item == itemFavorites) { sp.putInt(NoteListWidget.WIDGET_MODE_KEY + mAppWidgetId, NoteListWidget.NLW_DISPLAY_STARRED); } else { Intent retIntent = new Intent(this, NoteListWidget.class); retIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); retIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); sendBroadcast(retIntent); setResult(RESULT_OK, retIntent); String category = ""; if (!item.label.equals(getString(R.string.action_uncategorized))) { category = item.label; } sp.putInt(NoteListWidget.WIDGET_MODE_KEY + mAppWidgetId, NoteListWidget.NLW_DISPLAY_CATEGORY); sp.putString(NoteListWidget.WIDGET_CATEGORY_KEY + mAppWidgetId, category); } sp.apply(); Intent updateIntent = new Intent(getApplicationContext(), NoteListWidget.class); updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); sendBroadcast(updateIntent); setResult(RESULT_OK, updateIntent); finish(); } public void onIconClick(NavigationAdapter.NavigationItem item) { onItemClick(item); } }, false); recyclerView = findViewById(R.id.nlw_config_recyclerv); recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(adapterCategories); } @Override protected void onResume() { super.onResume(); new LoadCategoryListTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } private class LoadCategoryListTask extends AsyncTask<Void, Void, List<NavigationAdapter.NavigationItem>> { @Override protected List<NavigationAdapter.NavigationItem> doInBackground(Void... voids) { NavigationAdapter.NavigationItem itemUncategorized; List<NavigationAdapter.NavigationItem> categories = db.getCategories(); if (!categories.isEmpty() && categories.get(0).label.isEmpty()) { itemUncategorized = categories.get(0); itemUncategorized.label = getString(R.string.action_uncategorized); itemUncategorized.icon = NavigationAdapter.ICON_NOFOLDER; } Map<String, Integer> favorites = db.getFavoritesCount(); int numFavorites = favorites.containsKey("1") ? favorites.get("1") : 0; int numNonFavorites = favorites.containsKey("0") ? favorites.get("0") : 0; itemFavorites.count = numFavorites; itemRecent.count = numFavorites + numNonFavorites; ArrayList<NavigationAdapter.NavigationItem> items = new ArrayList<>(); items.add(itemRecent); items.add(itemFavorites); for (NavigationAdapter.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<NavigationAdapter.NavigationItem> items) { adapterCategories.setItems(items); } } }
app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidgetFactory.java +45 −8 Original line number Diff line number Diff line package it.niedermann.owncloud.notes.android.appwidget; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService; Loading @@ -16,24 +19,58 @@ import it.niedermann.owncloud.notes.model.DBNote; import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFactory { private final Context mContext; private final Context context; private final int displayMode; private final int appWidgetId; private String category; private final SharedPreferences sp; private NoteSQLiteOpenHelper db; private List<DBNote> dbNotes; NoteListWidgetFactory(Context context, Intent intent) { mContext = context; this.context = context; appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); sp = PreferenceManager.getDefaultSharedPreferences(this.context); displayMode = sp.getInt(NoteListWidget.WIDGET_MODE_KEY + appWidgetId, -1); } @Override public void onCreate() { db = NoteSQLiteOpenHelper.getInstance(mContext); db = NoteSQLiteOpenHelper.getInstance(context); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list); AppWidgetManager awm = AppWidgetManager.getInstance(context); switch (displayMode) { case 0: views.setTextViewText(R.id.widget_note_list_title_tv, context.getString(R.string.app_name)); break; case 1: views.setTextViewText(R.id.widget_note_list_title_tv, "Starred"); break; case 2: category = sp.getString(NoteListWidget.WIDGET_CATEGORY_KEY + appWidgetId, null); if (category.equals("")) { views.setTextViewText(R.id.widget_note_list_title_tv, context.getString(R.string.action_uncategorized)); } else { views.setTextViewText(R.id.widget_note_list_title_tv, category); } break; } awm.updateAppWidget(appWidgetId, views); } @Override public void onDataSetChanged() { // Stores all db notes using the default sort order (starred, modified) // which is how they are displayed by the widget if (displayMode == NoteListWidget.NLW_DISPLAY_ALL) { dbNotes = db.getNotes(); } else if (displayMode == NoteListWidget.NLW_DISPLAY_STARRED) { dbNotes = db.searchNotes(null,null, true); } else if (displayMode == NoteListWidget.NLW_DISPLAY_CATEGORY) { dbNotes = db.searchNotes(null, category, null); } } @Override Loading Loading @@ -61,7 +98,7 @@ public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFact return null; } RemoteViews note_content = new RemoteViews(mContext.getPackageName(), RemoteViews note_content = new RemoteViews(context.getPackageName(), R.layout.widget_entry); DBNote note = dbNotes.get(i); final Intent fillInIntent = new Intent(); Loading
app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +1 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ public class PreferencesFragment extends PreferenceFragment { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Boolean darkTheme = (Boolean) newValue; Notes.setTheme(darkTheme); Notes.setAppTheme(darkTheme); getActivity().setResult(Activity.RESULT_OK); getActivity().finish(); Loading