mirror of
https://github.com/viq/NewsBlur.git
synced 2025-09-18 21:43:31 +00:00
Merge branch 'master' into circular
* master: Rejiggering autocomplete to only include > 10 subs. Have RegisterProgressFragment finished via noHistory Manifest option rather than hackish finish with Fragment. Improve comments Fix registration regression bug caused by #151 Fix for #159 force close during add feed (auto complete) now that is is enabled again Remove log call from DeleteFeedFragment Fix #140. Delete feed now works and confirmation dialog has been added. Fix issue where selection within stories was hidden
This commit is contained in:
commit
ce29e7688d
11 changed files with 169 additions and 34 deletions
|
@ -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):
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
|
||||
<activity
|
||||
android:name=".activity.RegisterProgress"
|
||||
android:noHistory="true"
|
||||
android:label="@string/get_started" />
|
||||
|
||||
<activity
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="newsblur">NewsBlur</string>
|
||||
|
@ -147,4 +146,5 @@
|
|||
<string name="friends_comments_count">%d COMMENTS</string>
|
||||
<string name="toast_marked_all_stories_as_read">All stories marked as read</string>
|
||||
<string name="unknown_user">Unknown User</string>
|
||||
<string name="delete_feed_message">Delete feed \"%s\"?</string>
|
||||
</resources>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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<Void, Void, Boolean>() {
|
||||
@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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue