mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
support for custom server endpoints (#921)
This commit is contained in:
parent
865f8e5c0e
commit
a7e84ccfe9
9 changed files with 175 additions and 98 deletions
|
@ -12,7 +12,7 @@
|
|||
android:paddingBottom="20dp">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/login_fileds_container"
|
||||
android:id="@+id/login_fields_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
|
@ -43,7 +43,7 @@
|
|||
android:id="@+id/login_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/login_fileds_container"
|
||||
android:layout_below="@id/login_fields_container"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginTop="10dp"
|
||||
android:paddingLeft="16dp"
|
||||
|
@ -70,9 +70,30 @@
|
|||
android:layout_below="@id/login_change_to_register"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginTop="20dp"
|
||||
android:text="@string/forgot_password"
|
||||
android:text="@string/login_forgot_password"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/login_custom_server"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/login_forgot_password"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginTop="20dp"
|
||||
android:text="@string/login_custom_server"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/login_custom_server_value"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/login_custom_server"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginLeft="30dp"
|
||||
android:hint="@string/login_custom_server_hint"
|
||||
android:textSize="20sp"
|
||||
android:visibility="invisible" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
|
|
|
@ -6,7 +6,9 @@
|
|||
<string name="login_password_hint">password</string>
|
||||
<string name="login_registration_email_hint">email address</string>
|
||||
<string name="login_button_login">Log In</string>
|
||||
<string name="forgot_password"><u>I forgot my password</u></string>
|
||||
<string name="login_forgot_password"><u>I forgot my password</u></string>
|
||||
<string name="login_custom_server"><u>I have a custom server</u></string>
|
||||
<string name="login_custom_server_hint">https://www.newsblur.com</string>
|
||||
<string name="login_message_error">There was problem logging in to NewsBlur.</string>
|
||||
<string name="login_logging_in">Logging in…</string>
|
||||
<string name="login_logged_in">Logged in!</string>
|
||||
|
|
|
@ -23,7 +23,7 @@ public class AddFacebook extends NbActivity {
|
|||
|
||||
webview.setWebViewClient(new WebViewClient() {
|
||||
public boolean shouldOverrideUrlLoading(WebView view, String url){
|
||||
if (TextUtils.equals(url, APIConstants.NEWSBLUR_URL + "/")) {
|
||||
if (TextUtils.equals(url, APIConstants.buildUrl("/"))) {
|
||||
AddFacebook.this.setResult(FACEBOOK_AUTHED);
|
||||
AddFacebook.this.finish();
|
||||
return true;
|
||||
|
@ -33,7 +33,7 @@ public class AddFacebook extends NbActivity {
|
|||
}
|
||||
});
|
||||
|
||||
webview.loadUrl(APIConstants.URL_CONNECT_FACEBOOK);
|
||||
webview.loadUrl(APIConstants.buildUrl(APIConstants.PATH_CONNECT_FACEBOOK));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ public class AddTwitter extends NbActivity {
|
|||
|
||||
webview.setWebViewClient(new WebViewClient() {
|
||||
public boolean shouldOverrideUrlLoading(WebView view, String url){
|
||||
if (TextUtils.equals(url, APIConstants.NEWSBLUR_URL + "/")) {
|
||||
if (TextUtils.equals(url, APIConstants.buildUrl("/"))) {
|
||||
AddTwitter.this.setResult(TWITTER_AUTHED);
|
||||
AddTwitter.this.finish();
|
||||
return true;
|
||||
|
@ -33,7 +33,7 @@ public class AddTwitter extends NbActivity {
|
|||
}
|
||||
});
|
||||
|
||||
webview.loadUrl(APIConstants.URL_CONNECT_TWITTER);
|
||||
webview.loadUrl(APIConstants.buildUrl(APIConstants.PATH_CONNECT_TWITTER));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -22,7 +22,9 @@ import butterknife.OnClick;
|
|||
import com.newsblur.R;
|
||||
import com.newsblur.activity.LoginProgress;
|
||||
import com.newsblur.activity.RegisterProgress;
|
||||
import com.newsblur.network.APIConstants;
|
||||
import com.newsblur.util.AppConstants;
|
||||
import com.newsblur.util.PrefsUtils;
|
||||
|
||||
public class LoginRegisterFragment extends Fragment {
|
||||
|
||||
|
@ -32,6 +34,8 @@ public class LoginRegisterFragment extends Fragment {
|
|||
@Bind(R.id.registration_password) EditText register_password;
|
||||
@Bind(R.id.registration_email) EditText register_email;
|
||||
@Bind(R.id.login_viewswitcher) ViewSwitcher viewSwitcher;
|
||||
@Bind(R.id.login_custom_server) View customServer;
|
||||
@Bind(R.id.login_custom_server_value) EditText customServerValue;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
|
@ -63,6 +67,10 @@ public class LoginRegisterFragment extends Fragment {
|
|||
|
||||
@OnClick(R.id.login_button) void logIn() {
|
||||
if (!TextUtils.isEmpty(username.getText().toString())) {
|
||||
// set the custom server endpoint before any API access, even the cookie fetch.
|
||||
APIConstants.setCustomServer(customServerValue.getText().toString());
|
||||
PrefsUtils.saveCustomServer(getActivity(), customServerValue.getText().toString());
|
||||
|
||||
Intent i = new Intent(getActivity(), LoginProgress.class);
|
||||
i.putExtra("username", username.getText().toString());
|
||||
i.putExtra("password", password.getText().toString());
|
||||
|
@ -96,4 +104,9 @@ public class LoginRegisterFragment extends Fragment {
|
|||
}
|
||||
}
|
||||
|
||||
@OnClick(R.id.login_custom_server) void showCustomServer() {
|
||||
customServer.setVisibility(View.GONE);
|
||||
customServerValue.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -4,52 +4,72 @@ public class APIConstants {
|
|||
|
||||
private APIConstants() {} // util class - no instances
|
||||
|
||||
public static final String NEWSBLUR_URL = "https://www.newsblur.com";
|
||||
public static final String COOKIE_DOMAIN = ".newsblur.com";
|
||||
public static final String URL_AUTOFOLLOW_PREF = NEWSBLUR_URL + "/profile/set_preference";
|
||||
|
||||
private static final String DEFAULT_NEWSBLUR_URL_BASE = "https://www.newsblur.com";
|
||||
|
||||
private static String CurrentUrlBase = DEFAULT_NEWSBLUR_URL_BASE;
|
||||
|
||||
public static void setCustomServer(String newUrlBase) {
|
||||
if (newUrlBase == null) return;
|
||||
if (newUrlBase.length() <= 0) return;
|
||||
android.util.Log.i(APIConstants.class.getName(), "setting custom server: " + newUrlBase);
|
||||
CurrentUrlBase = newUrlBase;
|
||||
}
|
||||
|
||||
public static void unsetCustomServer() {
|
||||
CurrentUrlBase = DEFAULT_NEWSBLUR_URL_BASE;
|
||||
}
|
||||
|
||||
public static boolean isCustomServer() {
|
||||
return DEFAULT_NEWSBLUR_URL_BASE.equals(CurrentUrlBase);
|
||||
}
|
||||
|
||||
// TODO: make use of trailing slashes on URLs consistent or document why
|
||||
// they are not.
|
||||
|
||||
public static final String URL_LOGIN = NEWSBLUR_URL + "/api/login";
|
||||
public static final String URL_LOGINAS = NEWSBLUR_URL + "/reader/login_as";
|
||||
public static final String URL_FEEDS = NEWSBLUR_URL + "/reader/feeds/";
|
||||
public static final String URL_USER_PROFILE = NEWSBLUR_URL + "/social/profile";
|
||||
public static final String URL_MY_PROFILE = NEWSBLUR_URL + "/social/load_user_profile";
|
||||
public static final String URL_FOLLOW = NEWSBLUR_URL + "/social/follow";
|
||||
public static final String URL_UNFOLLOW = NEWSBLUR_URL + "/social/unfollow";
|
||||
public static final String PATH_LOGIN = "/api/login";
|
||||
public static final String PATH_LOGINAS = "/reader/login_as";
|
||||
public static final String PATH_FEEDS = "/reader/feeds/";
|
||||
public static final String PATH_USER_PROFILE = "/social/profile";
|
||||
public static final String PATH_MY_PROFILE = "/social/load_user_profile";
|
||||
public static final String PATH_FOLLOW = "/social/follow";
|
||||
public static final String PATH_UNFOLLOW = "/social/unfollow";
|
||||
public static final String PATH_AUTOFOLLOW_PREF = "/profile/set_preference";
|
||||
public static final String PATH_USER_ACTIVITIES = "/social/activities";
|
||||
public static final String PATH_USER_INTERACTIONS = "/social/interactions";
|
||||
public static final String PATH_RIVER_STORIES = "/reader/river_stories";
|
||||
public static final String PATH_SHARED_RIVER_STORIES = "/social/river_stories";
|
||||
public static final String PATH_FEED_STORIES = "/reader/feed";
|
||||
public static final String PATH_FEED_UNREAD_COUNT = "/reader/feed_unread_count";
|
||||
public static final String PATH_SOCIALFEED_STORIES = "/social/stories";
|
||||
public static final String PATH_SIGNUP = "/api/signup";
|
||||
public static final String PATH_MARK_FEED_AS_READ = "/reader/mark_feed_as_read/";
|
||||
public static final String PATH_MARK_ALL_AS_READ = "/reader/mark_all_as_read/";
|
||||
public static final String PATH_MARK_STORIES_READ = "/reader/mark_story_hashes_as_read/";
|
||||
public static final String PATH_SHARE_STORY = "/social/share_story";
|
||||
public static final String PATH_MARK_STORY_AS_STARRED = "/reader/mark_story_hash_as_starred/";
|
||||
public static final String PATH_MARK_STORY_AS_UNSTARRED = "/reader/mark_story_hash_as_unstarred/";
|
||||
public static final String PATH_MARK_STORY_AS_UNREAD = "/reader/mark_story_as_unread/";
|
||||
public static final String PATH_MARK_STORY_HASH_UNREAD = "/reader/mark_story_hash_as_unread/";
|
||||
public static final String PATH_STARRED_STORIES = "/reader/starred_stories";
|
||||
public static final String PATH_FEED_AUTOCOMPLETE = "/rss_feeds/feed_autocomplete";
|
||||
public static final String PATH_LIKE_COMMENT = "/social/like_comment";
|
||||
public static final String PATH_UNLIKE_COMMENT = "/social/remove_like_comment";
|
||||
public static final String PATH_REPLY_TO = "/social/save_comment_reply";
|
||||
public static final String PATH_ADD_FEED = "/reader/add_url";
|
||||
public static final String PATH_DELETE_FEED = "/reader/delete_feed";
|
||||
public static final String PATH_CLASSIFIER_SAVE = "/classifier/save";
|
||||
public static final String PATH_STORY_TEXT = "/rss_feeds/original_text";
|
||||
public static final String PATH_UNREAD_HASHES = "/reader/unread_story_hashes";
|
||||
public static final String PATH_READ_STORIES = "/reader/read_stories";
|
||||
public static final String PATH_MOVE_FEED_TO_FOLDERS = "/reader/move_feed_to_folders";
|
||||
public static final String PATH_SAVE_FEED_CHOOSER = "/reader/save_feed_chooser";
|
||||
public static final String PATH_CONNECT_FACEBOOK = "/oauth/facebook_connect/";
|
||||
public static final String PATH_CONNECT_TWITTER = "/oauth/twitter_connect/";
|
||||
|
||||
public static String buildUrl(String path) {
|
||||
return CurrentUrlBase + path;
|
||||
}
|
||||
|
||||
public static final String URL_USER_ACTIVITIES = NEWSBLUR_URL + "/social/activities";
|
||||
public static final String URL_USER_INTERACTIONS = NEWSBLUR_URL + "/social/interactions";
|
||||
public static final String URL_RIVER_STORIES = NEWSBLUR_URL + "/reader/river_stories";
|
||||
public static final String URL_SHARED_RIVER_STORIES = NEWSBLUR_URL + "/social/river_stories";
|
||||
|
||||
public static final String URL_FEED_STORIES = NEWSBLUR_URL + "/reader/feed";
|
||||
public static final String URL_FEED_UNREAD_COUNT = NEWSBLUR_URL + "/reader/feed_unread_count";
|
||||
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_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";
|
||||
public static final String URL_MARK_STORY_AS_STARRED = NEWSBLUR_URL + "/reader/mark_story_hash_as_starred/";
|
||||
public static final String URL_MARK_STORY_AS_UNSTARRED = NEWSBLUR_URL + "/reader/mark_story_hash_as_unstarred/";
|
||||
public static final String URL_MARK_STORY_AS_UNREAD = NEWSBLUR_URL + "/reader/mark_story_as_unread/";
|
||||
public static final String URL_MARK_STORY_HASH_UNREAD = NEWSBLUR_URL + "/reader/mark_story_hash_as_unread/";
|
||||
public static final String URL_STARRED_STORIES = NEWSBLUR_URL + "/reader/starred_stories";
|
||||
public static final String URL_FEED_AUTOCOMPLETE = NEWSBLUR_URL + "/rss_feeds/feed_autocomplete";
|
||||
public static final String URL_LIKE_COMMENT = NEWSBLUR_URL + "/social/like_comment";
|
||||
public static final String URL_UNLIKE_COMMENT = NEWSBLUR_URL + "/social/remove_like_comment";
|
||||
public static final String URL_REPLY_TO = NEWSBLUR_URL + "/social/save_comment_reply";
|
||||
public static final String URL_ADD_FEED = NEWSBLUR_URL + "/reader/add_url";
|
||||
public static final String URL_DELETE_FEED = NEWSBLUR_URL + "/reader/delete_feed";
|
||||
public static final String URL_CLASSIFIER_SAVE = NEWSBLUR_URL + "/classifier/save";
|
||||
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 URL_SAVE_FEED_CHOOSER = NEWSBLUR_URL + "/reader/save_feed_chooser";
|
||||
|
||||
public static final String PARAMETER_FEEDS = "f";
|
||||
public static final String PARAMETER_H = "h";
|
||||
public static final String PARAMETER_PASSWORD = "password";
|
||||
|
@ -96,8 +116,5 @@ public class APIConstants {
|
|||
public static final String VALUE_TRUE = "true";
|
||||
public static final String VALUE_STARRED = "starred";
|
||||
|
||||
public static final String URL_CONNECT_FACEBOOK = NEWSBLUR_URL + "/oauth/facebook_connect/";
|
||||
public static final String URL_CONNECT_TWITTER = NEWSBLUR_URL + "/oauth/twitter_connect/";
|
||||
|
||||
public static final String S3_URL_FEED_ICONS = "https://s3.amazonaws.com/icons.newsblur.com/";
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import com.newsblur.domain.Feed;
|
|||
import com.newsblur.domain.FeedResult;
|
||||
import com.newsblur.domain.Story;
|
||||
import com.newsblur.domain.ValueMultimap;
|
||||
import static com.newsblur.network.APIConstants.buildUrl;
|
||||
import com.newsblur.network.domain.ActivitiesResponse;
|
||||
import com.newsblur.network.domain.FeedFolderResponse;
|
||||
import com.newsblur.network.domain.InteractionsResponse;
|
||||
|
@ -66,6 +67,8 @@ public class APIManager {
|
|||
public APIManager(final Context context) {
|
||||
this.context = context;
|
||||
|
||||
APIConstants.setCustomServer(PrefsUtils.getCustomServer(context));
|
||||
|
||||
this.gson = new GsonBuilder()
|
||||
.registerTypeAdapter(Date.class, new DateStringTypeAdapter())
|
||||
.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter())
|
||||
|
@ -96,7 +99,7 @@ public class APIManager {
|
|||
final ContentValues values = new ContentValues();
|
||||
values.put(APIConstants.PARAMETER_USERNAME, username);
|
||||
values.put(APIConstants.PARAMETER_PASSWORD, password);
|
||||
final APIResponse response = post(APIConstants.URL_LOGIN, values);
|
||||
final APIResponse response = post(buildUrl(APIConstants.PATH_LOGIN), values);
|
||||
LoginResponse loginResponse = response.getLoginResponse(gson);
|
||||
if (!response.isError()) {
|
||||
PrefsUtils.saveLogin(context, username, response.getCookie());
|
||||
|
@ -107,7 +110,7 @@ public class APIManager {
|
|||
public boolean loginAs(String username) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(APIConstants.PARAMETER_USER, username);
|
||||
String urlString = APIConstants.URL_LOGINAS + "?" + builderGetParametersString(values);
|
||||
String urlString = buildUrl(APIConstants.PATH_LOGINAS) + "?" + builderGetParametersString(values);
|
||||
Log.i(this.getClass().getName(), "doing superuser swap: " + urlString);
|
||||
// This API returns a redirect that means the call worked, but we do not want to follow it. To
|
||||
// just get the cookie from the 302 and stop, we directly use a one-off OkHttpClient.
|
||||
|
@ -130,7 +133,7 @@ public class APIManager {
|
|||
public boolean setAutoFollow(boolean autofollow) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put("autofollow_friends", autofollow ? "true" : "false");
|
||||
final APIResponse response = post(APIConstants.URL_AUTOFOLLOW_PREF, values);
|
||||
final APIResponse response = post(buildUrl(APIConstants.PATH_AUTOFOLLOW_PREF), values);
|
||||
return (!response.isError());
|
||||
}
|
||||
|
||||
|
@ -175,42 +178,42 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_DIRECTION, APIConstants.VALUE_NEWER);
|
||||
}
|
||||
|
||||
APIResponse response = post(APIConstants.URL_MARK_FEED_AS_READ, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_MARK_FEED_AS_READ), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
private NewsBlurResponse markAllAsRead() {
|
||||
ValueMultimap values = new ValueMultimap();
|
||||
values.put(APIConstants.PARAMETER_DAYS, "0");
|
||||
APIResponse response = post(APIConstants.URL_MARK_ALL_AS_READ, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_MARK_ALL_AS_READ), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
public NewsBlurResponse markStoryAsRead(String storyHash) {
|
||||
ValueMultimap values = new ValueMultimap();
|
||||
values.put(APIConstants.PARAMETER_STORY_HASH, storyHash);
|
||||
APIResponse response = post(APIConstants.URL_MARK_STORIES_READ, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_MARK_STORIES_READ), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
public NewsBlurResponse markStoryAsStarred(String storyHash) {
|
||||
ValueMultimap values = new ValueMultimap();
|
||||
values.put(APIConstants.PARAMETER_STORY_HASH, storyHash);
|
||||
APIResponse response = post(APIConstants.URL_MARK_STORY_AS_STARRED, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_MARK_STORY_AS_STARRED), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
public NewsBlurResponse markStoryAsUnstarred(String storyHash) {
|
||||
ValueMultimap values = new ValueMultimap();
|
||||
values.put(APIConstants.PARAMETER_STORY_HASH, storyHash);
|
||||
APIResponse response = post(APIConstants.URL_MARK_STORY_AS_UNSTARRED, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_MARK_STORY_AS_UNSTARRED), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
public NewsBlurResponse markStoryHashUnread(String hash) {
|
||||
final ValueMultimap values = new ValueMultimap();
|
||||
values.put(APIConstants.PARAMETER_STORY_HASH, hash);
|
||||
APIResponse response = post(APIConstants.URL_MARK_STORY_HASH_UNREAD, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_MARK_STORY_HASH_UNREAD), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
|
@ -219,7 +222,7 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_USERNAME, username);
|
||||
values.put(APIConstants.PARAMETER_PASSWORD, password);
|
||||
values.put(APIConstants.PARAMETER_EMAIL, email);
|
||||
final APIResponse response = post(APIConstants.URL_SIGNUP, values);
|
||||
final APIResponse response = post(buildUrl(APIConstants.PATH_SIGNUP), values);
|
||||
RegisterResponse registerResponse = response.getRegisterResponse(gson);
|
||||
if (!response.isError()) {
|
||||
PrefsUtils.saveLogin(context, username, response.getCookie());
|
||||
|
@ -228,7 +231,7 @@ public class APIManager {
|
|||
}
|
||||
|
||||
public ProfileResponse updateUserProfile() {
|
||||
final APIResponse response = get(APIConstants.URL_MY_PROFILE);
|
||||
final APIResponse response = get(buildUrl(APIConstants.PATH_MY_PROFILE));
|
||||
if (!response.isError()) {
|
||||
ProfileResponse profileResponse = (ProfileResponse) response.getResponse(gson, ProfileResponse.class);
|
||||
PrefsUtils.saveUserDetails(context, profileResponse.user);
|
||||
|
@ -249,7 +252,7 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_IN_FOLDERS, folder);
|
||||
}
|
||||
values.put(APIConstants.PARAMETER_FEEDID, feedId);
|
||||
APIResponse response = post(APIConstants.URL_MOVE_FEED_TO_FOLDERS, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_MOVE_FEED_TO_FOLDERS), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
|
@ -258,14 +261,14 @@ public class APIManager {
|
|||
for (String id : apiIds) {
|
||||
values.put(APIConstants.PARAMETER_FEEDID, id);
|
||||
}
|
||||
APIResponse response = get(APIConstants.URL_FEED_UNREAD_COUNT, values);
|
||||
APIResponse response = get(buildUrl(APIConstants.PATH_FEED_UNREAD_COUNT), values);
|
||||
return (UnreadCountResponse) response.getResponse(gson, UnreadCountResponse.class);
|
||||
}
|
||||
|
||||
public UnreadStoryHashesResponse getUnreadStoryHashes() {
|
||||
ValueMultimap values = new ValueMultimap();
|
||||
values.put(APIConstants.PARAMETER_INCLUDE_TIMESTAMPS, "1");
|
||||
APIResponse response = get(APIConstants.URL_UNREAD_HASHES, values);
|
||||
APIResponse response = get(buildUrl(APIConstants.PATH_UNREAD_HASHES), values);
|
||||
return (UnreadStoryHashesResponse) response.getResponse(gson, UnreadStoryHashesResponse.class);
|
||||
}
|
||||
|
||||
|
@ -275,7 +278,7 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_H, hash);
|
||||
}
|
||||
values.put(APIConstants.PARAMETER_INCLUDE_HIDDEN, APIConstants.VALUE_TRUE);
|
||||
APIResponse response = get(APIConstants.URL_RIVER_STORIES, values);
|
||||
APIResponse response = get(buildUrl(APIConstants.PATH_RIVER_STORIES), values);
|
||||
return (StoriesResponse) response.getResponse(gson, StoriesResponse.class);
|
||||
}
|
||||
|
||||
|
@ -289,40 +292,40 @@ public class APIManager {
|
|||
|
||||
// create the URI and populate request params depending on what kind of stories we want
|
||||
if (fs.getSingleFeed() != null) {
|
||||
uri = Uri.parse(APIConstants.URL_FEED_STORIES).buildUpon().appendPath(fs.getSingleFeed()).build();
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_FEED_STORIES)).buildUpon().appendPath(fs.getSingleFeed()).build();
|
||||
values.put(APIConstants.PARAMETER_FEEDS, fs.getSingleFeed());
|
||||
values.put(APIConstants.PARAMETER_INCLUDE_HIDDEN, APIConstants.VALUE_TRUE);
|
||||
if (fs.isFilterSaved()) values.put(APIConstants.PARAMETER_READ_FILTER, APIConstants.VALUE_STARRED);
|
||||
} else if (fs.getMultipleFeeds() != null) {
|
||||
uri = Uri.parse(APIConstants.URL_RIVER_STORIES);
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_RIVER_STORIES));
|
||||
for (String feedId : fs.getMultipleFeeds()) values.put(APIConstants.PARAMETER_FEEDS, feedId);
|
||||
values.put(APIConstants.PARAMETER_INCLUDE_HIDDEN, APIConstants.VALUE_TRUE);
|
||||
if (fs.isFilterSaved()) values.put(APIConstants.PARAMETER_READ_FILTER, APIConstants.VALUE_STARRED);
|
||||
} else if (fs.getSingleSocialFeed() != null) {
|
||||
String feedId = fs.getSingleSocialFeed().getKey();
|
||||
String username = fs.getSingleSocialFeed().getValue();
|
||||
uri = Uri.parse(APIConstants.URL_SOCIALFEED_STORIES).buildUpon().appendPath(feedId).appendPath(username).build();
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_SOCIALFEED_STORIES)).buildUpon().appendPath(feedId).appendPath(username).build();
|
||||
values.put(APIConstants.PARAMETER_USER_ID, feedId);
|
||||
values.put(APIConstants.PARAMETER_USERNAME, username);
|
||||
} else if (fs.getMultipleSocialFeeds() != null) {
|
||||
uri = Uri.parse(APIConstants.URL_SHARED_RIVER_STORIES);
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_SHARED_RIVER_STORIES));
|
||||
for (Map.Entry<String,String> entry : fs.getMultipleSocialFeeds().entrySet()) {
|
||||
values.put(APIConstants.PARAMETER_FEEDS, entry.getKey());
|
||||
}
|
||||
} else if (fs.isAllNormal()) {
|
||||
uri = Uri.parse(APIConstants.URL_RIVER_STORIES);
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_RIVER_STORIES));
|
||||
values.put(APIConstants.PARAMETER_INCLUDE_HIDDEN, APIConstants.VALUE_TRUE);
|
||||
} else if (fs.isAllSocial()) {
|
||||
uri = Uri.parse(APIConstants.URL_SHARED_RIVER_STORIES);
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_SHARED_RIVER_STORIES));
|
||||
} else if (fs.isAllRead()) {
|
||||
uri = Uri.parse(APIConstants.URL_READ_STORIES);
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_READ_STORIES));
|
||||
} else if (fs.isAllSaved()) {
|
||||
uri = Uri.parse(APIConstants.URL_STARRED_STORIES);
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_STARRED_STORIES));
|
||||
} else if (fs.getSingleSavedTag() != null) {
|
||||
uri = Uri.parse(APIConstants.URL_STARRED_STORIES);
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_STARRED_STORIES));
|
||||
values.put(APIConstants.PARAMETER_TAG, fs.getSingleSavedTag());
|
||||
} else if (fs.isGlobalShared()) {
|
||||
uri = Uri.parse(APIConstants.URL_SHARED_RIVER_STORIES);
|
||||
uri = Uri.parse(buildUrl(APIConstants.PATH_SHARED_RIVER_STORIES));
|
||||
values.put(APIConstants.PARAMETER_GLOBAL_FEED, Boolean.TRUE.toString());
|
||||
} else {
|
||||
throw new IllegalStateException("Asked to get stories for FeedSet of unknown type.");
|
||||
|
@ -347,7 +350,7 @@ public class APIManager {
|
|||
public boolean followUser(final String userId) {
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(APIConstants.PARAMETER_USERID, userId);
|
||||
final APIResponse response = post(APIConstants.URL_FOLLOW, values);
|
||||
final APIResponse response = post(buildUrl(APIConstants.PATH_FOLLOW), values);
|
||||
if (!response.isError()) {
|
||||
return true;
|
||||
} else {
|
||||
|
@ -358,7 +361,7 @@ public class APIManager {
|
|||
public boolean unfollowUser(final String userId) {
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(APIConstants.PARAMETER_USERID, userId);
|
||||
final APIResponse response = post(APIConstants.URL_UNFOLLOW, values);
|
||||
final APIResponse response = post(buildUrl(APIConstants.PATH_UNFOLLOW), values);
|
||||
if (!response.isError()) {
|
||||
return true;
|
||||
} else {
|
||||
|
@ -377,7 +380,7 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_FEEDID, feedId);
|
||||
values.put(APIConstants.PARAMETER_STORYID, storyId);
|
||||
|
||||
APIResponse response = post(APIConstants.URL_SHARE_STORY, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_SHARE_STORY), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
|
@ -392,7 +395,7 @@ public class APIManager {
|
|||
public FeedFolderResponse getFolderFeedMapping(boolean doUpdateCounts) {
|
||||
ContentValues params = new ContentValues();
|
||||
params.put(APIConstants.PARAMETER_UPDATE_COUNTS, (doUpdateCounts ? "true" : "false"));
|
||||
APIResponse response = get(APIConstants.URL_FEEDS, params);
|
||||
APIResponse response = get(buildUrl(APIConstants.PATH_FEEDS), params);
|
||||
|
||||
if (response.isError()) {
|
||||
// we can't use the magic polymorphism of NewsBlurResponse because this result uses
|
||||
|
@ -454,14 +457,14 @@ public class APIManager {
|
|||
}
|
||||
values.put(APIConstants.PARAMETER_FEEDID, feedId);
|
||||
|
||||
final APIResponse response = post(APIConstants.URL_CLASSIFIER_SAVE, values);
|
||||
final APIResponse response = post(buildUrl(APIConstants.PATH_CLASSIFIER_SAVE), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
public ProfileResponse getUser(String userId) {
|
||||
final ContentValues values = new ContentValues();
|
||||
values.put(APIConstants.PARAMETER_USER_ID, userId);
|
||||
final APIResponse response = get(APIConstants.URL_USER_PROFILE, values);
|
||||
final APIResponse response = get(buildUrl(APIConstants.PATH_USER_PROFILE), values);
|
||||
if (!response.isError()) {
|
||||
ProfileResponse profileResponse = (ProfileResponse) response.getResponse(gson, ProfileResponse.class);
|
||||
return profileResponse;
|
||||
|
@ -475,7 +478,7 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_USER_ID, userId);
|
||||
values.put(APIConstants.PARAMETER_LIMIT, "10");
|
||||
values.put(APIConstants.PARAMETER_PAGE_NUMBER, Integer.toString(pageNumber));
|
||||
final APIResponse response = get(APIConstants.URL_USER_ACTIVITIES, values);
|
||||
final APIResponse response = get(buildUrl(APIConstants.PATH_USER_ACTIVITIES), values);
|
||||
if (!response.isError()) {
|
||||
ActivitiesResponse activitiesResponse = (ActivitiesResponse) response.getResponse(gson, ActivitiesResponse.class);
|
||||
return activitiesResponse;
|
||||
|
@ -489,7 +492,7 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_USER_ID, userId);
|
||||
values.put(APIConstants.PARAMETER_LIMIT, "10");
|
||||
values.put(APIConstants.PARAMETER_PAGE_NUMBER, Integer.toString(pageNumber));
|
||||
final APIResponse response = get(APIConstants.URL_USER_INTERACTIONS, values);
|
||||
final APIResponse response = get(buildUrl(APIConstants.PATH_USER_INTERACTIONS), values);
|
||||
if (!response.isError()) {
|
||||
InteractionsResponse interactionsResponse = (InteractionsResponse) response.getResponse(gson, InteractionsResponse.class);
|
||||
return interactionsResponse;
|
||||
|
@ -502,7 +505,7 @@ public class APIManager {
|
|||
final ContentValues values = new ContentValues();
|
||||
values.put(APIConstants.PARAMETER_FEEDID, feedId);
|
||||
values.put(APIConstants.PARAMETER_STORYID, storyId);
|
||||
final APIResponse response = get(APIConstants.URL_STORY_TEXT, values);
|
||||
final APIResponse response = get(buildUrl(APIConstants.PATH_STORY_TEXT), values);
|
||||
if (!response.isError()) {
|
||||
StoryTextResponse storyTextResponse = (StoryTextResponse) response.getResponse(gson, StoryTextResponse.class);
|
||||
return storyTextResponse;
|
||||
|
@ -516,7 +519,7 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_STORYID, storyId);
|
||||
values.put(APIConstants.PARAMETER_STORY_FEEDID, feedId);
|
||||
values.put(APIConstants.PARAMETER_COMMENT_USERID, commentUserId);
|
||||
APIResponse response = post(APIConstants.URL_LIKE_COMMENT, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_LIKE_COMMENT), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
|
@ -525,7 +528,7 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_STORYID, storyId);
|
||||
values.put(APIConstants.PARAMETER_STORY_FEEDID, feedId);
|
||||
values.put(APIConstants.PARAMETER_COMMENT_USERID, commentUserId);
|
||||
APIResponse response = post(APIConstants.URL_UNLIKE_COMMENT, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_UNLIKE_COMMENT), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
|
@ -535,7 +538,7 @@ public class APIManager {
|
|||
values.put(APIConstants.PARAMETER_STORY_FEEDID, storyFeedId);
|
||||
values.put(APIConstants.PARAMETER_COMMENT_USERID, commentUserId);
|
||||
values.put(APIConstants.PARAMETER_REPLY_TEXT, reply);
|
||||
APIResponse response = post(APIConstants.URL_REPLY_TO, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_REPLY_TO), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
|
@ -545,14 +548,14 @@ public class APIManager {
|
|||
if (!TextUtils.isEmpty(folderName)) {
|
||||
values.put(APIConstants.PARAMETER_FOLDER, folderName);
|
||||
}
|
||||
final APIResponse response = post(APIConstants.URL_ADD_FEED, values);
|
||||
final APIResponse response = post(buildUrl(APIConstants.PATH_ADD_FEED), values);
|
||||
return (!response.isError());
|
||||
}
|
||||
|
||||
public FeedResult[] searchForFeed(String searchTerm) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(APIConstants.PARAMETER_FEED_SEARCH_TERM, searchTerm);
|
||||
final APIResponse response = get(APIConstants.URL_FEED_AUTOCOMPLETE, values);
|
||||
final APIResponse response = get(buildUrl(APIConstants.PATH_FEED_AUTOCOMPLETE), values);
|
||||
|
||||
if (!response.isError()) {
|
||||
return gson.fromJson(response.getResponseBody(), FeedResult[].class);
|
||||
|
@ -567,7 +570,7 @@ public class APIManager {
|
|||
if ((!TextUtils.isEmpty(folderName)) && (!folderName.equals(AppConstants.ROOT_FOLDER))) {
|
||||
values.put(APIConstants.PARAMETER_IN_FOLDER, folderName);
|
||||
}
|
||||
APIResponse response = post(APIConstants.URL_DELETE_FEED, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_DELETE_FEED), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
|
@ -576,7 +579,7 @@ public class APIManager {
|
|||
for (String feed : feeds) {
|
||||
values.put(APIConstants.PARAMETER_APPROVED_FEEDS, feed);
|
||||
}
|
||||
APIResponse response = post(APIConstants.URL_SAVE_FEED_CHOOSER, values);
|
||||
APIResponse response = post(buildUrl(APIConstants.PATH_SAVE_FEED_CHOOSER), values);
|
||||
return response.getResponse(gson, NewsBlurResponse.class);
|
||||
}
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ public class PrefConstants {
|
|||
public static final String PREFERENCES = "preferences";
|
||||
public static final String PREF_COOKIE = "login_cookie";
|
||||
public static final String PREF_UNIQUE_LOGIN = "login_unique";
|
||||
public static final String PREF_CUSTOM_SERVER = "custom_server";
|
||||
|
||||
public final static String USER_USERNAME = "username";
|
||||
public final static String USER_WEBSITE = "website";
|
||||
|
|
|
@ -26,19 +26,29 @@ import android.util.Log;
|
|||
import com.newsblur.R;
|
||||
import com.newsblur.activity.Login;
|
||||
import com.newsblur.domain.UserDetails;
|
||||
import com.newsblur.network.APIConstants;
|
||||
import com.newsblur.service.NBSyncService;
|
||||
|
||||
public class PrefsUtils {
|
||||
|
||||
private PrefsUtils() {} // util class - no instances
|
||||
|
||||
public static void saveLogin(final Context context, final String userName, final String cookie) {
|
||||
NBSyncService.resumeFromInterrupt();
|
||||
final SharedPreferences preferences = context.getSharedPreferences(PrefConstants.PREFERENCES, 0);
|
||||
final Editor edit = preferences.edit();
|
||||
public static void saveCustomServer(Context context, String customServer) {
|
||||
if (customServer == null) return;
|
||||
if (customServer.length() <= 0) return;
|
||||
SharedPreferences preferences = context.getSharedPreferences(PrefConstants.PREFERENCES, 0);
|
||||
Editor edit = preferences.edit();
|
||||
edit.putString(PrefConstants.PREF_CUSTOM_SERVER, customServer);
|
||||
edit.commit();
|
||||
}
|
||||
|
||||
public static void saveLogin(Context context, String userName, String cookie) {
|
||||
SharedPreferences preferences = context.getSharedPreferences(PrefConstants.PREFERENCES, 0);
|
||||
Editor edit = preferences.edit();
|
||||
edit.putString(PrefConstants.PREF_COOKIE, cookie);
|
||||
edit.putString(PrefConstants.PREF_UNIQUE_LOGIN, userName + "_" + System.currentTimeMillis());
|
||||
edit.commit();
|
||||
NBSyncService.resumeFromInterrupt();
|
||||
}
|
||||
|
||||
public static boolean checkForUpgrade(Context context) {
|
||||
|
@ -84,6 +94,7 @@ public class PrefsUtils {
|
|||
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);
|
||||
s.append("%0Aserver: ").append(APIConstants.isCustomServer() ? "default" : "custom");
|
||||
s.append("%0Amemory: ").append(NBSyncService.isMemoryLow() ? "low" : "normal");
|
||||
s.append("%0Aspeed: ").append(NBSyncService.getSpeedInfo());
|
||||
s.append("%0Apending actions: ").append(NBSyncService.getPendingInfo());
|
||||
|
@ -110,6 +121,9 @@ public class PrefsUtils {
|
|||
|
||||
// wipe the local DB
|
||||
FeedUtils.dropAndRecreateTables();
|
||||
|
||||
// reset custom server
|
||||
APIConstants.unsetCustomServer();
|
||||
|
||||
// prompt for a new login
|
||||
Intent i = new Intent(context, Login.class);
|
||||
|
@ -127,6 +141,7 @@ public class PrefsUtils {
|
|||
Set<String> keys = new HashSet<String>(prefs.getAll().keySet());
|
||||
keys.remove(PrefConstants.PREF_COOKIE);
|
||||
keys.remove(PrefConstants.PREF_UNIQUE_LOGIN);
|
||||
keys.remove(PrefConstants.PREF_CUSTOM_SERVER);
|
||||
SharedPreferences.Editor editor = prefs.edit();
|
||||
for (String key : keys) {
|
||||
editor.remove(key);
|
||||
|
@ -147,6 +162,11 @@ public class PrefsUtils {
|
|||
return preferences.getString(PrefConstants.PREF_UNIQUE_LOGIN, null);
|
||||
}
|
||||
|
||||
public static String getCustomServer(Context context) {
|
||||
SharedPreferences preferences = context.getSharedPreferences(PrefConstants.PREFERENCES, 0);
|
||||
return preferences.getString(PrefConstants.PREF_CUSTOM_SERVER, null);
|
||||
}
|
||||
|
||||
public static void saveUserDetails(final Context context, final UserDetails profile) {
|
||||
final SharedPreferences preferences = context.getSharedPreferences(PrefConstants.PREFERENCES, 0);
|
||||
final Editor edit = preferences.edit();
|
||||
|
|
Loading…
Add table
Reference in a new issue