From 0a6999d28bb0f87459339c4425333aabfd3b3da9 Mon Sep 17 00:00:00 2001 From: tom79 Date: Tue, 24 Sep 2019 19:13:30 +0200 Subject: [PATCH] Improve detection of the network --- .../android/activities/BaseMainActivity.java | 2 + .../UpdateAccountInfoAsyncTask.java | 6 +- .../java/app/fedilab/android/client/API.java | 121 +++++++++++++++++- 3 files changed, 121 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java index 5dae1ab2b..84c89569f 100644 --- a/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java @@ -61,6 +61,7 @@ import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.Toolbar; +import android.util.Log; import android.util.Patterns; import android.view.LayoutInflater; import android.view.Menu; @@ -216,6 +217,7 @@ public abstract class BaseMainActivity extends BaseActivity return; } + //Update the static variable which manages account type if (account.getSocial() == null || account.getSocial().equals("MASTODON")) social = UpdateAccountInfoAsyncTask.SOCIAL.MASTODON; diff --git a/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoAsyncTask.java index 190ab6417..ab0257576 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoAsyncTask.java @@ -27,6 +27,7 @@ import java.net.URLDecoder; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Account; +import app.fedilab.android.client.Entities.InstanceNodeInfo; import app.fedilab.android.client.GNUAPI; import app.fedilab.android.client.PeertubeAPI; import app.fedilab.android.helper.Helper; @@ -70,8 +71,9 @@ public class UpdateAccountInfoAsyncTask extends AsyncTask { Account account; if (social == SOCIAL.MASTODON || social == SOCIAL.PIXELFED) { account = new API(this.contextReference.get(), instance, null).verifyCredentials(); - if (account != null) - account.setSocial(account.getSocial()); + InstanceNodeInfo info = new API(this.contextReference.get(), instance, null).getRealNodeInfo(this.instance); + if (info != null) + account.setSocial(info.getName().toUpperCase()); } else if (social == SOCIAL.PEERTUBE) { account = new PeertubeAPI(this.contextReference.get(), instance, null).verifyCredentials(); if (account != null) diff --git a/app/src/main/java/app/fedilab/android/client/API.java b/app/src/main/java/app/fedilab/android/client/API.java index e0c9ab134..5fb80528d 100644 --- a/app/src/main/java/app/fedilab/android/client/API.java +++ b/app/src/main/java/app/fedilab/android/client/API.java @@ -19,6 +19,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; +import android.util.Log; import androidx.localbroadcastmanager.content.LocalBroadcastManager; @@ -190,6 +191,9 @@ public class API { } SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); tootPerPage = sharedpreferences.getInt(Helper.SET_TOOT_PER_PAGE, Helper.TOOTS_PER_PAGE); + if( MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && tootPerPage > 30 ){ + tootPerPage = 30; + } accountPerPage = Helper.ACCOUNTS_PER_PAGE; notificationPerPage = Helper.NOTIFICATIONS_PER_PAGE; this.prefKeyOauthTokenT = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); @@ -574,6 +578,113 @@ public class API { return apiResponse; } + + public InstanceNodeInfo getRealNodeInfo(String domain) { + + //Try to guess URL scheme for the onion instance + String scheme = "https"; + if (domain.endsWith(".onion")) { + try { + new HttpsConnection(context, domain).get("http://" + domain, 30, null, null); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.SET_ONION_SCHEME + domain, "http"); + scheme = "http"; + editor.apply(); + } catch (IOException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (HttpsConnection.HttpsConnectionException e) { + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.SET_ONION_SCHEME + domain, "https"); + editor.apply(); + } + } + String response; + InstanceNodeInfo instanceNodeInfo = new InstanceNodeInfo(); + try { + response = new HttpsConnection(context, domain).get(scheme + "://" + domain + "/.well-known/nodeinfo", 30, null, null); + JSONArray jsonArray = new JSONObject(response).getJSONArray("links"); + ArrayList nodeInfos = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + + JSONObject resobj = jsonArray.getJSONObject(i); + NodeInfo nodeInfo = new NodeInfo(); + nodeInfo.setHref(resobj.getString("href")); + nodeInfo.setRel(resobj.getString("rel")); + i++; + nodeInfos.add(nodeInfo); + } + if (nodeInfos.size() > 0) { + NodeInfo nodeInfo = nodeInfos.get(nodeInfos.size() - 1); + response = new HttpsConnection(context, this.instance).get(nodeInfo.getHref(), 30, null, null); + JSONObject resobj = new JSONObject(response); + JSONObject jsonObject = resobj.getJSONObject("software"); + String name = null; + if (resobj.has("metadata") && resobj.getJSONObject("metadata").has("features")) { + JSONArray features = resobj.getJSONObject("metadata").getJSONArray("features"); + if (features.length() > 0) { + for (int counter = 0; counter < features.length(); counter++) { + if (features.getString(counter).toUpperCase().equals("MASTODON_API")) { + name = "MASTODON"; + break; + } + } + } + } + if (name == null) { + name = jsonObject.getString("name").toUpperCase(); + } + instanceNodeInfo.setName(name); + instanceNodeInfo.setVersion(jsonObject.getString("version")); + instanceNodeInfo.setOpenRegistrations(resobj.getBoolean("openRegistrations")); + } + } catch (JSONException e) { + setDefaultError(e); + } + } catch (IOException e) { + instanceNodeInfo.setConnectionError(true); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (HttpsConnection.HttpsConnectionException e) { + try { + response = new HttpsConnection(context, this.instance).get(scheme + "://" + domain + "/api/v1/instance", 30, null, null); + JSONObject jsonObject = new JSONObject(response); + instanceNodeInfo.setName("MASTODON"); + instanceNodeInfo.setVersion(jsonObject.getString("version")); + instanceNodeInfo.setOpenRegistrations(true); + } catch (IOException e1) { + instanceNodeInfo.setConnectionError(true); + e1.printStackTrace(); + } catch (NoSuchAlgorithmException e1) { + e1.printStackTrace(); + } catch (KeyManagementException e1) { + e1.printStackTrace(); + } catch (HttpsConnection.HttpsConnectionException e1) { + instanceNodeInfo.setName("GNU"); + instanceNodeInfo.setVersion("MASTODON"); + instanceNodeInfo.setOpenRegistrations(true); + e1.printStackTrace(); + } catch (JSONException e1) { + + e1.printStackTrace(); + } + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + return instanceNodeInfo; + } + public InstanceNodeInfo getNodeInfo(String domain) { //Try to guess URL scheme for the onion instance @@ -770,6 +881,9 @@ public class API { } SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); tootPerPage = sharedpreferences.getInt(Helper.SET_TOOT_PER_PAGE, Helper.TOOTS_PER_PAGE); + if( MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && tootPerPage > 30 ){ + tootPerPage = 30; + } accountPerPage = Helper.ACCOUNTS_PER_PAGE; notificationPerPage = Helper.NOTIFICATIONS_PER_PAGE; if (instance != null) @@ -896,6 +1010,7 @@ public class API { } String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/accounts/verify_credentials"), 10, null, prefKeyOauthTokenT); account = parseAccountResponse(context, new JSONObject(response)); + account.setSocial(getNodeInfo(instance).getName().toUpperCase()); if (account != null && account.getSocial() != null && account.getSocial().equals("PLEROMA")) { isPleromaAdmin(account.getAcct()); } @@ -5778,12 +5893,6 @@ public class API { account.setAvatar_static(resobj.get("avatar_static").toString()); account.setHeader(resobj.get("header").toString()); account.setHeader_static(resobj.get("header_static").toString()); - - try { - account.setSocial(resobj.get("software").toString().toUpperCase()); - } catch (Exception ignored) { - account.setSocial("MASTODON"); - } try { if (resobj.has("pleroma")) { account.setSocial("PLEROMA");