summaryrefslogtreecommitdiffstats
path: root/app/src/main/java/fr/gouv/etalab/mastodon/client
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/fr/gouv/etalab/mastodon/client')
-rw-r--r--app/src/main/java/fr/gouv/etalab/mastodon/client/API.java96
-rw-r--r--app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java8
-rw-r--r--app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Version.java4
-rw-r--r--app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java13
-rw-r--r--app/src/main/java/fr/gouv/etalab/mastodon/client/PeertubeAPI.java70
5 files changed, 105 insertions, 86 deletions
diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java
index 280bcb735..f748d04f6 100644
--- a/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java
+++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/API.java
@@ -20,7 +20,6 @@ import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
-import android.util.Log;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
@@ -204,11 +203,11 @@ public class API {
response = new HttpsConnection(context).get(nodeInfo.getHref(), 30, null, null);
JSONObject resobj = new JSONObject(response);
JSONObject jsonObject = resobj.getJSONObject("software");
- String name = "MASTODON";
+ String name = jsonObject.getString("name").toUpperCase();
if( jsonObject.getString("name") != null ){
switch (jsonObject.getString("name").toUpperCase()){
- case "PEERTUBE":
- name = "PEERTUBE";
+ case "PLEROMA":
+ name = "MASTODON";
break;
case "HUBZILLA":
case "REDMATRIX":
@@ -374,40 +373,45 @@ public class API {
isPleromaAdmin(account.getAcct());
}
} catch (HttpsConnection.HttpsConnectionException e) {
- SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
- Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT);
- HashMap<String, String> values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token());
- if( values.containsKey("access_token") && values.get("access_token") != null) {
- targetedAccount.setToken(values.get("access_token"));
- SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
- String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
- //This account is currently logged in, the token is updated
- if( prefKeyOauthTokenT.equals(token)){
- SharedPreferences.Editor editor = sharedpreferences.edit();
- editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken());
- editor.apply();
- }
- }if( values.containsKey("refresh_token") && values.get("refresh_token") != null)
- targetedAccount.setRefresh_token(values.get("refresh_token"));
- new AccountDAO(context, db).updateAccount(targetedAccount);
- String response;
- try {
- response = new HttpsConnection(context).get(getAbsoluteUrl("/accounts/verify_credentials"), 60, null, targetedAccount.getToken());
- account = parseAccountResponse(context, new JSONObject(response));
- if( account.getSocial().equals("PLEROMA")){
- isPleromaAdmin(account.getAcct());
+ e.printStackTrace();
+ if( e.getStatusCode() == 401 || e.getStatusCode() == 403){
+ SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
+ Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT);
+ if( targetedAccount == null)
+ return null;
+ HashMap<String, String> values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token());
+ if( values.containsKey("access_token") && values.get("access_token") != null) {
+ targetedAccount.setToken(values.get("access_token"));
+ SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
+ String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
+ //This account is currently logged in, the token is updated
+ if( prefKeyOauthTokenT.equals(token)){
+ SharedPreferences.Editor editor = sharedpreferences.edit();
+ editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken());
+ editor.apply();
+ }
+ }if( values.containsKey("refresh_token") && values.get("refresh_token") != null)
+ targetedAccount.setRefresh_token(values.get("refresh_token"));
+ new AccountDAO(context, db).updateAccount(targetedAccount);
+ String response;
+ try {
+ response = new HttpsConnection(context).get(getAbsoluteUrl("/accounts/verify_credentials"), 60, null, targetedAccount.getToken());
+ account = parseAccountResponse(context, new JSONObject(response));
+ if( account.getSocial().equals("PLEROMA")){
+ isPleromaAdmin(account.getAcct());
+ }
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ } catch (NoSuchAlgorithmException e1) {
+ e1.printStackTrace();
+ } catch (KeyManagementException e1) {
+ e1.printStackTrace();
+ } catch (JSONException e1) {
+ e1.printStackTrace();
+ } catch (HttpsConnection.HttpsConnectionException e1) {
+ e1.printStackTrace();
+ setError(e.getStatusCode(), e);
}
- } catch (IOException e1) {
- e1.printStackTrace();
- } catch (NoSuchAlgorithmException e1) {
- e1.printStackTrace();
- } catch (KeyManagementException e1) {
- e1.printStackTrace();
- } catch (JSONException e1) {
- e1.printStackTrace();
- } catch (HttpsConnection.HttpsConnectionException e1) {
- e1.printStackTrace();
- setError(e.getStatusCode(), e);
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
@@ -440,10 +444,6 @@ public class API {
String token = resobj.get("access_token").toString();
if( resobj.has("refresh_token"))
refresh_token = resobj.get("refresh_token").toString();
- SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
- SharedPreferences.Editor editor = sharedpreferences.edit();
- editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token);
- editor.apply();
newValues.put("access_token",token);
newValues.put("refresh_token",refresh_token);
@@ -2220,8 +2220,9 @@ public class API {
*/
public Poll getPoll(Status status){
try {
+ Poll _p = (status.getReblog() != null)?status.getReblog().getPoll():status.getPoll();
HttpsConnection httpsConnection = new HttpsConnection(context);
- String response = httpsConnection.get(getAbsoluteUrl(String.format("/polls/%s", status.getPoll().getId())), 60, null, prefKeyOauthTokenT);
+ String response = httpsConnection.get(getAbsoluteUrl(String.format("/polls/%s", _p.getId())), 60, null, prefKeyOauthTokenT);
Poll poll = parsePoll(context, new JSONObject(response));
Bundle b = new Bundle();
status.setPoll(poll);
@@ -2425,24 +2426,35 @@ public class API {
parameters.append("exclude_types[]=").append("follow").append("&");
parameters.append("exclude_types[]=").append("favourite").append("&");
parameters.append("exclude_types[]=").append("reblog").append("&");
+ parameters.append("exclude_types[]=").append("poll").append("&");
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
params.put("exclude_types[]", parameters.toString());
}else if(type == DisplayNotificationsFragment.Type.FAVORITE){
parameters.append("exclude_types[]=").append("follow").append("&");
parameters.append("exclude_types[]=").append("mention").append("&");
parameters.append("exclude_types[]=").append("reblog").append("&");
+ parameters.append("exclude_types[]=").append("poll").append("&");
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
params.put("exclude_types[]", parameters.toString());
}else if(type == DisplayNotificationsFragment.Type.BOOST){
parameters.append("exclude_types[]=").append("follow").append("&");
parameters.append("exclude_types[]=").append("mention").append("&");
parameters.append("exclude_types[]=").append("favourite").append("&");
+ parameters.append("exclude_types[]=").append("poll").append("&");
+ parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
+ params.put("exclude_types[]", parameters.toString());
+ }else if(type == DisplayNotificationsFragment.Type.POOL){
+ parameters.append("exclude_types[]=").append("reblog").append("&");
+ parameters.append("exclude_types[]=").append("follow").append("&");
+ parameters.append("exclude_types[]=").append("mention").append("&");
+ parameters.append("exclude_types[]=").append("favourite").append("&");
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
params.put("exclude_types[]", parameters.toString());
}else if(type == DisplayNotificationsFragment.Type.FOLLOW){
parameters.append("exclude_types[]=").append("reblog").append("&");
parameters.append("exclude_types[]=").append("mention").append("&");
parameters.append("exclude_types[]=").append("favourite").append("&");
+ parameters.append("exclude_types[]=").append("poll").append("&");
parameters = new StringBuilder(parameters.substring(0, parameters.length() - 1).substring(16));
params.put("exclude_types[]", parameters.toString());
}
diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java
index ff6b4feca..0ba3a6a4b 100644
--- a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java
+++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Status.java
@@ -318,9 +318,7 @@ public class Status implements Parcelable{
public void setContent(String content) {
//Remove UTM by default
- this.content = content.replaceAll("&amp;utm_\\w+=[0-9a-zA-Z._-]*", "");
- this.content = this.content.replaceAll("&utm_\\w+=[0-9a-zA-Z._-]*", "");
- this.content = this.content.replaceAll("\\?utm_\\w+=[0-9a-zA-Z._-]*", "?");
+ this.content = Helper.remove_tracking_param(content);
}
public Status getReblog() {
@@ -888,10 +886,10 @@ public class Status implements Parcelable{
}
SpannableString spannableStringT;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
- spannableStringT = new SpannableString(Html.fromHtml(spannableString.toString().replaceAll("^<p>","").replaceAll("<p>","<br/><br/>").replaceAll("</p>",""), Html.FROM_HTML_MODE_LEGACY));
+ spannableStringT = new SpannableString(Html.fromHtml(spannableString.toString().replaceAll("^<p>","").replaceAll("<p>","<br/><br/>").replaceAll("</p>","").replaceAll("<br />","<br/>").replaceAll("[\\s]{2}","&nbsp;&nbsp;"), Html.FROM_HTML_MODE_LEGACY));
else
//noinspection deprecation
- spannableStringT = new SpannableString(Html.fromHtml(spannableString.toString().replaceAll("^<p>","").replaceAll("<p>","<br/><br/>").replaceAll("</p>","")));
+ spannableStringT = new SpannableString(Html.fromHtml(spannableString.toString().replaceAll("^<p>","").replaceAll("<p>","<br/><br/>").replaceAll("</p>","").replaceAll("<br />","<br/>").replaceAll("[\\s]{2}","&nbsp;&nbsp;")));
URLSpan[] spans = spannableStringT.getSpans(0, spannableStringT.length(), URLSpan.class);
for (URLSpan span : spans) {
diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Version.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Version.java
index 9c6ceb501..42cdac5ba 100644
--- a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Version.java
+++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Version.java
@@ -19,6 +19,10 @@ public class Version implements Comparable<Version> {
public Version(String version) {
if(version == null)
version = "2.1";
+ if( version.contains("+")){
+ String[] versionA = version.split("\\+");
+ version = versionA[0];
+ }
if( version.endsWith("."))
version = version.substring(0, version.length() - 1);
version = version.replaceAll("[^\\d.]", "");
diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java
index c78feaea2..deba58833 100644
--- a/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java
+++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java
@@ -20,7 +20,6 @@ import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.text.Html;
import android.text.SpannableString;
-import android.util.Log;
import com.google.common.io.ByteStreams;
import com.google.gson.JsonObject;
@@ -66,6 +65,7 @@ import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoAsyncTask;
import fr.gouv.etalab.mastodon.client.Entities.Account;
import fr.gouv.etalab.mastodon.client.Entities.Attachment;
import fr.gouv.etalab.mastodon.client.Entities.Error;
+import fr.gouv.etalab.mastodon.helper.FileNameCleaner;
import fr.gouv.etalab.mastodon.helper.Helper;
import fr.gouv.etalab.mastodon.interfaces.OnDownloadInterface;
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveAttachmentInterface;
@@ -154,6 +154,8 @@ public class HttpsConnection {
httpsURLConnection.setConnectTimeout(timeout * 1000);
httpsURLConnection.setRequestProperty("http.keepAlive", "false");
httpsURLConnection.setRequestProperty("User-Agent", Helper.USER_AGENT);
+ httpsURLConnection.setRequestProperty("Content-Type", "application/json");
+ httpsURLConnection.setRequestProperty("Accept", "application/json");
httpsURLConnection.setSSLSocketFactory(new TLSSocketFactory());
if (token != null && !token.startsWith("Basic "))
httpsURLConnection.setRequestProperty("Authorization", "Bearer " + token);
@@ -246,6 +248,8 @@ public class HttpsConnection {
httpsURLConnection = (HttpsURLConnection)url.openConnection();
httpsURLConnection.setConnectTimeout(30 * 1000);
httpsURLConnection.setRequestProperty("http.keepAlive", "false");
+ httpsURLConnection.setRequestProperty("Content-Type", "application/json");
+ httpsURLConnection.setRequestProperty("Accept", "application/json");
httpsURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36");
httpsURLConnection.setSSLSocketFactory(new TLSSocketFactory());
httpsURLConnection.setRequestMethod("GET");
@@ -605,6 +609,7 @@ public class HttpsConnection {
fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1,
downloadUrl.length());
}
+ fileName = FileNameCleaner.cleanFileName(fileName);
// opens input stream from the HTTP connection
InputStream inputStream = httpsURLConnection.getInputStream();
File saveDir = context.getCacheDir();
@@ -692,6 +697,7 @@ public class HttpsConnection {
fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1,
downloadUrl.length());
}
+ fileName = FileNameCleaner.cleanFileName(fileName);
// opens input stream from the HTTP connection
InputStream inputStream = httpURLConnection.getInputStream();
File saveDir = context.getCacheDir();
@@ -815,6 +821,7 @@ public class HttpsConnection {
@SuppressWarnings("SameParameterValue")
private void patchImage(String urlConnection, int timeout, imageType it, InputStream image, String fileName, String token) throws IOException, NoSuchAlgorithmException, KeyManagementException, HttpsConnectionException {
+ fileName = FileNameCleaner.cleanFileName(fileName);
String twoHyphens = "--";
String boundary = "*****" + Long.toString(System.currentTimeMillis()) + "*****";
String lineEnd = "\r\n";
@@ -1201,8 +1208,8 @@ public class HttpsConnection {
* @param inputStream InputStream of the file to upload
* @param listener - OnRetrieveAttachmentInterface: listener to send information about attachment once uploaded.
*/
- public void upload(final InputStream inputStream, String fileName, String tokenUsed, final OnRetrieveAttachmentInterface listener) {
-
+ public void upload(final InputStream inputStream, String fname, String tokenUsed, final OnRetrieveAttachmentInterface listener) {
+ final String fileName = FileNameCleaner.cleanFileName(fname);
if( Helper.getLiveInstanceWithProtocol(context).startsWith("https://")) {
new Thread(new Runnable() {
@Override
diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/PeertubeAPI.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/PeertubeAPI.java
index 1f5c4152b..c49e673f8 100644
--- a/app/src/main/java/fr/gouv/etalab/mastodon/client/PeertubeAPI.java
+++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/PeertubeAPI.java
@@ -380,40 +380,42 @@ public class PeertubeAPI {
} catch (JSONException e) {
e.printStackTrace();
}catch (HttpsConnection.HttpsConnectionException e) {
- SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
- Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT);
- HashMap<String, String> values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token());
- if( values.containsKey("access_token") && values.get("access_token") != null) {
- targetedAccount.setToken(values.get("access_token"));
- SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
- String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
- //This account is currently logged in, the token is updated
- if( prefKeyOauthTokenT.equals(token)){
- SharedPreferences.Editor editor = sharedpreferences.edit();
- editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken());
- editor.apply();
+ if( e.getStatusCode() == 401 || e.getStatusCode() == 403){
+ SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
+ Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT);
+ HashMap<String, String> values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token());
+ if( values.containsKey("access_token") && values.get("access_token") != null) {
+ targetedAccount.setToken(values.get("access_token"));
+ SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
+ String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
+ //This account is currently logged in, the token is updated
+ if( prefKeyOauthTokenT.equals(token)){
+ SharedPreferences.Editor editor = sharedpreferences.edit();
+ editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken());
+ editor.apply();
+ }
+ }if( values.containsKey("refresh_token") && values.get("refresh_token") != null)
+ targetedAccount.setRefresh_token(values.get("refresh_token"));
+ new AccountDAO(context, db).updateAccount(targetedAccount);
+ String response;
+ try {
+ response = new HttpsConnection(context).get(getAbsoluteUrl("/users/me"), 60, null, targetedAccount.getToken());
+ JSONObject accountObject = new JSONObject(response).getJSONObject("account");
+ account = parseAccountResponsePeertube(context, accountObject);
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ } catch (NoSuchAlgorithmException e1) {
+ e1.printStackTrace();
+ } catch (KeyManagementException e1) {
+ e1.printStackTrace();
+ } catch (JSONException e1) {
+ e1.printStackTrace();
+ } catch (HttpsConnection.HttpsConnectionException e1) {
+ e1.printStackTrace();
+ setError(e.getStatusCode(), e);
}
- }if( values.containsKey("refresh_token") && values.get("refresh_token") != null)
- targetedAccount.setRefresh_token(values.get("refresh_token"));
- new AccountDAO(context, db).updateAccount(targetedAccount);
- String response;
- try {
- response = new HttpsConnection(context).get(getAbsoluteUrl("/users/me"), 60, null, targetedAccount.getToken());
- JSONObject accountObject = new JSONObject(response).getJSONObject("account");
- account = parseAccountResponsePeertube(context, accountObject);
- } catch (IOException e1) {
- e1.printStackTrace();
- } catch (NoSuchAlgorithmException e1) {
- e1.printStackTrace();
- } catch (KeyManagementException e1) {
- e1.printStackTrace();
- } catch (JSONException e1) {
- e1.printStackTrace();
- } catch (HttpsConnection.HttpsConnectionException e1) {
- e1.printStackTrace();
- setError(e.getStatusCode(), e);
+ e.printStackTrace();
}
- e.printStackTrace();
}
return account;
}
@@ -436,10 +438,6 @@ public class PeertubeAPI {
String token = resobj.get("access_token").toString();
if( resobj.has("refresh_token"))
refresh_token = resobj.get("refresh_token").toString();
- SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
- SharedPreferences.Editor editor = sharedpreferences.edit();
- editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token);
- editor.apply();
newValues.put("access_token",token);
newValues.put("refresh_token",refresh_token);