fedilab-Android-App/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java

1852 lines
70 KiB
Java
Raw Normal View History

2017-05-05 16:36:04 +02:00
package fr.gouv.etalab.mastodon.client;
/* Copyright 2017 Thomas Schneider
*
2017-07-10 10:33:24 +02:00
* This file is a part of Mastalab
2017-05-05 16:36:04 +02:00
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
2017-07-10 10:33:24 +02:00
* Mastalab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
2017-05-05 16:36:04 +02:00
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
2017-08-04 11:11:27 +02:00
* You should have received a copy of the GNU General Public License along with Mastalab; if not,
2017-05-05 16:36:04 +02:00
* see <http://www.gnu.org/licenses>. */
import android.content.Context;
import android.content.SharedPreferences;
2017-08-25 10:25:13 +02:00
import android.util.Log;
import android.widget.Toast;
2017-05-05 16:36:04 +02:00
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.loopj.android.http.SyncHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.InputStream;
import java.lang.*;
2017-05-20 19:40:46 +02:00
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
2017-05-05 16:36:04 +02:00
import java.util.ArrayList;
import java.util.List;
2017-06-03 18:18:27 +02:00
import java.util.regex.Matcher;
import java.util.regex.Pattern;
2017-05-05 16:36:04 +02:00
import cz.msebera.android.httpclient.Header;
import fr.gouv.etalab.mastodon.client.Entities.*;
import fr.gouv.etalab.mastodon.client.Entities.Error;
2017-05-05 16:36:04 +02:00
import fr.gouv.etalab.mastodon.helper.Helper;
import mastodon.etalab.gouv.fr.mastodon.R;
2017-05-05 16:36:04 +02:00
2017-05-20 19:40:46 +02:00
import static fr.gouv.etalab.mastodon.helper.Helper.USER_AGENT;
2017-05-05 16:36:04 +02:00
/**
* Created by Thomas on 23/04/2017.
* Manage Calls to the REST API
*/
public class API {
2017-05-05 16:36:04 +02:00
private SyncHttpClient client = new SyncHttpClient();
private Account account;
private Context context;
private Relationship relationship;
private Results results;
private fr.gouv.etalab.mastodon.client.Entities.Context statusContext;
private Attachment attachment;
private List<Account> accounts;
private List<Status> statuses;
2017-09-17 11:50:00 +02:00
private List<Relationship> relationships;
2017-05-05 16:36:04 +02:00
private List<Notification> notifications;
private int tootPerPage, accountPerPage, notificationPerPage;
private int actionCode;
private String instance;
private Instance instanceEntity;
private String prefKeyOauthTokenT;
2017-06-03 18:18:27 +02:00
private APIResponse apiResponse;
private Error APIError;
2017-05-05 16:36:04 +02:00
public enum StatusAction{
FAVOURITE,
UNFAVOURITE,
REBLOG,
UNREBLOG,
MUTE,
UNMUTE,
BLOCK,
UNBLOCK,
FOLLOW,
UNFOLLOW,
CREATESTATUS,
UNSTATUS,
AUTHORIZE,
REJECT,
2017-08-22 17:34:26 +02:00
REPORT,
REMOTE_FOLLOW,
PIN,
UNPIN
2017-05-05 16:36:04 +02:00
}
public API(Context context) {
this.context = context;
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
tootPerPage = sharedpreferences.getInt(Helper.SET_TOOTS_PER_PAGE, 40);
accountPerPage = sharedpreferences.getInt(Helper.SET_ACCOUNTS_PER_PAGE, 40);
notificationPerPage = sharedpreferences.getInt(Helper.SET_NOTIFICATIONS_PER_PAGE, 15);
this.instance = Helper.getLiveInstance(context);
this.prefKeyOauthTokenT = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
2017-06-03 18:18:27 +02:00
apiResponse = new APIResponse();
APIError = null;
}
public API(Context context, String instance, String token) {
this.context = context;
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
tootPerPage = sharedpreferences.getInt(Helper.SET_TOOTS_PER_PAGE, 40);
accountPerPage = sharedpreferences.getInt(Helper.SET_ACCOUNTS_PER_PAGE, 40);
notificationPerPage = sharedpreferences.getInt(Helper.SET_NOTIFICATIONS_PER_PAGE, 15);
if( instance != null)
this.instance = instance;
else
this.instance = Helper.getLiveInstance(context);
if( token != null)
this.prefKeyOauthTokenT = token;
else
this.prefKeyOauthTokenT = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
2017-06-03 18:18:27 +02:00
apiResponse = new APIResponse();
APIError = null;
2017-05-05 16:36:04 +02:00
}
/***
* Get info on the current Instance *synchronously*
* @return APIResponse
*/
public APIResponse getInstance() {
get("/instance", null, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
instanceEntity = parseInstance(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
});
apiResponse.setInstance(instanceEntity);
return apiResponse;
}
/***
* Update credential of the authenticated user *synchronously*
* @return APIResponse
*/
public APIResponse updateCredential(String display_name, String note, String avatar, String header) {
RequestParams requestParams = new RequestParams();
if( display_name != null)
requestParams.add("display_name",display_name);
if( note != null)
requestParams.add("note",note);
if( avatar != null)
requestParams.add("avatar",avatar);
if( header != null)
requestParams.add("header",header);
patch("/accounts/update_credentials", requestParams, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
});
return apiResponse;
}
2017-05-05 16:36:04 +02:00
/***
* Verifiy credential of the authenticated user *synchronously*
* @return Account
*/
public Account verifyCredentials() {
account = new Account();
get("/accounts/verify_credentials", null, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-08-28 13:53:07 +02:00
account = parseAccountResponse(context, response);
2017-05-05 16:36:04 +02:00
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
try {
2017-08-28 13:53:07 +02:00
account = parseAccountResponse(context, response.getJSONObject(0));
2017-05-05 16:36:04 +02:00
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
return account;
}
/**
* Returns an account
* @param accountId String account fetched
* @return Account entity
*/
public Account getAccount(String accountId) {
account = new Account();
get(String.format("/accounts/%s",accountId), null, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-08-28 13:53:07 +02:00
account = parseAccountResponse(context, response);
2017-05-05 16:36:04 +02:00
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
try {
2017-08-28 13:53:07 +02:00
account = parseAccountResponse(context, response.getJSONObject(0));
2017-05-05 16:36:04 +02:00
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
return account;
}
/**
* Returns a relationship between the authenticated account and an account
* @param accountId String account fetched
* @return Relationship entity
*/
public Relationship getRelationship(String accountId) {
relationship = new Relationship();
RequestParams params = new RequestParams();
params.put("id",accountId);
get("/accounts/relationships", params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
relationship = parseRelationshipResponse(response);
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
try {
relationship = parseRelationshipResponse(response.getJSONObject(0));
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
return relationship;
}
2017-09-30 08:36:07 +02:00
2017-09-17 11:50:00 +02:00
/**
* Returns a relationship between the authenticated account and an account
* @param accounts ArrayList<Account> accounts fetched
* @return Relationship entity
*/
public APIResponse getRelationship(List<Account> accounts) {
relationship = new Relationship();
RequestParams params = new RequestParams();
if( accounts != null && accounts.size() > 0 ) {
for(Account account: accounts) {
params.add("id[]", account.getId());
}
}
get("/accounts/relationships", params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
Relationship relationship = parseRelationshipResponse(response);
relationships.add(relationship);
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
relationships = parseRelationshipResponse(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-09-17 11:50:00 +02:00
});
2017-09-17 12:25:21 +02:00
apiResponse.setRelationships(relationships);
2017-09-17 11:50:00 +02:00
return apiResponse;
}
2017-05-05 16:36:04 +02:00
/**
* Retrieves status for the account *synchronously*
*
* @param accountId String Id of the account
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getStatus(String accountId) {
return getStatus(accountId, false, false, false, null, null, tootPerPage);
2017-05-05 16:36:04 +02:00
}
/**
* Retrieves status for the account *synchronously*
*
* @param accountId String Id of the account
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getStatus(String accountId, String max_id) {
return getStatus(accountId, false, false, false, max_id, null, tootPerPage);
2017-05-05 16:36:04 +02:00
}
/**
* Retrieves status with media for the account *synchronously*
*
* @param accountId String Id of the account
* @param max_id String id max
* @return APIResponse
*/
public APIResponse getStatusWithMedia(String accountId, String max_id) {
return getStatus(accountId, true, false, false, max_id, null, tootPerPage);
}
/**
* Retrieves pinned status(es) *synchronously*
*
* @param accountId String Id of the account
* @param max_id String id max
* @return APIResponse
*/
public APIResponse getPinnedStatuses(String accountId, String max_id) {
return getStatus(accountId, false, true, false, max_id, null, tootPerPage);
}
2017-05-05 16:36:04 +02:00
/**
* Retrieves status for the account *synchronously*
*
* @param accountId String Id of the account
* @param onlyMedia boolean only with media
* @param exclude_replies boolean excludes replies
* @param max_id String id max
* @param since_id String since the id
* @param limit int limit - max value 40
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
private APIResponse getStatus(String accountId, boolean onlyMedia, boolean pinned,
2017-05-05 16:36:04 +02:00
boolean exclude_replies, String max_id, String since_id, int limit) {
RequestParams params = new RequestParams();
if( exclude_replies)
params.put("exclude_replies", Boolean.toString(true));
if (max_id != null)
params.put("max_id", max_id);
if (since_id != null)
params.put("since_id", since_id);
if (0 < limit || limit > 40)
limit = 40;
if( onlyMedia)
params.put("only_media", Boolean.toString(true));
if( pinned)
params.put("pinned", Boolean.toString(true));
2017-05-05 16:36:04 +02:00
params.put("limit", String.valueOf(limit));
statuses = new ArrayList<>();
get(String.format("/accounts/%s/statuses", accountId), params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-08-28 13:53:07 +02:00
Status status = parseStatuses(context, response);
2017-05-05 16:36:04 +02:00
statuses.add(status);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
statuses = parseStatuses(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
2017-06-03 18:18:27 +02:00
apiResponse.setStatuses(statuses);
return apiResponse;
2017-05-05 16:36:04 +02:00
}
/**
* Retrieves one status *synchronously*
*
* @param statusId String Id of the status
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getStatusbyId(String statusId) {
2017-05-05 16:36:04 +02:00
statuses = new ArrayList<>();
get(String.format("/statuses/%s", statusId), null, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-08-28 13:53:07 +02:00
Status status = parseStatuses(context, response);
2017-05-05 16:36:04 +02:00
statuses.add(status);
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
statuses = parseStatuses(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
2017-06-03 18:18:27 +02:00
apiResponse.setStatuses(statuses);
return apiResponse;
2017-05-05 16:36:04 +02:00
}
/**
* Retrieves the context of status with replies *synchronously*
*
* @param statusId Id of the status
* @return List<Status>
*/
public fr.gouv.etalab.mastodon.client.Entities.Context getStatusContext(String statusId) {
statusContext = new fr.gouv.etalab.mastodon.client.Entities.Context();
get(String.format("/statuses/%s/context", statusId), null, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
statusContext = parseContext(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
return statusContext;
}
2017-05-05 16:36:04 +02:00
/**
* Retrieves home timeline for the account *synchronously*
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getHomeTimeline( String max_id) {
return getHomeTimeline(max_id, null, tootPerPage);
2017-05-05 16:36:04 +02:00
}
2017-09-27 17:52:23 +02:00
/**
* Retrieves home timeline for the account *synchronously*
* @return APIResponse
*/
public APIResponse getHomeTimeline( String max_id, int tootPerPage) {
return getHomeTimeline(max_id, null, tootPerPage);
}
2017-05-05 16:36:04 +02:00
/**
2017-05-20 19:40:46 +02:00
* Retrieves home timeline for the account since an Id value *synchronously*
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getHomeTimelineSinceId(String since_id) {
return getHomeTimeline(null, since_id, tootPerPage);
2017-05-05 16:36:04 +02:00
}
2017-09-27 17:52:23 +02:00
/**
* Retrieves home timeline for the account since an Id value *synchronously*
* @return APIResponse
*/
public APIResponse getHomeTimelineSinceId(String since_id, int tootPerPage) {
return getHomeTimeline(null, since_id, tootPerPage);
}
2017-05-05 16:36:04 +02:00
/**
* Retrieves home timeline for the account *synchronously*
* @param max_id String id max
* @param since_id String since the id
* @param limit int limit - max value 40
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
private APIResponse getHomeTimeline(String max_id, String since_id, int limit) {
2017-05-05 16:36:04 +02:00
RequestParams params = new RequestParams();
if (max_id != null)
params.put("max_id", max_id);
if (since_id != null)
params.put("since_id", since_id);
2017-09-27 17:52:23 +02:00
if (0 > limit || limit > 80)
limit = 80;
2017-09-30 15:53:17 +02:00
2017-05-05 16:36:04 +02:00
params.put("limit",String.valueOf(limit));
statuses = new ArrayList<>();
get("/timelines/home", params, new JsonHttpResponseHandler() {
2017-05-05 16:36:04 +02:00
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-08-28 13:53:07 +02:00
Status status = parseStatuses(context, response);
2017-05-05 16:36:04 +02:00
statuses.add(status);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
statuses = parseStatuses(response);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
2017-06-03 18:18:27 +02:00
apiResponse.setStatuses(statuses);
return apiResponse;
2017-05-05 16:36:04 +02:00
}
/**
* Retrieves public timeline for the account *synchronously*
* @param local boolean only local timeline
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getPublicTimeline(boolean local, String max_id){
2017-05-05 16:36:04 +02:00
return getPublicTimeline(local, max_id, null, tootPerPage);
}
/**
* Retrieves public timeline for the account *synchronously*
* @param local boolean only local timeline
* @param max_id String id max
* @param since_id String since the id
* @param limit int limit - max value 40
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
private APIResponse getPublicTimeline(boolean local, String max_id, String since_id, int limit){
2017-05-05 16:36:04 +02:00
RequestParams params = new RequestParams();
if( local)
params.put("local", Boolean.toString(true));
if( max_id != null )
params.put("max_id", max_id);
if( since_id != null )
params.put("since_id", since_id);
if( 0 > limit || limit > 40)
limit = 40;
params.put("limit",String.valueOf(limit));
statuses = new ArrayList<>();
get("/timelines/public", params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-08-28 13:53:07 +02:00
Status status = parseStatuses(context, response);
2017-05-05 16:36:04 +02:00
statuses.add(status);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
statuses = parseStatuses(response);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
2017-06-03 18:18:27 +02:00
apiResponse.setStatuses(statuses);
return apiResponse;
2017-05-05 16:36:04 +02:00
}
/**
* Retrieves public tag timeline *synchronously*
* @param tag String
* @param local boolean only local timeline
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getPublicTimelineTag(String tag, boolean local, String max_id){
2017-05-05 16:36:04 +02:00
return getPublicTimelineTag(tag, local, max_id, null, tootPerPage);
}
/**
* Retrieves public tag timeline *synchronously*
* @param tag String
* @param local boolean only local timeline
* @param max_id String id max
* @param since_id String since the id
* @param limit int limit - max value 40
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
private APIResponse getPublicTimelineTag(String tag, boolean local, String max_id, String since_id, int limit){
2017-05-05 16:36:04 +02:00
RequestParams params = new RequestParams();
if( local)
params.put("local", Boolean.toString(true));
if( max_id != null )
params.put("max_id", max_id);
if( since_id != null )
params.put("since_id", since_id);
if( 0 > limit || limit > 40)
limit = 40;
params.put("limit",String.valueOf(limit));
statuses = new ArrayList<>();
2017-05-27 08:32:14 +02:00
get(String.format("/timelines/tag/%s",tag.trim()), params, new JsonHttpResponseHandler() {
2017-05-05 16:36:04 +02:00
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-08-28 13:53:07 +02:00
Status status = parseStatuses(context, response);
2017-05-05 16:36:04 +02:00
statuses.add(status);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
statuses = parseStatuses(response);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
2017-06-03 18:18:27 +02:00
apiResponse.setStatuses(statuses);
return apiResponse;
2017-05-05 16:36:04 +02:00
}
/**
* Retrieves muted users by the authenticated account *synchronously*
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getMuted(String max_id){
2017-05-05 16:36:04 +02:00
return getAccounts("/mutes", max_id, null, accountPerPage);
}
/**
* Retrieves blocked users by the authenticated account *synchronously*
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getBlocks(String max_id){
2017-05-05 16:36:04 +02:00
return getAccounts("/blocks", max_id, null, accountPerPage);
}
/**
* Retrieves following for the account specified by targetedId *synchronously*
* @param targetedId String targetedId
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getFollowing(String targetedId, String max_id){
2017-05-05 16:36:04 +02:00
return getAccounts(String.format("/accounts/%s/following",targetedId),max_id, null, accountPerPage);
}
/**
* Retrieves followers for the account specified by targetedId *synchronously*
* @param targetedId String targetedId
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getFollowers(String targetedId, String max_id){
2017-05-05 16:36:04 +02:00
return getAccounts(String.format("/accounts/%s/followers",targetedId),max_id, null, accountPerPage);
}
/**
* Retrieves blocked users by the authenticated account *synchronously*
* @param max_id String id max
* @param since_id String since the id
* @param limit int limit - max value 40
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
private APIResponse getAccounts(String action, String max_id, String since_id, int limit){
2017-05-05 16:36:04 +02:00
RequestParams params = new RequestParams();
if( max_id != null )
params.put("max_id", max_id);
if( since_id != null )
params.put("since_id", since_id);
if( 0 > limit || limit > 40)
limit = 40;
params.put("limit",String.valueOf(limit));
accounts = new ArrayList<>();
get(action, params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-08-28 13:53:07 +02:00
Account account = parseAccountResponse(context, response);
2017-05-05 16:36:04 +02:00
accounts.add(account);
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
accounts = parseAccountResponse(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
2017-06-03 18:18:27 +02:00
apiResponse.setAccounts(accounts);
return apiResponse;
2017-05-05 16:36:04 +02:00
}
/**
* Retrieves follow requests for the authenticated account *synchronously*
* @param max_id String id max
* @return APIResponse
*/
public APIResponse getFollowRequest(String max_id){
return getFollowRequest(max_id, null, accountPerPage);
}
/**
* Retrieves follow requests for the authenticated account *synchronously*
* @param max_id String id max
* @param since_id String since the id
* @param limit int limit - max value 40
* @return APIResponse
*/
private APIResponse getFollowRequest(String max_id, String since_id, int limit){
RequestParams params = new RequestParams();
if( max_id != null )
params.put("max_id", max_id);
if( since_id != null )
params.put("since_id", since_id);
if( 0 > limit || limit > 40)
limit = 40;
params.put("limit",String.valueOf(limit));
accounts = new ArrayList<>();
get("/follow_requests", params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-08-28 13:53:07 +02:00
Account account = parseAccountResponse(context, response);
accounts.add(account);
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
accounts = parseAccountResponse(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
});
apiResponse.setAccounts(accounts);
return apiResponse;
}
2017-05-05 16:36:04 +02:00
/**
* Retrieves favourited status for the authenticated account *synchronously*
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getFavourites(String max_id){
2017-05-05 16:36:04 +02:00
return getFavourites(max_id, null, tootPerPage);
}
/**
* Retrieves favourited status for the authenticated account *synchronously*
* @param max_id String id max
* @param since_id String since the id
* @param limit int limit - max value 40
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
private APIResponse getFavourites(String max_id, String since_id, int limit){
2017-05-05 16:36:04 +02:00
RequestParams params = new RequestParams();
if( max_id != null )
params.put("max_id", max_id);
if( since_id != null )
params.put("since_id", since_id);
if( 0 > limit || limit > 40)
limit = 40;
params.put("limit",String.valueOf(limit));
statuses = new ArrayList<>();
get("/favourites", params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-08-28 13:53:07 +02:00
Status status = parseStatuses(context, response);
2017-05-05 16:36:04 +02:00
statuses.add(status);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
statuses = parseStatuses(response);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
2017-06-03 18:18:27 +02:00
apiResponse.setStatuses(statuses);
return apiResponse;
2017-05-05 16:36:04 +02:00
}
/**
* Makes the post action for a status
* @param statusAction Enum
* @param targetedId String id of the targeted Id *can be this of a status or an account*
* @return in status code - Should be equal to 200 when action is done
*/
public int postAction(StatusAction statusAction, String targetedId){
return postAction(statusAction, targetedId, null, null);
}
2017-05-05 16:36:04 +02:00
/**
* Makes the post action
* @param status Status object related to the status
* @param comment String comment for the report
* @return in status code - Should be equal to 200 when action is done
*/
public int reportAction(Status status, String comment){
return postAction(API.StatusAction.REPORT, null, status, comment);
}
public int statusAction(Status status){
return postAction(StatusAction.CREATESTATUS, null, status, null);
}
/**
* Makes the post action
* @param statusAction Enum
* @param targetedId String id of the targeted Id *can be this of a status or an account*
* @param status Status object related to the status
* @param comment String comment for the report
* @return in status code - Should be equal to 200 when action is done
*/
private int postAction(StatusAction statusAction, String targetedId, Status status, String comment ){
String action;
RequestParams params = null;
switch (statusAction){
case FAVOURITE:
action = String.format("/statuses/%s/favourite", targetedId);
break;
case UNFAVOURITE:
action = String.format("/statuses/%s/unfavourite", targetedId);
break;
case REBLOG:
action = String.format("/statuses/%s/reblog", targetedId);
break;
case UNREBLOG:
action = String.format("/statuses/%s/unreblog", targetedId);
break;
case FOLLOW:
action = String.format("/accounts/%s/follow", targetedId);
break;
2017-08-22 18:15:08 +02:00
case REMOTE_FOLLOW:
action = "/follows";
2017-08-22 18:15:08 +02:00
params = new RequestParams();
params.put("uri", targetedId);
break;
2017-05-05 16:36:04 +02:00
case UNFOLLOW:
action = String.format("/accounts/%s/unfollow", targetedId);
break;
case BLOCK:
action = String.format("/accounts/%s/block", targetedId);
break;
case UNBLOCK:
action = String.format("/accounts/%s/unblock", targetedId);
break;
case MUTE:
action = String.format("/accounts/%s/mute", targetedId);
break;
case UNMUTE:
action = String.format("/accounts/%s/unmute", targetedId);
break;
case PIN:
action = String.format("/statuses/%s/pin", targetedId);
break;
case UNPIN:
action = String.format("/statuses/%s/unpin", targetedId);
break;
2017-05-05 16:36:04 +02:00
case UNSTATUS:
action = String.format("/statuses/%s", targetedId);
break;
case AUTHORIZE:
action = String.format("/follow_requests/%s/authorize", targetedId);
break;
case REJECT:
action = String.format("/follow_requests/%s/reject", targetedId);
break;
2017-05-05 16:36:04 +02:00
case REPORT:
action = "/reports";
params = new RequestParams();
params.put("account_id", status.getAccount().getId());
params.put("comment", comment);
params.put("status_ids[]", status.getId());
break;
case CREATESTATUS:
params = new RequestParams();
action = "/statuses";
params.put("status", status.getContent());
if( status.getIn_reply_to_id() != null)
params.put("in_reply_to_id", status.getIn_reply_to_id());
if( status.getMedia_attachments() != null && status.getMedia_attachments().size() > 0 ) {
for(Attachment attachment: status.getMedia_attachments()) {
params.add("media_ids[]", attachment.getId());
}
}
if( status.isSensitive())
params.put("sensitive", Boolean.toString(status.isSensitive()));
if( status.getSpoiler_text() != null)
params.put("spoiler_text", status.getSpoiler_text());
params.put("visibility", status.getVisibility());
break;
default:
return -1;
}
if(statusAction != StatusAction.UNSTATUS ) {
post(action, 30000, params, new JsonHttpResponseHandler() {
2017-05-05 16:36:04 +02:00
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
actionCode = statusCode;
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
actionCode = statusCode;
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response) {
actionCode = statusCode;
setError(statusCode, error);
2017-07-17 18:53:12 +02:00
error.printStackTrace();
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
actionCode = statusCode;
setError(statusCode, error);
error.printStackTrace();
}
2017-05-05 16:36:04 +02:00
});
}else{
2017-05-20 19:40:46 +02:00
delete(action, null, new JsonHttpResponseHandler() {
2017-05-05 16:36:04 +02:00
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
actionCode = statusCode;
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
actionCode = statusCode;
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response) {
actionCode = statusCode;
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
actionCode = statusCode;
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
}
return actionCode;
}
/**
* Posts a status
* @param status Status object related to the status
* @return APIResponse
*/
public APIResponse postStatusAction(Status status){
String action;
RequestParams params;
params = new RequestParams();
action = "/statuses";
params.put("status", status.getContent());
if( status.getIn_reply_to_id() != null)
params.put("in_reply_to_id", status.getIn_reply_to_id());
if( status.getMedia_attachments() != null && status.getMedia_attachments().size() > 0 ) {
for(Attachment attachment: status.getMedia_attachments()) {
params.add("media_ids[]", attachment.getId());
}
}
if( status.isSensitive())
params.put("sensitive", Boolean.toString(status.isSensitive()));
if( status.getSpoiler_text() != null)
params.put("spoiler_text", status.getSpoiler_text());
params.put("visibility", status.getVisibility());
statuses = new ArrayList<>();
post(action, 30000, params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-08-28 13:53:07 +02:00
Status statusreturned = parseStatuses(context, response);
statuses.add(statusreturned);
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
statuses = parseStatuses(response);
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response) {
actionCode = statusCode;
setError(statusCode, error);
error.printStackTrace();
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
actionCode = statusCode;
setError(statusCode, error);
error.printStackTrace();
}
});
apiResponse.setStatuses(statuses);
return apiResponse;
}
2017-07-30 11:21:55 +02:00
/**
* Posts a status
* @param notificationId String, the current notification id, if null all notifications are deleted
* @return APIResponse
*/
public APIResponse postNoticationAction(String notificationId){
String action;
RequestParams requestParams = new RequestParams();
if( notificationId == null)
action = "/notifications/clear";
else {
requestParams.add("id",notificationId);
action = "/notifications/dismiss";
}
post(action, 30000, requestParams, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response) {
setError(statusCode, error);
error.printStackTrace();
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
error.printStackTrace();
}
2017-07-30 11:21:55 +02:00
});
return apiResponse;
}
2017-05-05 16:36:04 +02:00
/**
* Retrieves notifications for the authenticated account since an id*synchronously*
* @param since_id String since max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getNotificationsSince(String since_id){
2017-05-05 16:36:04 +02:00
return getNotifications(null, since_id, notificationPerPage);
}
2017-09-27 17:52:23 +02:00
/**
* Retrieves notifications for the authenticated account since an id*synchronously*
* @param since_id String since max
* @return APIResponse
*/
public APIResponse getNotificationsSince(String since_id, int notificationPerPage){
return getNotifications(null, since_id, notificationPerPage);
}
2017-05-05 16:36:04 +02:00
/**
* Retrieves notifications for the authenticated account *synchronously*
* @param max_id String id max
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
public APIResponse getNotifications(String max_id){
2017-05-05 16:36:04 +02:00
return getNotifications(max_id, null, notificationPerPage);
}
/**
* Retrieves notifications for the authenticated account *synchronously*
* @param max_id String id max
* @param since_id String since the id
* @param limit int limit - max value 40
* @return APIResponse
2017-05-05 16:36:04 +02:00
*/
2017-06-03 18:18:27 +02:00
private APIResponse getNotifications(String max_id, String since_id, int limit){
2017-05-05 16:36:04 +02:00
RequestParams params = new RequestParams();
if( max_id != null )
params.put("max_id", max_id);
if( since_id != null )
params.put("since_id", since_id);
if( 0 > limit || limit > 40)
limit = 40;
params.put("limit",String.valueOf(limit));
2017-09-30 08:36:07 +02:00
final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
boolean notif_follow = sharedpreferences.getBoolean(Helper.SET_NOTIF_FOLLOW, true);
boolean notif_add = sharedpreferences.getBoolean(Helper.SET_NOTIF_ADD, true);
boolean notif_mention = sharedpreferences.getBoolean(Helper.SET_NOTIF_MENTION, true);
boolean notif_share = sharedpreferences.getBoolean(Helper.SET_NOTIF_SHARE, true);
if( !notif_follow )
params.add("exclude_types[]", "follow");
if( !notif_add )
params.add("exclude_types[]", "favourite");
if( !notif_share )
params.add("exclude_types[]", "reblog");
if( !notif_mention )
params.add("exclude_types[]", "mention");
2017-05-05 16:36:04 +02:00
notifications = new ArrayList<>();
get("/notifications", params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
2017-08-28 13:53:07 +02:00
Notification notification = parseNotificationResponse(context, response);
2017-05-05 16:36:04 +02:00
notifications.add(notification);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
notifications = parseNotificationResponse(response);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-05 16:36:04 +02:00
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
2017-06-03 18:18:27 +02:00
apiResponse.setNotifications(notifications);
return apiResponse;
2017-05-05 16:36:04 +02:00
}
/**
* Upload media
* @param inputStream InputStream
* @return Attachment
*/
2017-05-05 16:36:04 +02:00
public Attachment uploadMedia(InputStream inputStream){
RequestParams params = new RequestParams();
params.put("file", inputStream);
post("/media", 240000, params, new JsonHttpResponseHandler() {
2017-05-05 16:36:04 +02:00
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
attachment = parseAttachmentResponse(response);
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
try {
attachment = parseAttachmentResponse(response.getJSONObject(0));
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
return attachment;
}
/**
2017-05-26 17:20:36 +02:00
* Retrieves Accounts and feeds when searching *synchronously*
2017-05-05 16:36:04 +02:00
*
* @param query String search
* @return List<Account>
*/
public Results search(String query) {
RequestParams params = new RequestParams();
2017-05-26 17:20:36 +02:00
params.add("q", query);
2017-05-05 16:36:04 +02:00
//params.put("resolve","false");
get("/search", params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
results = parseResultsResponse(response);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-05 16:36:04 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-05 16:36:04 +02:00
});
return results;
}
2017-05-26 17:20:36 +02:00
/**
* Retrieves Accounts when searching (ie: via @...) *synchronously*
*
* @param query String search
* @return APIResponse
2017-05-26 17:20:36 +02:00
*/
2017-08-02 12:17:43 +02:00
public APIResponse searchAccounts(String query, int count) {
2017-05-26 17:20:36 +02:00
RequestParams params = new RequestParams();
params.add("q", query);
//params.put("resolve","false");
2017-08-02 12:17:43 +02:00
if( count < 5)
count = 5;
if( count > 40 )
count = 40;
params.add("limit", String.valueOf(count));
2017-05-26 17:20:36 +02:00
get("/accounts/search", params, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
accounts = new ArrayList<>();
2017-08-28 13:53:07 +02:00
account = parseAccountResponse(context, response);
2017-05-26 17:20:36 +02:00
accounts.add(account);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-26 17:20:36 +02:00
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
accounts = parseAccountResponse(response);
2017-06-03 18:18:27 +02:00
apiResponse.setSince_id(findSinceId(headers));
apiResponse.setMax_id(findMaxId(headers));
2017-05-26 17:20:36 +02:00
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, JSONObject response){
setError(statusCode, error);
2017-05-26 17:20:36 +02:00
}
2017-10-01 19:01:32 +02:00
@Override
public void onFailure(int statusCode, Header[] headers, String message, Throwable error){
setError(statusCode, error);
}
2017-05-26 17:20:36 +02:00
});
2017-06-03 18:18:27 +02:00
apiResponse.setAccounts(accounts);
return apiResponse;
2017-05-26 17:20:36 +02:00
}
2017-05-05 16:36:04 +02:00
/**
* Parse json response an unique account
* @param resobj JSONObject
* @return Account
*/
private Results parseResultsResponse(JSONObject resobj){
Results results = new Results();
try {
results.setAccounts(parseAccountResponse(resobj.getJSONArray("accounts")));
results.setStatuses(parseStatuses(resobj.getJSONArray("statuses")));
results.setHashtags(parseTags(resobj.getJSONArray("hashtags")));
2017-05-05 16:36:04 +02:00
} catch (JSONException e) {
e.printStackTrace();
}
return results;
}
/**
* Parse Tags
* @param jsonArray JSONArray
* @return List<String> of tags
*/
private List<String> parseTags(JSONArray jsonArray){
List<String> list_tmp = new ArrayList<>();
for(int i = 0; i < jsonArray.length(); i++){
try {
list_tmp.add(jsonArray.getString(i));
} catch (JSONException ignored) {}
}
return list_tmp;
}
2017-05-05 16:36:04 +02:00
/**
* Parse json response for several status
* @param jsonArray JSONArray
* @return List<Status>
*/
private List<Status> parseStatuses(JSONArray jsonArray){
List<Status> statuses = new ArrayList<>();
try {
int i = 0;
while (i < jsonArray.length() ){
2017-05-05 16:36:04 +02:00
JSONObject resobj = jsonArray.getJSONObject(i);
2017-08-28 13:53:07 +02:00
Status status = parseStatuses(context, resobj);
2017-05-05 16:36:04 +02:00
i++;
statuses.add(status);
}
} catch (JSONException e) {
e.printStackTrace();
}
return statuses;
}
/**
* Parse json response for unique status
* @param resobj JSONObject
* @return Status
*/
@SuppressWarnings("InfiniteRecursion")
2017-08-28 15:01:45 +02:00
public static Status parseStatuses(Context context, JSONObject resobj){
2017-05-05 16:36:04 +02:00
Status status = new Status();
try {
status.setId(resobj.get("id").toString());
status.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString()));
status.setIn_reply_to_id(resobj.get("in_reply_to_id").toString());
status.setIn_reply_to_account_id(resobj.get("in_reply_to_account_id").toString());
2017-06-07 15:47:05 +02:00
status.setSensitive(Boolean.parseBoolean(resobj.get("sensitive").toString()));
2017-05-05 16:36:04 +02:00
status.setSpoiler_text(resobj.get("spoiler_text").toString());
status.setVisibility(resobj.get("visibility").toString());
status.setLanguage(resobj.get("language").toString());
status.setUrl(resobj.get("url").toString());
status.setReplies(null);
2017-05-05 16:36:04 +02:00
//TODO: replace by the value
status.setApplication(new Application());
2017-06-24 07:23:15 +02:00
//Retrieves attachments
2017-05-05 16:36:04 +02:00
JSONArray arrayAttachement = resobj.getJSONArray("media_attachments");
ArrayList<Attachment> attachments = new ArrayList<>();
2017-05-05 16:36:04 +02:00
if( arrayAttachement != null){
for(int j = 0 ; j < arrayAttachement.length() ; j++){
JSONObject attObj = arrayAttachement.getJSONObject(j);
Attachment attachment = new Attachment();
attachment.setId(attObj.get("id").toString());
attachment.setPreview_url(attObj.get("preview_url").toString());
attachment.setRemote_url(attObj.get("remote_url").toString());
attachment.setType(attObj.get("type").toString());
attachment.setText_url(attObj.get("text_url").toString());
attachment.setUrl(attObj.get("url").toString());
attachments.add(attachment);
}
}
status.setMedia_attachments(attachments);
2017-06-24 07:23:15 +02:00
//Retrieves mentions
List<Mention> mentions = new ArrayList<>();
JSONArray arrayMention = resobj.getJSONArray("mentions");
if( arrayMention != null){
for(int j = 0 ; j < arrayMention.length() ; j++){
JSONObject menObj = arrayMention.getJSONObject(j);
Mention mention = new Mention();
mention.setId(menObj.get("id").toString());
mention.setUrl(menObj.get("url").toString());
mention.setAcct(menObj.get("acct").toString());
mention.setUsername(menObj.get("username").toString());
mentions.add(mention);
}
}
status.setMentions(mentions);
2017-06-24 07:23:15 +02:00
//Retrieves tags
List<Tag> tags = new ArrayList<>();
JSONArray arrayTag = resobj.getJSONArray("tags");
if( arrayTag != null){
for(int j = 0 ; j < arrayTag.length() ; j++){
JSONObject tagObj = arrayTag.getJSONObject(j);
Tag tag = new Tag();
tag.setName(tagObj.get("name").toString());
tag.setUrl(tagObj.get("url").toString());
tags.add(tag);
}
}
status.setTags(tags);
2017-08-28 13:53:07 +02:00
status.setAccount(parseAccountResponse(context, resobj.getJSONObject("account")));
2017-05-05 16:36:04 +02:00
status.setContent(resobj.get("content").toString());
status.setFavourites_count(Integer.valueOf(resobj.get("favourites_count").toString()));
status.setReblogs_count(Integer.valueOf(resobj.get("reblogs_count").toString()));
try {
status.setReblogged(Boolean.valueOf(resobj.get("reblogged").toString()));
}catch (Exception e){
status.setReblogged(false);
}
try {
status.setFavourited(Boolean.valueOf(resobj.get("favourited").toString()));
}catch (Exception e){
status.setReblogged(false);
}
try {
status.setPinned(Boolean.valueOf(resobj.get("pinned").toString()));
}catch (JSONException e){
status.setPinned(false);
}
2017-05-05 16:36:04 +02:00
try{
2017-08-28 13:53:07 +02:00
status.setReblog(parseStatuses(context, resobj.getJSONObject("reblog")));
2017-05-05 16:36:04 +02:00
}catch (Exception ignored){}
} catch (JSONException e) {
e.printStackTrace();
}
return status;
}
/**
* Parse json response an unique instance
* @param resobj JSONObject
* @return Instance
*/
private Instance parseInstance(JSONObject resobj){
Instance instance = new Instance();
try {
instance.setUri(resobj.get("uri").toString());
instance.setTitle(resobj.get("title").toString());
instance.setDescription(resobj.get("description").toString());
instance.setEmail(resobj.get("email").toString());
instance.setVersion(resobj.get("version").toString());
} catch (JSONException e) {
e.printStackTrace();
}
return instance;
}
2017-05-05 16:36:04 +02:00
/**
* Parse json response an unique account
* @param resobj JSONObject
* @return Account
*/
2017-08-28 13:53:07 +02:00
private static Account parseAccountResponse(Context context, JSONObject resobj){
2017-05-05 16:36:04 +02:00
Account account = new Account();
try {
account.setId(resobj.get("id").toString());
account.setUsername(resobj.get("username").toString());
account.setAcct(resobj.get("acct").toString());
account.setDisplay_name(resobj.get("display_name").toString());
account.setLocked(Boolean.parseBoolean(resobj.get("locked").toString()));
account.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString()));
account.setFollowers_count(Integer.valueOf(resobj.get("followers_count").toString()));
account.setFollowing_count(Integer.valueOf(resobj.get("following_count").toString()));
account.setStatuses_count(Integer.valueOf(resobj.get("statuses_count").toString()));
account.setNote(resobj.get("note").toString());
account.setUrl(resobj.get("url").toString());
account.setAvatar(resobj.get("avatar").toString());
account.setAvatar_static(resobj.get("avatar_static").toString());
account.setHeader(resobj.get("header").toString());
account.setHeader_static(resobj.get("header_static").toString());
} catch (JSONException e) {
e.printStackTrace();
}
return account;
}
/**
* Parse json response for list of accounts
* @param jsonArray JSONArray
* @return List<Account>
*/
private List<Account> parseAccountResponse(JSONArray jsonArray){
List<Account> accounts = new ArrayList<>();
try {
int i = 0;
while (i < jsonArray.length() ) {
JSONObject resobj = jsonArray.getJSONObject(i);
2017-08-28 13:53:07 +02:00
Account account = parseAccountResponse(context, resobj);
2017-05-05 16:36:04 +02:00
accounts.add(account);
i++;
}
} catch (JSONException e) {
e.printStackTrace();
}
return accounts;
}
/**
2017-09-17 11:50:00 +02:00
* Parse json response an unique relationship
* @param resobj JSONObject
* @return Relationship
*/
private Relationship parseRelationshipResponse(JSONObject resobj){
Relationship relationship = new Relationship();
try {
relationship.setId(resobj.get("id").toString());
relationship.setFollowing(Boolean.valueOf(resobj.get("following").toString()));
relationship.setFollowed_by(Boolean.valueOf(resobj.get("followed_by").toString()));
relationship.setBlocking(Boolean.valueOf(resobj.get("blocking").toString()));
relationship.setMuting(Boolean.valueOf(resobj.get("muting").toString()));
relationship.setRequested(Boolean.valueOf(resobj.get("requested").toString()));
} catch (JSONException e) {
e.printStackTrace();
}
return relationship;
}
/**
* Parse json response for list of relationship
* @param jsonArray JSONArray
2017-09-17 11:50:00 +02:00
* @return List<Relationship>
*/
2017-09-17 11:50:00 +02:00
private List<Relationship> parseRelationshipResponse(JSONArray jsonArray){
2017-09-17 11:50:00 +02:00
List<Relationship> relationships = new ArrayList<>();
try {
int i = 0;
while (i < jsonArray.length() ) {
JSONObject resobj = jsonArray.getJSONObject(i);
2017-09-17 11:50:00 +02:00
Relationship relationship = parseRelationshipResponse(resobj);
relationships.add(relationship);
i++;
}
} catch (JSONException e) {
e.printStackTrace();
}
2017-09-17 11:50:00 +02:00
return relationships;
}
2017-05-05 16:36:04 +02:00
/**
* Parse json response for the context
* @param jsonObject JSONObject
* @return fr.gouv.etalab.mastodon.client.Entities.Context
*/
private fr.gouv.etalab.mastodon.client.Entities.Context parseContext(JSONObject jsonObject){
fr.gouv.etalab.mastodon.client.Entities.Context context = new fr.gouv.etalab.mastodon.client.Entities.Context();
try {
context.setAncestors(parseStatuses(jsonObject.getJSONArray("ancestors")));
context.setDescendants(parseStatuses(jsonObject.getJSONArray("descendants")));
} catch (JSONException e) {
e.printStackTrace();
}
return context;
}
/**
* Parse json response an unique attachment
* @param resobj JSONObject
* @return Relationship
*/
private Attachment parseAttachmentResponse(JSONObject resobj){
Attachment attachment = new Attachment();
try {
attachment.setId(resobj.get("id").toString());
attachment.setType(resobj.get("type").toString());
attachment.setUrl(resobj.get("url").toString());
try{
attachment.setRemote_url(resobj.get("remote_url").toString());
}catch (JSONException ignore){}
try{
attachment.setPreview_url(resobj.get("preview_url").toString());
}catch (JSONException ignore){}
try{
attachment.setText_url(resobj.get("text_url").toString());
}catch (JSONException ignore){}
} catch (JSONException e) {
e.printStackTrace();
}
return attachment;
}
/**
* Parse json response an unique notification
* @param resobj JSONObject
* @return Account
*/
2017-08-28 13:53:07 +02:00
public static Notification parseNotificationResponse(Context context, JSONObject resobj){
2017-05-05 16:36:04 +02:00
Notification notification = new Notification();
try {
notification.setId(resobj.get("id").toString());
notification.setType(resobj.get("type").toString());
notification.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString()));
2017-08-28 13:53:07 +02:00
notification.setAccount(parseAccountResponse(context, resobj.getJSONObject("account")));
2017-05-05 16:36:04 +02:00
try{
2017-08-28 13:53:07 +02:00
notification.setStatus(parseStatuses(context, resobj.getJSONObject("status")));
2017-05-05 16:36:04 +02:00
}catch (Exception ignored){}
notification.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString()));
} catch (JSONException e) {
e.printStackTrace();
}
return notification;
}
/**
* Parse json response for list of notifications
* @param jsonArray JSONArray
* @return List<Notification>
*/
private List<Notification> parseNotificationResponse(JSONArray jsonArray){
List<Notification> notifications = new ArrayList<>();
try {
int i = 0;
while (i < jsonArray.length() ) {
2017-05-05 16:36:04 +02:00
JSONObject resobj = jsonArray.getJSONObject(i);
2017-08-28 13:53:07 +02:00
Notification notification = parseNotificationResponse(context, resobj);
2017-05-05 16:36:04 +02:00
notifications.add(notification);
i++;
}
} catch (JSONException e) {
e.printStackTrace();
}
return notifications;
}
/**
* Set the error message
* @param statusCode int code
* @param error Throwable error
*/
private void setError(int statusCode, Throwable error){
2017-06-03 18:18:27 +02:00
APIError = new Error();
APIError.setError(statusCode + " - " + error.getMessage());
apiResponse.setError(APIError);
2017-05-05 16:36:04 +02:00
}
private void get(String action, RequestParams params, AsyncHttpResponseHandler responseHandler) {
try {
2017-08-17 10:24:54 +02:00
client.setConnectTimeout(20000); //20s timeout
client.setUserAgent(USER_AGENT);
client.addHeader("Authorization", "Bearer "+prefKeyOauthTokenT);
MastalabSSLSocketFactory mastalabSSLSocketFactory = new MastalabSSLSocketFactory(MastalabSSLSocketFactory.getKeystore());
mastalabSSLSocketFactory.setHostnameVerifier(MastalabSSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
client.setSSLSocketFactory(mastalabSSLSocketFactory);
client.get(getAbsoluteUrl(action), params, responseHandler);
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | UnrecoverableKeyException e) {
Toast.makeText(context, R.string.toast_error,Toast.LENGTH_LONG).show();
e.printStackTrace();
}
2017-05-05 16:36:04 +02:00
}
private void post(String action, int timeout, RequestParams params, AsyncHttpResponseHandler responseHandler) {
try {
client.setConnectTimeout(timeout);
client.setUserAgent(USER_AGENT);
client.addHeader("Authorization", "Bearer "+prefKeyOauthTokenT);
MastalabSSLSocketFactory mastalabSSLSocketFactory = new MastalabSSLSocketFactory(MastalabSSLSocketFactory.getKeystore());
mastalabSSLSocketFactory.setHostnameVerifier(MastalabSSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
client.setSSLSocketFactory(mastalabSSLSocketFactory);
client.post(getAbsoluteUrl(action), params, responseHandler);
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | UnrecoverableKeyException e) {
Toast.makeText(context, R.string.toast_error,Toast.LENGTH_LONG).show();
e.printStackTrace();
}
2017-05-05 16:36:04 +02:00
}
private void delete(String action, RequestParams params, AsyncHttpResponseHandler responseHandler){
try {
2017-08-17 10:24:54 +02:00
client.setConnectTimeout(20000); //20s timeout
client.setUserAgent(USER_AGENT);
client.addHeader("Authorization", "Bearer "+prefKeyOauthTokenT);
MastalabSSLSocketFactory mastalabSSLSocketFactory = new MastalabSSLSocketFactory(MastalabSSLSocketFactory.getKeystore());
mastalabSSLSocketFactory.setHostnameVerifier(MastalabSSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
client.setSSLSocketFactory(mastalabSSLSocketFactory);
client.delete(getAbsoluteUrl(action), params, responseHandler);
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | UnrecoverableKeyException e) {
Toast.makeText(context, R.string.toast_error,Toast.LENGTH_LONG).show();
e.printStackTrace();
}
2017-05-05 16:36:04 +02:00
}
private void patch(String action, RequestParams params, AsyncHttpResponseHandler responseHandler){
try {
2017-08-17 10:24:54 +02:00
client.setConnectTimeout(60000); //60s timeout
client.setUserAgent(USER_AGENT);
client.addHeader("Authorization", "Bearer "+prefKeyOauthTokenT);
MastalabSSLSocketFactory mastalabSSLSocketFactory = new MastalabSSLSocketFactory(MastalabSSLSocketFactory.getKeystore());
mastalabSSLSocketFactory.setHostnameVerifier(MastalabSSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
client.setSSLSocketFactory(mastalabSSLSocketFactory);
client.patch(getAbsoluteUrl(action), params, responseHandler);
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | UnrecoverableKeyException e) {
Toast.makeText(context, R.string.toast_error,Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
public Error getError(){
2017-06-03 18:18:27 +02:00
return APIError;
}
2017-05-05 16:36:04 +02:00
private String getAbsoluteUrl(String action) {
return "https://" + this.instance + "/api/v1" + action;
2017-05-05 16:36:04 +02:00
}
2017-06-03 18:18:27 +02:00
/**
* Find max_id in header
* @param headers Header[]
* @return String max_id if presents
*/
private String findMaxId(Header[] headers){
if( headers == null)
return null;
for(Header header: headers){
if( header.toString().startsWith("Link: ")){
Pattern pattern = Pattern.compile("max_id=([0-9]{1,}).*");
Matcher matcher = pattern.matcher(header.toString());
if (matcher.find()) {
return matcher.group(1);
}
}
}
return null;
}
/**
* Find since_id in header
* @param headers Header[]
* @return String since_id if presents
*/
private String findSinceId(Header[] headers){
if( headers == null)
return null;
for(Header header: headers){
if( header.toString().startsWith("Link: ")){
Pattern pattern = Pattern.compile("since_id=([0-9]{1,}).*");
Matcher matcher = pattern.matcher(header.toString());
if (matcher.find()) {
return matcher.group(1);
}
}
}
return null;
}
2017-05-05 16:36:04 +02:00
}