From cf96315316de3e7e6430d8dc978ca253b5e3e563 Mon Sep 17 00:00:00 2001 From: dosiecki Date: Tue, 3 Nov 2015 14:48:49 -0800 Subject: [PATCH 1/7] Add ROM version to feedback debug info. --- clients/android/NewsBlur/src/com/newsblur/util/PrefsUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/android/NewsBlur/src/com/newsblur/util/PrefsUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/PrefsUtils.java index eda5b0abf..a4d958a99 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/PrefsUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/PrefsUtils.java @@ -78,7 +78,7 @@ public class PrefsUtils { StringBuilder s = new StringBuilder(AppConstants.FEEDBACK_URL); s.append("%0A%0A"); s.append("%0Aapp version: ").append(getVersion(context)); - s.append("%0Aandroid version: ").append(Build.VERSION.RELEASE); + s.append("%0Aandroid version: ").append(Build.VERSION.RELEASE).append(" (" + Build.DISPLAY + ")"); s.append("%0Adevice: ").append(Build.MANUFACTURER + "+" + Build.MODEL + "+(" + Build.BOARD + ")"); s.append("%0Asqlite version: ").append(FeedUtils.dbHelper.getEngineVersion()); s.append("%0Ausername: ").append(getUserDetails(context).username); From 8dff7b1b6e0792820e02c8ac0ad86084b6968f86 Mon Sep 17 00:00:00 2001 From: dosiecki Date: Tue, 3 Nov 2015 15:03:43 -0800 Subject: [PATCH 2/7] Fix reappearing loading message in Reading view. --- clients/android/NewsBlur/res/layout/activity_reading.xml | 2 +- clients/android/NewsBlur/src/com/newsblur/activity/Reading.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/clients/android/NewsBlur/res/layout/activity_reading.xml b/clients/android/NewsBlur/res/layout/activity_reading.xml index db0c964b6..5049a39a8 100644 --- a/clients/android/NewsBlur/res/layout/activity_reading.xml +++ b/clients/android/NewsBlur/res/layout/activity_reading.xml @@ -4,7 +4,7 @@ android:layout_height="match_parent" > Date: Tue, 3 Nov 2015 15:55:09 -0800 Subject: [PATCH 3/7] Rework app launch to ensure DB isn't accessed before ready. --- clients/android/NewsBlur/AndroidManifest.xml | 16 +++++-- .../NewsBlur/res/layout/activity_init.xml | 6 +++ .../com/newsblur/activity/InitActivity.java | 46 +++++++++++++++++++ .../src/com/newsblur/activity/Login.java | 21 --------- 4 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 clients/android/NewsBlur/res/layout/activity_init.xml create mode 100644 clients/android/NewsBlur/src/com/newsblur/activity/InitActivity.java diff --git a/clients/android/NewsBlur/AndroidManifest.xml b/clients/android/NewsBlur/AndroidManifest.xml index c79ebd97d..922f8a42a 100644 --- a/clients/android/NewsBlur/AndroidManifest.xml +++ b/clients/android/NewsBlur/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="109" + android:versionName="4.6.0b3" > + android:noHistory="true"> + + + + + + diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/InitActivity.java b/clients/android/NewsBlur/src/com/newsblur/activity/InitActivity.java new file mode 100644 index 000000000..6de70a650 --- /dev/null +++ b/clients/android/NewsBlur/src/com/newsblur/activity/InitActivity.java @@ -0,0 +1,46 @@ +package com.newsblur.activity; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.app.Activity; +import android.view.Window; + +import com.newsblur.R; +import com.newsblur.util.FeedUtils; +import com.newsblur.util.PrefConstants; +import com.newsblur.util.PrefsUtils; + +/** + * The very first activity we launch. Checks to see if there is a user logged in yet and then + * either loads the Main UI or a Login screen as needed. Also responsible for warming up the + * DB connection used by all other Activities. + */ +public class InitActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_init); + + // this is the first Activity launched; use it to init the global singletons in FeedUtils + FeedUtils.offerInitContext(this); + + // see if a user is already logged in; if so, jump to the Main activity + preferenceCheck(); + } + + private void preferenceCheck() { + final SharedPreferences preferences = getSharedPreferences(PrefConstants.PREFERENCES, Context.MODE_PRIVATE); + if (preferences.getString(PrefConstants.PREF_COOKIE, null) != null) { + Intent mainIntent = new Intent(this, Main.class); + startActivity(mainIntent); + } else { + Intent loginIntent = new Intent(this, Login.class); + startActivity(loginIntent); + } + } + + +} diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/Login.java b/clients/android/NewsBlur/src/com/newsblur/activity/Login.java index 82966d7a8..18171bb32 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/Login.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/Login.java @@ -1,8 +1,5 @@ package com.newsblur.activity; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.app.Activity; import android.app.FragmentManager; @@ -11,9 +8,6 @@ import android.view.Window; import com.newsblur.R; import com.newsblur.fragment.LoginRegisterFragment; -import com.newsblur.util.FeedUtils; -import com.newsblur.util.PrefConstants; -import com.newsblur.util.PrefsUtils; public class Login extends Activity { @@ -21,12 +15,6 @@ public class Login extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // this is the first Activity launched; use it to init the global singletons in FeedUtils - FeedUtils.offerInitContext(this); - - // see if a user is already logged in; if so, jump to the Main activity - preferenceCheck(); - requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_login); FragmentManager fragmentManager = getFragmentManager(); @@ -39,13 +27,4 @@ public class Login extends Activity { } } - private void preferenceCheck() { - final SharedPreferences preferences = getSharedPreferences(PrefConstants.PREFERENCES, Context.MODE_PRIVATE); - if (preferences.getString(PrefConstants.PREF_COOKIE, null) != null) { - final Intent mainIntent = new Intent(this, Main.class); - startActivity(mainIntent); - } - } - - } From 9e1a4860d3f0d95b709209dcb98d540eb3104593 Mon Sep 17 00:00:00 2001 From: dosiecki Date: Fri, 6 Nov 2015 09:43:22 -0800 Subject: [PATCH 4/7] Fix crash on long-stale Activity contexts. --- .../NewsBlur/src/com/newsblur/activity/InitActivity.java | 4 +--- .../NewsBlur/src/com/newsblur/activity/NbActivity.java | 3 +++ .../android/NewsBlur/src/com/newsblur/util/FeedUtils.java | 8 ++++++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/InitActivity.java b/clients/android/NewsBlur/src/com/newsblur/activity/InitActivity.java index 6de70a650..926dc753e 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/InitActivity.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/InitActivity.java @@ -22,7 +22,6 @@ public class InitActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_init); // this is the first Activity launched; use it to init the global singletons in FeedUtils FeedUtils.offerInitContext(this); @@ -32,7 +31,7 @@ public class InitActivity extends Activity { } private void preferenceCheck() { - final SharedPreferences preferences = getSharedPreferences(PrefConstants.PREFERENCES, Context.MODE_PRIVATE); + SharedPreferences preferences = getSharedPreferences(PrefConstants.PREFERENCES, Context.MODE_PRIVATE); if (preferences.getString(PrefConstants.PREF_COOKIE, null) != null) { Intent mainIntent = new Intent(this, Main.class); startActivity(mainIntent); @@ -41,6 +40,5 @@ public class InitActivity extends Activity { startActivity(loginIntent); } } - } diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/NbActivity.java b/clients/android/NewsBlur/src/com/newsblur/activity/NbActivity.java index 5f3429b8e..d62cc138f 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/NbActivity.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/NbActivity.java @@ -8,6 +8,7 @@ import android.widget.Toast; import com.newsblur.service.NBSyncService; import com.newsblur.util.AppConstants; +import com.newsblur.util.FeedUtils; import com.newsblur.util.PrefsUtils; import com.newsblur.util.UIUtils; @@ -45,6 +46,8 @@ public class NbActivity extends Activity { super.onCreate(bundle); + FeedUtils.offerInitContext(this); + if (bundle != null) { uniqueLoginKey = bundle.getString(UNIQUE_LOGIN_KEY); } diff --git a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java index 22157f7e1..b44d7c60b 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java @@ -32,8 +32,12 @@ public class FeedUtils { public static ImageLoader imageLoader; public static void offerInitContext(Context context) { - dbHelper = new BlurDatabaseHelper(context); - imageLoader = new ImageLoader(context); + if (dbHelper == null) { + dbHelper = new BlurDatabaseHelper(context.getApplicationContext()); + } + if (imageLoader == null) { + imageLoader = new ImageLoader(context.getApplicationContext()); + } } private static void triggerSync(Context c) { From 45bf985853d3aa3416f327b099cbf3ec61a853d2 Mon Sep 17 00:00:00 2001 From: dosiecki Date: Fri, 6 Nov 2015 11:29:19 -0800 Subject: [PATCH 5/7] Better Send To functionality for receivers that support it. (#803) --- clients/android/NewsBlur/res/values/strings.xml | 2 +- .../android/NewsBlur/src/com/newsblur/util/FeedUtils.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/clients/android/NewsBlur/res/values/strings.xml b/clients/android/NewsBlur/res/values/strings.xml index f90cf6850..ed3751d9e 100644 --- a/clients/android/NewsBlur/res/values/strings.xml +++ b/clients/android/NewsBlur/res/values/strings.xml @@ -44,7 +44,7 @@ There was an error. Check your internet connection. - \"%1$s\" - %2$s + %1$s \n\n\"%2$s\" \n\n%3$s… \n\n--\nShared with NewsBlur.com Comment (Optional) Share \"%s\" to your Blurblog? Share diff --git a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java index b44d7c60b..6c644c3f5 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java @@ -210,9 +210,8 @@ public class FeedUtils { Intent intent = new Intent(android.content.Intent.ACTION_SEND); intent.setType("text/plain"); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); - intent.putExtra(Intent.EXTRA_SUBJECT, Html.fromHtml(story.title)); - final String shareString = context.getResources().getString(R.string.share); - intent.putExtra(Intent.EXTRA_TEXT, String.format(shareString, new Object[]{Html.fromHtml(story.title), story.permalink})); + intent.putExtra(Intent.EXTRA_SUBJECT, Html.fromHtml(story.title).toString()); + intent.putExtra(Intent.EXTRA_TEXT, String.format(context.getResources().getString(R.string.send_body), new Object[]{story.permalink, Html.fromHtml(story.title), Html.fromHtml(story.shortContent)})); context.startActivity(Intent.createChooser(intent, "Send using")); } From 9b9d42753ba61ee16216c966b4ab5dc233031bab Mon Sep 17 00:00:00 2001 From: dosiecki Date: Thu, 12 Nov 2015 02:53:58 -0800 Subject: [PATCH 6/7] Feed/folder chooser. (#202) --- .../res/layout/dialog_choosefolders.xml | 14 ++ .../NewsBlur/res/layout/row_choosefolders.xml | 23 ++++ .../NewsBlur/res/menu/context_feed.xml | 5 +- .../android/NewsBlur/res/values/strings.xml | 13 +- .../newsblur/database/BlurDatabaseHelper.java | 10 ++ .../newsblur/database/FolderListAdapter.java | 26 +--- .../src/com/newsblur/domain/Folder.java | 36 +++++- .../fragment/ChooseFoldersFragment.java | 122 ++++++++++++++++++ .../newsblur/fragment/FolderListFragment.java | 6 +- .../com/newsblur/network/APIConstants.java | 3 + .../src/com/newsblur/network/APIManager.java | 15 +++ .../src/com/newsblur/util/FeedUtils.java | 16 +++ 12 files changed, 258 insertions(+), 31 deletions(-) create mode 100644 clients/android/NewsBlur/res/layout/dialog_choosefolders.xml create mode 100644 clients/android/NewsBlur/res/layout/row_choosefolders.xml create mode 100644 clients/android/NewsBlur/src/com/newsblur/fragment/ChooseFoldersFragment.java diff --git a/clients/android/NewsBlur/res/layout/dialog_choosefolders.xml b/clients/android/NewsBlur/res/layout/dialog_choosefolders.xml new file mode 100644 index 000000000..c563b219e --- /dev/null +++ b/clients/android/NewsBlur/res/layout/dialog_choosefolders.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/clients/android/NewsBlur/res/layout/row_choosefolders.xml b/clients/android/NewsBlur/res/layout/row_choosefolders.xml new file mode 100644 index 000000000..9a4235aab --- /dev/null +++ b/clients/android/NewsBlur/res/layout/row_choosefolders.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/clients/android/NewsBlur/res/menu/context_feed.xml b/clients/android/NewsBlur/res/menu/context_feed.xml index 49fe7d2fe..3149fdf67 100644 --- a/clients/android/NewsBlur/res/menu/context_feed.xml +++ b/clients/android/NewsBlur/res/menu/context_feed.xml @@ -9,5 +9,8 @@ + + - \ No newline at end of file + diff --git a/clients/android/NewsBlur/res/values/strings.xml b/clients/android/NewsBlur/res/values/strings.xml index ed3751d9e..86e2ff498 100644 --- a/clients/android/NewsBlur/res/values/strings.xml +++ b/clients/android/NewsBlur/res/values/strings.xml @@ -30,6 +30,8 @@ Comment user image Empty list placeholder Menu + + Choose Folders for Feed %s %s shares %s comments @@ -41,6 +43,7 @@ SAVED STORIES Read Stories Saved Stories + TOP LEVEL There was an error. Check your internet connection. @@ -64,10 +67,11 @@ Reply to \"%s\" - Okay - Cancel - Done - Open image + OKAY + CANCEL + DONE + OPEN IMAGE + SAVE FOLDERS Profile Location icon @@ -107,6 +111,7 @@ Mark feed as read Delete feed Unfollow user + Choose folders Mark folder as read Share this story Adjust text size diff --git a/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java b/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java index 6338727eb..10b71729d 100644 --- a/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java +++ b/clients/android/NewsBlur/src/com/newsblur/database/BlurDatabaseHelper.java @@ -823,6 +823,16 @@ public class BlurDatabaseHelper { return result; } + public List getFolders() { + Cursor c = getFoldersCursor(null); + List folders = new ArrayList(c.getCount()); + while (c.moveToNext()) { + folders.add(Folder.fromCursor(c)); + } + c.close(); + return folders; + } + public Loader getFoldersLoader() { return new QueryCursorLoader(context) { protected Cursor createCursor() {return getFoldersCursor(cancellationSignal);} diff --git a/clients/android/NewsBlur/src/com/newsblur/database/FolderListAdapter.java b/clients/android/NewsBlur/src/com/newsblur/database/FolderListAdapter.java index d923cae42..d5afc5fef 100644 --- a/clients/android/NewsBlur/src/com/newsblur/database/FolderListAdapter.java +++ b/clients/android/NewsBlur/src/com/newsblur/database/FolderListAdapter.java @@ -3,7 +3,6 @@ package com.newsblur.database; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -146,7 +145,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter { } String folderName = activeFolderNames.get(convertGroupPositionToActiveFolderIndex(groupPosition)); TextView folderTitle = ((TextView) v.findViewById(R.id.row_foldername)); - folderTitle.setText(folderName.toUpperCase()); + folderTitle.setText(folderName); final String canonicalFolderName = flatFolders.get(folderName).name; folderTitle.setOnClickListener(new OnClickListener() { @Override @@ -410,7 +409,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter { } // create a sorted list of folder display names List sortedFolderNames = new ArrayList(flatFolders.keySet()); - customSortList(sortedFolderNames); + Collections.sort(sortedFolderNames, Folder.FolderNameComparator); // figure out which sub-folders are hidden because their parents are closed (flat names) Set hiddenSubFolders = getSubFoldersRecursive(closedFolders); Set hiddenSubFoldersFlat = new HashSet(hiddenSubFolders.size()); @@ -642,27 +641,6 @@ public class FolderListAdapter extends BaseExpandableListAdapter { return count; } - /** - * Custom sorting for folders. Handles the special case to keep the root - * folder on top, and also the expectation that *despite locale*, folders - * starting with an underscore should show up on top. - */ - private void customSortList(List list) { - Collections.sort(list, CustomComparator); - } - - private final static Comparator CustomComparator = new Comparator() { - @Override - public int compare(String s1, String s2) { - if (TextUtils.equals(s1, s2)) return 0; - if (s1.equals(AppConstants.ROOT_FOLDER)) return -1; - if (s2.equals(AppConstants.ROOT_FOLDER)) return 1; - if (s1.startsWith("_")) return -1; - if (s2.startsWith("_")) return 1; - return String.CASE_INSENSITIVE_ORDER.compare(s1, s2); - } - }; - public void safeClear(Collection c) { if (c != null) c.clear(); } diff --git a/clients/android/NewsBlur/src/com/newsblur/domain/Folder.java b/clients/android/NewsBlur/src/com/newsblur/domain/Folder.java index 8e60485b1..061c02669 100644 --- a/clients/android/NewsBlur/src/com/newsblur/domain/Folder.java +++ b/clients/android/NewsBlur/src/com/newsblur/domain/Folder.java @@ -6,6 +6,7 @@ import android.text.TextUtils; import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; import java.util.List; import com.newsblur.database.DatabaseConstants; @@ -63,7 +64,11 @@ public class Folder { builder.append(" - "); } builder.append(name); - return builder.toString(); + return builder.toString().toUpperCase(); + } + + public String toString() { + return flatName(); } public void removeOrphanFeedIds(Collection orphanFeedIds) { @@ -80,4 +85,33 @@ public class Folder { return name.hashCode(); } + public final static Comparator FolderNameComparator = new Comparator() { + @Override + public int compare(String s1, String s2) { + return compareFolderNames(s1, s2); + } + }; + + public final static Comparator FolderComparator = new Comparator() { + @Override + public int compare(Folder f1, Folder f2) { + return compareFolderNames(f1.name, f2.name); + } + }; + + /** + * Custom sorting for folders. Handles the special case to keep the root + * folder on top, and also the expectation that *despite locale*, folders + * starting with an underscore should show up on top. + */ + private static int compareFolderNames(String s1, String s2) { + if (TextUtils.equals(s1, s2)) return 0; + if (s1.equals(AppConstants.ROOT_FOLDER)) return -1; + if (s2.equals(AppConstants.ROOT_FOLDER)) return 1; + if (s1.startsWith("_")) return -1; + if (s2.startsWith("_")) return 1; + return String.CASE_INSENSITIVE_ORDER.compare(s1, s2); + } + + } diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/ChooseFoldersFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/ChooseFoldersFragment.java new file mode 100644 index 000000000..9b4f8c90e --- /dev/null +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/ChooseFoldersFragment.java @@ -0,0 +1,122 @@ +package com.newsblur.fragment; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.DialogInterface; +import android.os.Bundle; +import android.util.ArraySet; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ArrayAdapter; +import android.widget.CheckBox; +import android.widget.ListAdapter; +import android.widget.ListView; + +import butterknife.ButterKnife; +import butterknife.FindView; +import butterknife.OnClick; + +import com.newsblur.R; +import com.newsblur.domain.Feed; +import com.newsblur.domain.Folder; +import com.newsblur.util.FeedUtils; + +public class ChooseFoldersFragment extends DialogFragment { + + private Feed feed; + + @FindView(R.id.choose_folders_list) ListView listView; + + public static ChooseFoldersFragment newInstance(Feed feed) { + ChooseFoldersFragment fragment = new ChooseFoldersFragment(); + Bundle args = new Bundle(); + args.putSerializable("feed", feed); + fragment.setArguments(args); + return fragment; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + feed = (Feed) getArguments().getSerializable("feed"); + final List folders = FeedUtils.dbHelper.getFolders(); + Collections.sort(folders, Folder.FolderComparator); + + final Set newFolders = new ArraySet(); + final Set oldFolders = new ArraySet(); + for (Folder folder : folders) { + if (folder.feedIds.contains(feed.feedId)) { + newFolders.add(folder.name); + oldFolders.add(folder.name); + } + } + + final Activity activity = getActivity(); + LayoutInflater inflater = LayoutInflater.from(activity); + View v = inflater.inflate(R.layout.dialog_choosefolders, null); + ButterKnife.bind(this, v); + + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(String.format(getResources().getString(R.string.title_choose_folders), feed.title)); + builder.setView(v); + + builder.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + ChooseFoldersFragment.this.dismiss(); + } + }); + builder.setPositiveButton(R.string.dialog_folders_save, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + FeedUtils.moveFeedToFolders(activity, feed.feedId, newFolders, oldFolders); + ChooseFoldersFragment.this.dismiss(); + } + }); + + ListAdapter adapter = new ArrayAdapter(getActivity(), R.layout.row_choosefolders, R.id.choosefolders_foldername, folders) { + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + View v = super.getView(position, convertView, parent); + CheckBox row = (CheckBox) v.findViewById(R.id.choosefolders_foldername); + if (position == 0) { + row.setText(R.string.top_level); + } + row.setChecked(folders.get(position).feedIds.contains(feed.feedId)); + row.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + CheckBox row = (CheckBox) v; + if (row.isChecked()) { + folders.get(position).feedIds.add(feed.feedId); + newFolders.add(folders.get(position).name); + } else { + folders.get(position).feedIds.remove(feed.feedId); + newFolders.remove(folders.get(position).name); + } + } + }); + return v; + } + }; + listView.setAdapter(adapter); + + Dialog dialog = builder.create(); + dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_DITHER, WindowManager.LayoutParams.FLAG_DITHER); + dialog.getWindow().getAttributes().gravity = Gravity.BOTTOM; + return dialog; + } + +} + diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java index 0f67826ca..17c990398 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java @@ -218,6 +218,7 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen inflater.inflate(R.menu.context_feed, menu); if (groupPosition == FolderListAdapter.ALL_SHARED_STORIES_GROUP_POSITION) { menu.removeItem(R.id.menu_delete_feed); + menu.removeItem(R.id.menu_choose_folders); } else { menu.removeItem(R.id.menu_unfollow); } @@ -258,7 +259,10 @@ public class FolderListFragment extends NbFragment implements OnCreateContextMen FeedUtils.markFeedsRead(FeedSet.allFeeds(), null, null, getActivity()); } return true; - } + } else if (item.getItemId() == R.id.menu_choose_folders) { + DialogFragment chooseFoldersFragment = ChooseFoldersFragment.newInstance(adapter.getFeed(adapter.getChild(groupPosition, childPosition))); + chooseFoldersFragment.show(getFragmentManager(), "dialog"); + } return super.onContextItemSelected(item); } diff --git a/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java b/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java index 53cec91b8..8daddf6f4 100644 --- a/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java +++ b/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java @@ -46,6 +46,7 @@ public class APIConstants { public static final String URL_STORY_TEXT = NEWSBLUR_URL + "/rss_feeds/original_text"; public static final String URL_UNREAD_HASHES = NEWSBLUR_URL + "/reader/unread_story_hashes"; public static final String URL_READ_STORIES = NEWSBLUR_URL + "/reader/read_stories"; + public static final String URL_MOVE_FEED_TO_FOLDERS = NEWSBLUR_URL + "/reader/move_feed_to_folders"; public static final String PARAMETER_FEEDS = "f"; public static final String PARAMETER_H = "h"; @@ -80,6 +81,8 @@ public class APIConstants { public static final String PARAMETER_GLOBAL_FEED = "global_feed"; public static final String PARAMETER_INCLUDE_HIDDEN = "include_hidden"; public static final String PARAMETER_LIMIT = "limit"; + public static final String PARAMETER_TO_FOLDER = "to_folders"; + public static final String PARAMETER_IN_FOLDERS = "in_folders"; public static final String VALUE_PREFIX_SOCIAL = "social:"; public static final String VALUE_ALLSOCIAL = "river:blurblogs"; // the magic value passed to the mark-read API for all social feeds diff --git a/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java b/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java index 8cc01f7bc..f0a620450 100644 --- a/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java +++ b/clients/android/NewsBlur/src/com/newsblur/network/APIManager.java @@ -241,6 +241,21 @@ public class APIManager { } } + public NewsBlurResponse moveFeedToFolders(String feedId, Set toFolders, Set inFolders) { + ValueMultimap values = new ValueMultimap(); + for (String folder : toFolders) { + if (folder.equals(AppConstants.ROOT_FOLDER)) folder = ""; + values.put(APIConstants.PARAMETER_TO_FOLDER, folder); + } + for (String folder : inFolders) { + if (folder.equals(AppConstants.ROOT_FOLDER)) folder = ""; + values.put(APIConstants.PARAMETER_IN_FOLDERS, folder); + } + values.put(APIConstants.PARAMETER_FEEDID, feedId); + APIResponse response = post(APIConstants.URL_MOVE_FEED_TO_FOLDERS, values); + return response.getResponse(gson, NewsBlurResponse.class); + } + public UnreadCountResponse getFeedUnreadCounts(Set apiIds) { ValueMultimap values = new ValueMultimap(); for (String id : apiIds) { diff --git a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java index 6c644c3f5..26aebe7cb 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java @@ -250,6 +250,22 @@ public class FeedUtils { triggerSync(context); } + public static void moveFeedToFolders(final Context context, final String feedId, final Set toFolders, final Set inFolders) { + if (toFolders.size() < 1) return; + new AsyncTask() { + @Override + protected NewsBlurResponse doInBackground(Void... arg) { + APIManager apiManager = new APIManager(context); + return apiManager.moveFeedToFolders(feedId, toFolders, inFolders); + } + @Override + protected void onPostExecute(NewsBlurResponse result) { + NBSyncService.forceFeedsFolders(); + triggerSync(context); + } + }.execute(); + } + public static FeedSet feedSetFromFolderName(String folderName) { return FeedSet.folder(folderName, getFeedIdsRecursive(folderName)); } From 73575400c625449298f8352a026211518e1d0190 Mon Sep 17 00:00:00 2001 From: dosiecki Date: Thu, 12 Nov 2015 02:55:49 -0800 Subject: [PATCH 7/7] Remove debug. --- .../android/NewsBlur/src/com/newsblur/network/APIConstants.java | 1 - 1 file changed, 1 deletion(-) diff --git a/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java b/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java index 8daddf6f4..62d624b09 100644 --- a/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java +++ b/clients/android/NewsBlur/src/com/newsblur/network/APIConstants.java @@ -27,7 +27,6 @@ public class APIConstants { public static final String URL_SOCIALFEED_STORIES = NEWSBLUR_URL + "/social/stories"; public static final String URL_SIGNUP = NEWSBLUR_URL + "/api/signup"; public static final String URL_MARK_FEED_AS_READ = NEWSBLUR_URL + "/reader/mark_feed_as_read/"; - //public static final String URL_MARK_FEED_AS_READ = "http://httpstat.us/502"; public static final String URL_MARK_ALL_AS_READ = NEWSBLUR_URL + "/reader/mark_all_as_read/"; public static final String URL_MARK_STORIES_READ = NEWSBLUR_URL + "/reader/mark_story_hashes_as_read/"; public static final String URL_SHARE_STORY = NEWSBLUR_URL + "/social/share_story";