From a45cc626c2155bc1e8688db3ab6b75f8bc2e0c97 Mon Sep 17 00:00:00 2001 From: tom79 Date: Tue, 22 Aug 2017 18:15:08 +0200 Subject: [PATCH] Adds remote follow & some improvements --- .../activities/RemoteFollowActivity.java | 45 +++---------------- .../RetrieveRemoteAccountsAsyncTask.java | 19 ++++---- .../fr/gouv/etalab/mastodon/client/API.java | 5 +++ .../drawers/AccountSearchWebAdapter.java | 23 ++++++++-- .../OnRetrieveRemoteAccountInterface.java | 2 +- .../res/layout/drawer_account_search_html.xml | 25 +++++++++-- 6 files changed, 60 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/RemoteFollowActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/RemoteFollowActivity.java index 06e8663de..b55a23840 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/RemoteFollowActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/RemoteFollowActivity.java @@ -26,7 +26,6 @@ import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.text.Editable; import android.text.TextWatcher; -import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -236,7 +235,7 @@ public class RemoteFollowActivity extends AppCompatActivity implements OnRetriev rf_no_result.setVisibility(View.GONE); if( screen_name.startsWith("@")) screen_name = screen_name.substring(1); - new RetrieveRemoteAccountsAsyncTask(RemoteFollowActivity.this, screen_name, instance_name, RemoteFollowActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new RetrieveRemoteAccountsAsyncTask(screen_name, instance_name, RemoteFollowActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); } @@ -252,59 +251,25 @@ public class RemoteFollowActivity extends AppCompatActivity implements OnRetriev } } -/* + @Override - public void onRetrieveSearchAccounts(APIResponse apiResponse) { - rf_search.setEnabled(true); + public void onRetrieveRemoteAccount(boolean error, String name, String username, boolean locked, String avatar, String bio, int statusCount, int followingCount, int followersCount) { loader.setVisibility(View.GONE); - if( apiResponse.getError() != null){ - final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - boolean show_error_messages = sharedpreferences.getBoolean(Helper.SET_SHOW_ERROR_MESSAGES, true); - if( show_error_messages) - Toast.makeText(getApplicationContext(), apiResponse.getError().getError(),Toast.LENGTH_LONG).show(); - return; - } - final List accounts = apiResponse.getAccounts(); - Log.v(Helper.TAG,"accounts: " + accounts); - if( accounts != null && accounts.size() > 0 && accounts.get(0) != null) { - List selectedAccount = new ArrayList<>(); - for(Account account: accounts){ - if(account.getAcct().contains("@" + instance_name) || (account.getUsername().equals(account.getAcct()) && account.getUsername().equals(screen_name))) - selectedAccount.add(account); - } - if( selectedAccount.size() > 0) { - AccountsListAdapter accountsListAdapter = new AccountsListAdapter(RemoteFollowActivity.this, RetrieveAccountsAsyncTask.Type.FOLLOWERS, null, selectedAccount); - lv_account.setAdapter(accountsListAdapter); - lv_account.setVisibility(View.VISIBLE); - }else { - rf_no_result.setVisibility(View.VISIBLE); - } - }else if( firstSearch){ - firstSearch = false; - new RetrieveSearchAccountsAsyncTask(RemoteFollowActivity.this, screen_name, 50, RemoteFollowActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - }else { - rf_no_result.setVisibility(View.VISIBLE); - } - }*/ - - - @Override - public void onRetrieveRemoteAccount(boolean error, String name, String avatar, String bio, int statusCount, int followingCount, int followersCount) { if( error){ rf_no_result.setVisibility(View.VISIBLE); Toast.makeText(getApplicationContext(), R.string.toast_error,Toast.LENGTH_LONG).show(); return; } - loader.setVisibility(View.GONE); Account account = new Account(); account.setInstance(instance_name); account.setAcct(screen_name + "@" + instance_name); account.setAvatar(avatar); - account.setDisplay_name(name); + account.setDisplay_name(username); account.setStatuses_count(statusCount); account.setFollowers_count(followersCount); account.setFollowing_count(followingCount); account.setUsername(name); + account.setLocked(locked); account.setNote(bio); List selectedAccount = new ArrayList<>(); selectedAccount.add(account); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveRemoteAccountsAsyncTask.java b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveRemoteAccountsAsyncTask.java index 9cc037c97..5bd1c9515 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveRemoteAccountsAsyncTask.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/RetrieveRemoteAccountsAsyncTask.java @@ -14,14 +14,11 @@ * see . */ package fr.gouv.etalab.mastodon.asynctasks; -import android.content.Context; import android.os.AsyncTask; -import android.util.Log; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.IOException; -import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveRemoteAccountInterface; @@ -32,16 +29,15 @@ import fr.gouv.etalab.mastodon.interfaces.OnRetrieveRemoteAccountInterface; public class RetrieveRemoteAccountsAsyncTask extends AsyncTask { - private Context context; private OnRetrieveRemoteAccountInterface listener; private String url; - private String avatar, name, bio; + private String avatar, name, username, bio; private int statusCount, followingCount, followersCount; + private boolean islocked; private boolean error = false; private String instance; - public RetrieveRemoteAccountsAsyncTask(Context context, String username, String instance, OnRetrieveRemoteAccountInterface onRetrieveRemoteAccountInterface){ - this.context = context; + public RetrieveRemoteAccountsAsyncTask(String username, String instance, OnRetrieveRemoteAccountInterface onRetrieveRemoteAccountInterface){ this.url = "https://" + instance + "/@" + username; this.listener = onRetrieveRemoteAccountInterface; this.instance = instance; @@ -58,14 +54,17 @@ public class RetrieveRemoteAccountsAsyncTask extends AsyncTask avatar = avatarElement.get(0).getElementsByClass("u-photo").get(0).attr("src"); avatar = "https://" + instance + avatar; Elements nameElement = document.getElementsByClass("name"); - name = nameElement.get(0).html(); + name = nameElement.get(0).getElementsByClass("p-name").get(0).html(); + username = nameElement.get(0).getElementsByTag("span").get(1).html(); + islocked = nameElement.get(0).getElementsByClass("fa-lock") != null; + Elements bioElement = document.getElementsByClass("bio"); bio = bioElement.get(0).html();; Elements countElement = document.getElementsByClass("counter-number"); statusCount = Integer.parseInt(countElement.get(0).html()); followingCount = Integer.parseInt(countElement.get(1).html()); followersCount = Integer.parseInt(countElement.get(2).html()); - } catch (IOException e) { + } catch (IOException | IndexOutOfBoundsException e) { error = true; } return null; @@ -73,7 +72,7 @@ public class RetrieveRemoteAccountsAsyncTask extends AsyncTask @Override protected void onPostExecute(Void result) { - listener.onRetrieveRemoteAccount(error, name, avatar, bio, statusCount, followingCount, followersCount); + listener.onRetrieveRemoteAccount(error, name, username, islocked, avatar, bio, statusCount, followingCount, followersCount); } } 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 904246867..6b555835b 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 @@ -815,6 +815,11 @@ public class API { case FOLLOW: action = String.format("/accounts/%s/follow", targetedId); break; + case REMOTE_FOLLOW: + action = "/accounts/follows"; + params = new RequestParams(); + params.put("uri", targetedId); + break; case UNFOLLOW: action = String.format("/accounts/%s/unfollow", targetedId); break; diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountSearchWebAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountSearchWebAdapter.java index 74ea48428..d29923a48 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountSearchWebAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountSearchWebAdapter.java @@ -16,9 +16,11 @@ package fr.gouv.etalab.mastodon.drawers; import android.content.Context; import android.content.SharedPreferences; +import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; import android.support.design.widget.FloatingActionButton; +import android.support.v4.content.ContextCompat; import android.text.Html; import android.text.util.Linkify; import android.view.LayoutInflater; @@ -47,6 +49,8 @@ import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnPostActionInterface; import mastodon.etalab.gouv.fr.mastodon.R; +import static fr.gouv.etalab.mastodon.helper.Helper.changeDrawableColor; + /** * Created by Thomas on 22/08/2017. @@ -106,7 +110,7 @@ public class AccountSearchWebAdapter extends BaseAdapter implements OnPostAction holder = new ViewHolder(); holder.account_pp = (ImageView) convertView.findViewById(R.id.account_pp); holder.account_dn = (TextView) convertView.findViewById(R.id.account_dn); - + holder.account_un = (TextView) convertView.findViewById(R.id.account_un); holder.account_ds = (TextView) convertView.findViewById(R.id.account_ds); holder.account_sc = (TextView) convertView.findViewById(R.id.account_sc); holder.account_fgc = (TextView) convertView.findViewById(R.id.account_fgc); @@ -116,18 +120,28 @@ public class AccountSearchWebAdapter extends BaseAdapter implements OnPostAction } else { holder = (ViewHolder) convertView.getTag(); } - - + //Redraws icon for locked accounts + final float scale = context.getResources().getDisplayMetrics().density; + if( account != null && account.isLocked()){ + Drawable img = ContextCompat.getDrawable(context, R.drawable.ic_action_lock_closed); + img.setBounds(0,0,(int) (20 * scale + 0.5f),(int) (20 * scale + 0.5f)); + holder.account_dn.setCompoundDrawables( null, null, img, null); + }else{ + holder.account_dn.setCompoundDrawables( null, null, null, null); + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { holder.account_ds.setText(Html.fromHtml(account.getNote(), Html.FROM_HTML_MODE_LEGACY)); holder.account_dn.setText(Html.fromHtml(Helper.shortnameToUnicode(account.getDisplay_name(), true), Html.FROM_HTML_MODE_LEGACY)); + holder.account_un.setText(Html.fromHtml(Helper.shortnameToUnicode(account.getUsername(), true), Html.FROM_HTML_MODE_LEGACY)); }else { //noinspection deprecation holder.account_ds.setText(Html.fromHtml(account.getNote())); holder.account_dn.setText(Html.fromHtml(Helper.shortnameToUnicode(account.getDisplay_name(), true))); + holder.account_un.setText(Html.fromHtml(Helper.shortnameToUnicode(account.getUsername(), true))); } + changeDrawableColor(context, R.drawable.ic_action_lock_closed,R.color.mastodonC4); holder.account_ds.setAutoLinkMask(Linkify.WEB_URLS); holder.account_sc.setText(String.valueOf(account.getStatuses_count())); holder.account_fgc.setText(String.valueOf(account.getFollowing_count())); @@ -139,7 +153,7 @@ public class AccountSearchWebAdapter extends BaseAdapter implements OnPostAction @Override public void onClick(View v) { holder.account_follow.setEnabled(false); - new PostActionAsyncTask(context, API.StatusAction.REMOTE_FOLLOW, null, AccountSearchWebAdapter.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new PostActionAsyncTask(context, API.StatusAction.REMOTE_FOLLOW, account.getAcct(), AccountSearchWebAdapter.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); @@ -164,6 +178,7 @@ public class AccountSearchWebAdapter extends BaseAdapter implements OnPostAction private class ViewHolder { ImageView account_pp; TextView account_dn; + TextView account_un; TextView account_ds; TextView account_sc; TextView account_fgc; diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveRemoteAccountInterface.java b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveRemoteAccountInterface.java index 202a03616..4d984933e 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveRemoteAccountInterface.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveRemoteAccountInterface.java @@ -20,5 +20,5 @@ package fr.gouv.etalab.mastodon.interfaces; * Interface for retrieving a remote account */ public interface OnRetrieveRemoteAccountInterface { - void onRetrieveRemoteAccount(boolean error, String name, String avatar, String bio, int statusCount, int followingCount, int followersCount); + void onRetrieveRemoteAccount(boolean error, String name, String username, boolean locked, String avatar, String bio, int statusCount, int followingCount, int followersCount); } diff --git a/app/src/main/res/layout/drawer_account_search_html.xml b/app/src/main/res/layout/drawer_account_search_html.xml index 3e5338a93..f6c39682c 100644 --- a/app/src/main/res/layout/drawer_account_search_html.xml +++ b/app/src/main/res/layout/drawer_account_search_html.xml @@ -39,21 +39,38 @@ - + android:orientation="vertical"> + + + +