From a48f0b9f36943e19aa6fd4878c2cfde516f39e05 Mon Sep 17 00:00:00 2001 From: korelstar Date: Fri, 14 Apr 2017 14:45:30 +0200 Subject: [PATCH 1/3] simplify version detection --- .../fragment/about/AboutFragmentCreditsTab.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/about/AboutFragmentCreditsTab.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/about/AboutFragmentCreditsTab.java index cff969616..670df3f1f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/about/AboutFragmentCreditsTab.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/about/AboutFragmentCreditsTab.java @@ -1,6 +1,5 @@ package it.niedermann.owncloud.notes.android.fragment.about; -import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; @@ -8,6 +7,7 @@ import android.view.ViewGroup; import android.widget.TextView; +import it.niedermann.owncloud.notes.BuildConfig; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.util.SupportUtil; @@ -15,13 +15,7 @@ public class AboutFragmentCreditsTab extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_about_credits_tab, container, false); - String versionName; - try { - versionName = "v"+getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0).versionName; - } catch (PackageManager.NameNotFoundException e) { - versionName = "(error)"; - } - SupportUtil.setHtml((TextView) v.findViewById(R.id.about_version), R.string.about_version, versionName); + SupportUtil.setHtml((TextView) v.findViewById(R.id.about_version), R.string.about_version, "v"+BuildConfig.VERSION_NAME); SupportUtil.setHtml((TextView) v.findViewById(R.id.about_maintainer), R.string.about_maintainer); SupportUtil.setHtml((TextView) v.findViewById(R.id.about_translators), R.string.about_translators_transifex, getString(R.string.url_translations)); return v; From 685d9c0e421352f17292929693335c4aaacb88ce Mon Sep 17 00:00:00 2001 From: korelstar Date: Fri, 14 Apr 2017 15:01:32 +0200 Subject: [PATCH 2/3] simple interface for category change --- .../android/activity/EditNoteActivity.java | 38 +++++++++--- .../fragment/CategoryDialogFragment.java | 61 +++++++++++++++++++ .../persistence/NoteSQLiteOpenHelper.java | 5 +- .../owncloud/notes/util/NotesClient.java | 7 ++- .../res/layout/dialog_change_category.xml | 16 +++++ app/src/main/res/menu/menu_note_list_view.xml | 5 ++ app/src/main/res/values/strings.xml | 3 + 7 files changed, 122 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/android/fragment/CategoryDialogFragment.java create mode 100644 app/src/main/res/layout/dialog_change_category.xml diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/EditNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/EditNoteActivity.java index d592a792c..6bfa73139 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/EditNoteActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/EditNoteActivity.java @@ -1,5 +1,7 @@ package it.niedermann.owncloud.notes.android.activity; +import android.app.Fragment; +import android.app.FragmentManager; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBar; @@ -22,13 +24,14 @@ import java.util.concurrent.TimeUnit; import it.niedermann.owncloud.notes.R; +import it.niedermann.owncloud.notes.android.fragment.CategoryDialogFragment; import it.niedermann.owncloud.notes.model.DBNote; import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; import it.niedermann.owncloud.notes.util.ICallback; import it.niedermann.owncloud.notes.util.MarkDownUtil; import rx.Subscriber; -public class EditNoteActivity extends AppCompatActivity { +public class EditNoteActivity extends AppCompatActivity implements CategoryDialogFragment.CategoryDialogListener { public static final String PARAM_NOTE = "note"; public static final String PARAM_ORIGINAL_NOTE = "original_note"; @@ -185,6 +188,9 @@ public boolean onOptionsItemSelected(MenuItem item) { db.toggleFavorite(note, null); invalidateOptionsMenu(); return true; + case R.id.menu_category: + showCategorySelector(); + return true; case R.id.menu_preview: saveData(null); Intent previewIntent = new Intent(getApplicationContext(), NoteActivity.class); @@ -211,6 +217,28 @@ public boolean onOptionsItemSelected(MenuItem item) { } } + /** + * Opens a dialog in order to chose a category + */ + private void showCategorySelector() { + final String fragmentId = "fragment_category"; + FragmentManager manager = getFragmentManager(); + Fragment frag = manager.findFragmentByTag(fragmentId); + if(frag!=null) { + manager.beginTransaction().remove(frag).commit(); + } + Bundle arguments = new Bundle(); + arguments.putString(CategoryDialogFragment.PARAM_CATEGORY, note.getCategory()); + CategoryDialogFragment categoryFragment = new CategoryDialogFragment(); + categoryFragment.setArguments(arguments); + categoryFragment.show(manager, fragmentId); + } + + @Override + public void onCategoryChosen(String category) { + note.setCategory(category); + } + /** * Saves all changes and closes the Activity */ @@ -295,14 +323,6 @@ public void run() { }); } }, DELAY_AFTER_SYNC); - - /* TODO Notify widgets - - int widgetIDs[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), SingleNoteWidget.class)); - - for (int id : widgetIDs) { - AppWidgetManager.getInstance(getApplication()).notifyAppWidgetViewDataChanged(id, R.layout.widget_single_note); - }*/ } }); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/CategoryDialogFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/CategoryDialogFragment.java new file mode 100644 index 000000000..e79539d55 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/CategoryDialogFragment.java @@ -0,0 +1,61 @@ +package it.niedermann.owncloud.notes.android.fragment; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.View; +import android.widget.EditText; + +import it.niedermann.owncloud.notes.R; + +/** + * This {@link DialogFragment} allows for the selection of a category. + * The calling Activity must implement the interface {@link CategoryDialogListener}. + */ +public class CategoryDialogFragment extends DialogFragment { + + /** + * Interface that must be implemented by the calling Activity. + */ + public interface CategoryDialogListener { + /** + * This method is called after the user has chosen a category. + * @param category Name of the category which was chosen by the user. + */ + void onCategoryChosen(String category); + } + + public static final String PARAM_CATEGORY = "category"; + + private EditText textCategory; + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + View dialogView = getActivity().getLayoutInflater().inflate(R.layout.dialog_change_category, null); + textCategory = (EditText) dialogView.findViewById(R.id.editCategory); + if(savedInstanceState==null) { + textCategory.setText(getArguments().getString(PARAM_CATEGORY)); + } + return new AlertDialog.Builder(getActivity()) + .setTitle(R.string.change_category_title) + .setView(dialogView) + .setMessage(R.string.change_category_message) + .setCancelable(true) + .setPositiveButton(R.string.action_edit_save, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + CategoryDialogListener listener = (CategoryDialogListener) getActivity(); + listener.onCategoryChosen(textCategory.getText().toString()); + } + }) + .setNegativeButton(R.string.action_edit_cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // do nothing + } + }) + .create(); + } +} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NoteSQLiteOpenHelper.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NoteSQLiteOpenHelper.java index fc307497f..54068b817 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NoteSQLiteOpenHelper.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NoteSQLiteOpenHelper.java @@ -333,7 +333,7 @@ public void toggleFavorite(DBNote note, ICallback callback) { * @return changed note if differs from database, otherwise the old note. */ public DBNote updateNoteAndSync(DBNote oldNote, String newContent, ICallback callback) { - debugPrintFullDB(); + //debugPrintFullDB(); DBNote newNote; if(newContent==null) { newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), oldNote.getModified(), oldNote.getTitle(), oldNote.getContent(), oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED); @@ -344,9 +344,10 @@ public DBNote updateNoteAndSync(DBNote oldNote, String newContent, ICallback cal ContentValues values = new ContentValues(); values.put(key_status, newNote.getStatus().getTitle()); values.put(key_title, newNote.getTitle()); + values.put(key_category, newNote.getCategory()); values.put(key_modified, newNote.getModified(DATE_FORMAT)); values.put(key_content, newNote.getContent()); - int rows = db.update(table_notes, values, key_id + " = ? AND " + key_content + " != ?", new String[]{String.valueOf(newNote.getId()), newNote.getContent()}); + int rows = db.update(table_notes, values, key_id + " = ? AND (" + key_content + " != ? OR " + key_category + " != ?)", new String[]{String.valueOf(newNote.getId()), newNote.getContent(), newNote.getCategory()}); // if data was changed, set new status and schedule sync (with callback); otherwise invoke callback directly. if(rows > 0) { if(callback!=null) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/NotesClient.java b/app/src/main/java/it/niedermann/owncloud/notes/util/NotesClient.java index dd56f0730..9217dc78e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/NotesClient.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/NotesClient.java @@ -14,6 +14,7 @@ import java.net.MalformedURLException; import at.bitfire.cert4android.CustomCertManager; +import it.niedermann.owncloud.notes.BuildConfig; import it.niedermann.owncloud.notes.model.CloudNote; import it.niedermann.owncloud.notes.util.ServerResponse.NoteResponse; import it.niedermann.owncloud.notes.util.ServerResponse.NotesResponse; @@ -94,7 +95,8 @@ private NoteResponse putNote(CustomCertManager ccm, CloudNote note, String path, JSONObject paramObject = new JSONObject(); paramObject.accumulate(JSON_CONTENT, note.getContent()); paramObject.accumulate(JSON_MODIFIED, note.getModified().getTimeInMillis()/1000); - paramObject.accumulate(JSON_FAVORITE, note.isFavorite()); + paramObject.accumulate(JSON_FAVORITE, note.isFavorite()); + paramObject.accumulate(JSON_CATEGORY, note.getCategory()); return new NoteResponse(requestServer(ccm, path, method, paramObject, null)); } @@ -138,6 +140,7 @@ private ResponseData requestServer(CustomCertManager ccm, String target, String con.setRequestProperty( "Authorization", "Basic " + Base64.encodeToString((username + ":" + password).getBytes(), Base64.NO_WRAP)); + con.setRequestProperty("User-Agent", "nextcloud-notes/" + BuildConfig.VERSION_NAME + " (Android)"); if(lastETag!=null && METHOD_GET.equals(method)) { con.setRequestProperty("If-None-Match", lastETag); } @@ -177,4 +180,4 @@ private ResponseData requestServer(CustomCertManager ccm, String target, String // return these header fields since they should only be saved after successful processing the result! return new ResponseData(result.toString(), etag, lastModified); } -} +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_change_category.xml b/app/src/main/res/layout/dialog_change_category.xml new file mode 100644 index 000000000..f590da89b --- /dev/null +++ b/app/src/main/res/layout/dialog_change_category.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_note_list_view.xml b/app/src/main/res/menu/menu_note_list_view.xml index 2aa6866e4..c27740ea7 100644 --- a/app/src/main/res/menu/menu_note_list_view.xml +++ b/app/src/main/res/menu/menu_note_list_view.xml @@ -7,6 +7,11 @@ android:title="@string/menu_favorite" android:checkable="true" app:showAsAction="ifRoom" /> + Copy Edit Cancel + Category Favorite Preview Share About + Chose category + Please enter a category name Copy Today From 8a403f3469710f22247cca47557e12458ade403c Mon Sep 17 00:00:00 2001 From: korelstar Date: Mon, 31 Jul 2017 18:46:32 +0200 Subject: [PATCH 3/3] auto-save category --- .../owncloud/notes/android/activity/EditNoteActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/EditNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/EditNoteActivity.java index 6bfa73139..8287822ab 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/EditNoteActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/EditNoteActivity.java @@ -237,6 +237,7 @@ private void showCategorySelector() { @Override public void onCategoryChosen(String category) { note.setCategory(category); + autoSave(); } /**