diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index 6d552d156..3b8da3686 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -231,18 +231,18 @@ class Feed(models.Model): return MStory.sync_all_redis(self.pk) def sync_autocompletion(self): - if self.num_subscribers <= 1: return + if self.num_subscribers <= 10: return if self.branch_from_feed: return if any(t in self.feed_address for t in ['token', 'private']): return engine = RedisEngine(prefix="FT", connection_pool=settings.REDIS_AUTOCOMPLETE_POOL) engine.store(self.pk, title=self.feed_title) - engine.boost(self.pk, self.num_subscribers) + engine.boost(self.pk, min(1, self.num_subscribers / 10000.)) parts = urlparse(self.feed_address) engine = RedisEngine(prefix="FA", connection_pool=settings.REDIS_AUTOCOMPLETE_POOL) engine.store(self.pk, title=parts.hostname) - engine.boost(self.pk, self.num_subscribers) + engine.boost(self.pk, min(1, self.num_subscribers / 10000.)) @classmethod def autocomplete(self, prefix, limit=5): diff --git a/media/android/NewsBlur/AndroidManifest.xml b/media/android/NewsBlur/AndroidManifest.xml index 893692046..6ba0ed9f5 100644 --- a/media/android/NewsBlur/AndroidManifest.xml +++ b/media/android/NewsBlur/AndroidManifest.xml @@ -36,6 +36,7 @@ NewsBlur @@ -147,4 +146,5 @@ %d COMMENTS All stories marked as read Unknown User + Delete feed \"%s\"? diff --git a/media/android/NewsBlur/src/com/newsblur/activity/FeedItemsList.java b/media/android/NewsBlur/src/com/newsblur/activity/FeedItemsList.java index cd8eac60c..11858630c 100644 --- a/media/android/NewsBlur/src/com/newsblur/activity/FeedItemsList.java +++ b/media/android/NewsBlur/src/com/newsblur/activity/FeedItemsList.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; +import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentTransaction; import android.widget.Toast; @@ -15,6 +16,7 @@ import com.newsblur.R; import com.newsblur.database.DatabaseConstants; import com.newsblur.database.FeedProvider; import com.newsblur.domain.Feed; +import com.newsblur.fragment.DeleteFeedFragment; import com.newsblur.fragment.FeedItemListFragment; import com.newsblur.fragment.SyncUpdateFragment; import com.newsblur.network.APIManager; @@ -24,7 +26,11 @@ import com.newsblur.service.SyncService; public class FeedItemsList extends ItemsList { public static final String EXTRA_FEED = "feedId"; + public static final String EXTRA_FEED_TITLE = "feedTitle"; + public static final String EXTRA_FOLDER_NAME = "folderName"; private String feedId; + private String feedTitle; + private String folderName; private APIManager apiManager; private boolean stopLoading = false; @@ -33,7 +39,9 @@ public class FeedItemsList extends ItemsList { super.onCreate(bundle); apiManager = new APIManager(this); feedId = getIntent().getStringExtra(EXTRA_FEED); - + feedTitle = getIntent().getStringExtra(EXTRA_FEED_TITLE); + folderName = getIntent().getStringExtra(EXTRA_FOLDER_NAME); + final Uri feedUri = FeedProvider.FEEDS_URI.buildUpon().appendPath(feedId).build(); Cursor cursor = getContentResolver().query(feedUri, null, FeedProvider.getStorySelectionFromState(currentState), null, null); cursor.moveToFirst(); @@ -58,12 +66,8 @@ public class FeedItemsList extends ItemsList { } public void deleteFeed() { - setSupportProgressBarIndeterminateVisibility(true); - final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, SyncService.class); - intent.putExtra(SyncService.EXTRA_STATUS_RECEIVER, syncFragment.receiver); - intent.putExtra(SyncService.SYNCSERVICE_TASK, SyncService.EXTRA_TASK_DELETE_FEED); - intent.putExtra(SyncService.EXTRA_TASK_FEED_ID, Long.parseLong(feedId)); - startService(intent); + DialogFragment deleteFeedFragment = DeleteFeedFragment.newInstance(Long.parseLong(feedId), feedTitle, folderName); + deleteFeedFragment.show(fragmentManager, "dialog"); } @Override diff --git a/media/android/NewsBlur/src/com/newsblur/activity/Main.java b/media/android/NewsBlur/src/com/newsblur/activity/Main.java index 520b692e6..5f4b7d1ef 100644 --- a/media/android/NewsBlur/src/com/newsblur/activity/Main.java +++ b/media/android/NewsBlur/src/com/newsblur/activity/Main.java @@ -115,15 +115,6 @@ public class Main extends NbFragmentActivity implements StateChangedListener, Sy return super.onOptionsItemSelected(item); } - public void deleteFeed(long id, String foldername) { - setSupportProgressBarIndeterminateVisibility(true); - final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, SyncService.class); - intent.putExtra(SyncService.EXTRA_STATUS_RECEIVER, syncFragment.receiver); - intent.putExtra(SyncService.SYNCSERVICE_TASK, SyncService.EXTRA_TASK_DELETE_FEED); - intent.putExtra(SyncService.EXTRA_TASK_FEED_ID, id); - startService(intent); - } - @Override public void changedState(int state) { folderFeedList.changeState(state); diff --git a/media/android/NewsBlur/src/com/newsblur/activity/RegisterProgress.java b/media/android/NewsBlur/src/com/newsblur/activity/RegisterProgress.java index b6603e008..85d8e48dc 100644 --- a/media/android/NewsBlur/src/com/newsblur/activity/RegisterProgress.java +++ b/media/android/NewsBlur/src/com/newsblur/activity/RegisterProgress.java @@ -4,14 +4,19 @@ import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; +import com.actionbarsherlock.app.SherlockFragmentActivity; import com.newsblur.R; import com.newsblur.fragment.RegisterProgressFragment; -public class RegisterProgress extends NbFragmentActivity { +/** + * Show progress screen while registering request is being processed. This + * Activity doesn't extend NbFragmentActivity because it is one of the few + * Activities that will be shown while the user is still logged out. + */ +public class RegisterProgress extends SherlockFragmentActivity { private FragmentManager fragmentManager; private String currentTag = "fragment"; - private String TAG = "RegisterProgressActivity"; @Override protected void onCreate(Bundle bundle) { diff --git a/media/android/NewsBlur/src/com/newsblur/fragment/DeleteFeedFragment.java b/media/android/NewsBlur/src/com/newsblur/fragment/DeleteFeedFragment.java new file mode 100644 index 000000000..5b19f99a8 --- /dev/null +++ b/media/android/NewsBlur/src/com/newsblur/fragment/DeleteFeedFragment.java @@ -0,0 +1,119 @@ +package com.newsblur.fragment; + +import com.newsblur.R; +import com.newsblur.activity.Main; +import com.newsblur.database.FeedProvider; +import com.newsblur.network.APIManager; + +import android.app.Activity; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentManager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +public class DeleteFeedFragment extends DialogFragment { + private static final String FEED_ID = "feed_url"; + private static final String FEED_NAME = "feed_name"; + private static final String FOLDER_NAME = "folder_name"; + + private APIManager apiManager; + + public static DeleteFeedFragment newInstance(final long feedId, final String feedName, final String folderName) { + DeleteFeedFragment frag = new DeleteFeedFragment(); + Bundle args = new Bundle(); + args.putLong(FEED_ID, feedId); + args.putString(FEED_NAME, feedName); + args.putString(FOLDER_NAME, folderName); + frag.setArguments(args); + return frag; + } + + private FragmentManager fragmentManager; + private SyncUpdateFragment syncFragment; + + @Override + public void onCreate(Bundle savedInstanceState) { + setStyle(DialogFragment.STYLE_NO_TITLE, R.style.dialog); + super.onCreate(savedInstanceState); + + fragmentManager = super.getFragmentManager(); + + syncFragment = (SyncUpdateFragment) fragmentManager.findFragmentByTag(SyncUpdateFragment.TAG); + if (syncFragment == null) { + syncFragment = new SyncUpdateFragment(); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final String deleteFeedString = getResources().getString(R.string.delete_feed_message); + + apiManager = new APIManager(getActivity()); + View v = inflater.inflate(R.layout.fragment_confirm_dialog, null); + TextView messageView = (TextView) v.findViewById(R.id.dialog_message); + messageView.setText(String.format(deleteFeedString, getArguments().getString(FEED_NAME))); + + Button okayButton = (Button) v.findViewById(R.id.dialog_button_okay); + okayButton.setOnClickListener(new OnClickListener() { + public void onClick(final View v) { + v.setEnabled(false); + + new AsyncTask() { + @Override + protected Boolean doInBackground(Void... arg) { + long feedId = getArguments().getLong(FEED_ID); + String folderName = getArguments().getString(FOLDER_NAME); + if (apiManager.deleteFeed(feedId, folderName)) { + Uri feedUri = FeedProvider.FEEDS_URI.buildUpon().appendPath(Long.toString(feedId)).build(); + DeleteFeedFragment.this.getActivity().getContentResolver().delete(feedUri, null, null); + return true; + } + else { + return false; + } + } + + @Override + protected void onPostExecute(Boolean result) { + Activity activity = DeleteFeedFragment.this.getActivity(); + if (result) { + Toast.makeText(activity, "Deleted feed", Toast.LENGTH_SHORT).show(); + DeleteFeedFragment.this.dismiss(); + // if called from main view then refresh otherwise it was + // called from the feed view so finish + if (activity instanceof Main) { + ((Main)activity).updateAfterSync(); + } + else { + activity.finish(); + } + } else { + Toast.makeText(activity, getResources().getString(R.string.error_deleting_feed), Toast.LENGTH_LONG).show(); + DeleteFeedFragment.this.dismiss(); + } + }; + }.execute(); + + } + }); + + Button cancelButton = (Button) v.findViewById(R.id.dialog_button_cancel); + cancelButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + DeleteFeedFragment.this.dismiss(); + } + }); + + return v; + } + +} diff --git a/media/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java b/media/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java index 3d3e254f7..a517ff102 100644 --- a/media/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java +++ b/media/android/NewsBlur/src/com/newsblur/fragment/FolderListFragment.java @@ -11,6 +11,7 @@ import android.content.SharedPreferences; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; +import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.util.Log; import android.view.ContextMenu; @@ -31,7 +32,6 @@ import com.newsblur.R; import com.newsblur.activity.AllStoriesItemsList; import com.newsblur.activity.FeedItemsList; import com.newsblur.activity.ItemsList; -import com.newsblur.activity.Main; import com.newsblur.activity.NewsBlurApplication; import com.newsblur.activity.SocialFeedItemsList; import com.newsblur.database.DatabaseConstants; @@ -183,8 +183,14 @@ public class FolderListFragment extends Fragment implements OnGroupClickListener }.execute(Long.toString(info.id)); return true; } else if (item.getItemId() == R.id.menu_delete_feed) { - Toast.makeText(getActivity(), "Deleted feed", Toast.LENGTH_SHORT).show(); - ((Main) getActivity()).deleteFeed(info.id, null); + int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition); + int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition); + Cursor childCursor = folderAdapter.getChild(groupPosition, childPosition); + String feedTitle = childCursor.getString(childCursor.getColumnIndex(DatabaseConstants.FEED_TITLE)); + Cursor folderCursor = ((MixedExpandableListAdapter) list.getExpandableListAdapter()).getGroup(groupPosition); + String folderName = folderCursor.getString(folderCursor.getColumnIndex(DatabaseConstants.FOLDER_NAME)); + DialogFragment deleteFeedFragment = DeleteFeedFragment.newInstance(info.id, feedTitle, folderName); + deleteFeedFragment.show(getFragmentManager(), "dialog"); return true; } else if (item.getItemId() == R.id.menu_mark_folder_as_read) { int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition); @@ -329,7 +335,12 @@ public class FolderListFragment extends Fragment implements OnGroupClickListener final Intent intent = new Intent(getActivity(), FeedItemsList.class); Cursor childCursor = folderAdapter.getChild(groupPosition, childPosition); String feedId = childCursor.getString(childCursor.getColumnIndex(DatabaseConstants.FEED_ID)); + String feedTitle = childCursor.getString(childCursor.getColumnIndex(DatabaseConstants.FEED_TITLE)); + final Cursor folderCursor = ((MixedExpandableListAdapter) list.getExpandableListAdapter()).getGroup(groupPosition); + String folderName = folderCursor.getString(folderCursor.getColumnIndex(DatabaseConstants.FOLDER_NAME)); intent.putExtra(FeedItemsList.EXTRA_FEED, feedId); + intent.putExtra(FeedItemsList.EXTRA_FEED_TITLE, feedTitle); + intent.putExtra(FeedItemsList.EXTRA_FOLDER_NAME, folderName); intent.putExtra(ItemsList.EXTRA_STATE, currentState); getActivity().startActivityForResult(intent, FEEDCHECK ); } diff --git a/media/android/NewsBlur/src/com/newsblur/network/APIClient.java b/media/android/NewsBlur/src/com/newsblur/network/APIClient.java index a97d2d943..1cdf1aa75 100644 --- a/media/android/NewsBlur/src/com/newsblur/network/APIClient.java +++ b/media/android/NewsBlur/src/com/newsblur/network/APIClient.java @@ -173,6 +173,7 @@ public class APIClient { } final PrintWriter printWriter = new PrintWriter(connection.getOutputStream()); + Log.d(this.getClass().getName(), "parameterString = " + parameterString); printWriter.print(parameterString); printWriter.close(); diff --git a/media/android/NewsBlur/src/com/newsblur/network/APIManager.java b/media/android/NewsBlur/src/com/newsblur/network/APIManager.java index d46e31fbc..c936e4698 100644 --- a/media/android/NewsBlur/src/com/newsblur/network/APIManager.java +++ b/media/android/NewsBlur/src/com/newsblur/network/APIManager.java @@ -700,12 +700,15 @@ public class APIManager { // TODO find a better way to identify these failed responses boolean isServerMessage = false; JsonParser parser = new JsonParser(); - JsonObject asJsonObject = parser.parse(json).getAsJsonObject(); - if(asJsonObject.has("code")) { - JsonElement codeItem = asJsonObject.get("code"); - int code = codeItem.getAsInt(); - if(code == -1) - isServerMessage = true; + JsonElement jsonElement = parser.parse(json); + if(jsonElement.isJsonObject()) { + JsonObject asJsonObject = jsonElement.getAsJsonObject(); + if(asJsonObject.has("code")) { + JsonElement codeItem = asJsonObject.get("code"); + int code = codeItem.getAsInt(); + if(code == -1) + isServerMessage = true; + } } return isServerMessage; } diff --git a/media/css/reader.css b/media/css/reader.css index 23d780fb0..f0005eb9e 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -1048,11 +1048,11 @@ body { /* ================ */ -#story_titles ::-moz-selection { +.NB-feed-story-header-info ::-moz-selection { background: transparent; } -#story_titles ::selection { +.NB-feed-story-header-info ::selection { background: transparent; } @@ -10148,4 +10148,4 @@ form.opml_import_form input { } .NB-static-feedchooser .NB-feedchooser-premium-bullets li { background-color: rgba(255, 255, 255, .4); -} \ No newline at end of file +}