diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java index b3f4825c7..3395b6e29 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java @@ -168,6 +168,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc private String initialContent; private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 754; private BroadcastReceiver receive_picture; + private Account accountReply; @Override protected void onCreate(Bundle savedInstanceState) { @@ -259,6 +260,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc restored = -1; if(b != null) { tootReply = b.getParcelable("tootReply"); + accountReply = b.getParcelable("accountReply"); tootMention = b.getString("tootMention", null); urlMention = b.getString("urlMention", null); fileMention = b.getString("fileMention", null); @@ -297,7 +299,12 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc setTitle(R.string.toot_title); } SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + String userId; + if( accountReply == null) + userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + else + userId = accountReply.getId(); + if( tootMention != null && urlMention != null && fileMention != null) { Bitmap pictureMention = BitmapFactory.decodeFile(getCacheDir() + "/" + fileMention); if (pictureMention != null) { @@ -314,8 +321,12 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc toot_content.setText(String.format("\n\nvia @%s\n\n%s\n\n", tootMention, urlMention)); toot_space_left.setText(String.valueOf(toot_content.length())); } + Account account; + if( accountReply == null) + account = new AccountDAO(getApplicationContext(),db).getAccountByID(userId); + else + account = accountReply; - Account account = new AccountDAO(getApplicationContext(),db).getAccountByID(userId); String url = account.getAvatar(); if( url.startsWith("/") ){ url = "https://" + Helper.getLiveInstance(getApplicationContext()) + account.getAvatar(); @@ -484,8 +495,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc if( tootReply != null) toot.setIn_reply_to_id(tootReply.getId()); toot.setContent(toot_content.getText().toString().trim()); - - new PostStatusAsyncTask(getApplicationContext(), toot, TootActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new PostStatusAsyncTask(getApplicationContext(), accountReply, toot, TootActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); @@ -1310,7 +1320,11 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc title.setText(getString(R.string.toot_title_reply)); else setTitle(R.string.toot_title_reply); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + String userId; + if( accountReply == null) + userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + else + userId = accountReply.getId(); switch (tootReply.getVisibility()){ case "public": diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/PostStatusAsyncTask.java b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/PostStatusAsyncTask.java index e7d333861..b8f20d848 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/PostStatusAsyncTask.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/asynctasks/PostStatusAsyncTask.java @@ -16,9 +16,12 @@ package fr.gouv.etalab.mastodon.asynctasks; import android.content.Context; import android.os.AsyncTask; +import android.util.Log; import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.APIResponse; +import fr.gouv.etalab.mastodon.client.Entities.Account; +import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnPostStatusActionInterface; @@ -33,16 +36,22 @@ public class PostStatusAsyncTask extends AsyncTask { private OnPostStatusActionInterface listener; private APIResponse apiResponse; private fr.gouv.etalab.mastodon.client.Entities.Status status; + private Account account; - public PostStatusAsyncTask(Context context, fr.gouv.etalab.mastodon.client.Entities.Status status, OnPostStatusActionInterface onPostStatusActionInterface){ + public PostStatusAsyncTask(Context context, Account account, fr.gouv.etalab.mastodon.client.Entities.Status status, OnPostStatusActionInterface onPostStatusActionInterface){ this.context = context; this.listener = onPostStatusActionInterface; this.status = status; + this.account = account; } @Override protected Void doInBackground(Void... params) { - apiResponse = new API(context).postStatusAction(status); + if( account == null) + apiResponse = new API(context).postStatusAction(status); + else + apiResponse = new API(context, account.getInstance(), account.getToken()).postStatusAction(status); + return null; } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java index ed49a0e63..ba900ef05 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java @@ -16,6 +16,8 @@ package fr.gouv.etalab.mastodon.drawers; import android.content.Context; +import android.content.SharedPreferences; +import android.database.sqlite.SQLiteDatabase; import android.support.annotation.NonNull;; import android.view.LayoutInflater; import android.view.View; @@ -35,6 +37,8 @@ import java.util.ArrayList; import java.util.List; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.helper.Helper; +import fr.gouv.etalab.mastodon.sqlite.AccountDAO; +import fr.gouv.etalab.mastodon.sqlite.Sqlite; import mastodon.etalab.gouv.fr.mastodon.R; @@ -49,10 +53,12 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt private ImageLoader imageLoader; private DisplayImageOptions options; private boolean owner; + private Context context; public AccountsSearchAdapter(Context context, List accounts){ super(context, android.R.layout.simple_list_item_1, accounts); this.accounts = accounts; + this.context = context; this.tempAccounts = new ArrayList<>(accounts); this.suggestions = new ArrayList<>(accounts); layoutInflater = LayoutInflater.from(context); @@ -65,6 +71,7 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt public AccountsSearchAdapter(Context context, List accounts, boolean owner){ super(context, android.R.layout.simple_list_item_1, accounts); this.accounts = accounts; + this.context = context; this.tempAccounts = new ArrayList<>(accounts); this.suggestions = new ArrayList<>(accounts); layoutInflater = LayoutInflater.from(context); @@ -110,7 +117,12 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt } if( owner) { - holder.account_un.setText(String.format("@%s", account.getUsername() + "@" + account.getInstance())); + final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + Account currentAccount = new AccountDAO(context, db).getAccountByID(userId); + String instance = (account.getInstance() !=null)?account.getInstance():currentAccount.getInstance(); + holder.account_un.setText(String.format("@%s", account.getUsername() + "@" + instance)); holder.account_dn.setVisibility(View.GONE); }else { holder.account_un.setText(String.format("@%s", account.getUsername())); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java index 4972c8b54..d207cf5d8 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java @@ -741,7 +741,8 @@ public class NotificationsListAdapter extends BaseAdapter implements OnPostActio }else if( statusAction == API.StatusAction.UNREBLOG){ for(Notification notification: notifications){ if( notification.getStatus().getId().equals(targetedId)) { - notification.getStatus().setReblogs_count(notification.getStatus().getReblogs_count() - 1); + if( notification.getStatus().getReblogs_count() - 1 >= 0 ) + notification.getStatus().setReblogs_count(notification.getStatus().getReblogs_count() - 1); break; } } @@ -757,7 +758,8 @@ public class NotificationsListAdapter extends BaseAdapter implements OnPostActio }else if( statusAction == API.StatusAction.UNFAVOURITE){ for(Notification notification: notifications){ if( notification.getStatus().getId().equals(targetedId)) { - notification.getStatus().setFavourites_count(notification.getStatus().getFavourites_count() - 1); + if( notification.getStatus().getFavourites_count() - 1 >= 0 ) + notification.getStatus().setFavourites_count(notification.getStatus().getFavourites_count() - 1); break; } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index 57446b71d..ced07b62b 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -681,21 +681,7 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf holder.status_reply.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent intent = new Intent(context, TootActivity.class); - Bundle b = new Bundle(); - if( status.getReblog() != null ) - b.putParcelable("tootReply", status.getReblog()); - else - b.putParcelable("tootReply", status); - intent.putExtras(b); //Put your id to your next Intent - context.startActivity(intent); - if( type == RetrieveFeedsAsyncTask.Type.CONTEXT ){ - try { - //Avoid to open multi activities when replying in a conversation - ((ShowConversationActivity)context).finish(); - }catch (Exception ignored){} - - } + CrossActions.doCrossReply(context, status, type); } }); @@ -1207,7 +1193,8 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf }else if( statusAction == API.StatusAction.UNREBLOG){ for(Status status: statuses){ if( status.getId().equals(targetedId)) { - status.setReblogs_count(status.getReblogs_count() - 1); + if( status.getReblogs_count() - 1 >= 0) + status.setReblogs_count(status.getReblogs_count() - 1); break; } } @@ -1223,7 +1210,8 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf }else if( statusAction == API.StatusAction.UNFAVOURITE){ for(Status status: statuses){ if( status.getId().equals(targetedId)) { - status.setFavourites_count(status.getFavourites_count() - 1); + if( status.getFavourites_count() - 1 >= 0) + status.setFavourites_count(status.getFavourites_count() - 1); break; } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/helper/CrossActions.java b/app/src/main/java/fr/gouv/etalab/mastodon/helper/CrossActions.java index fc18e6ea6..6b6d6bd8d 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/helper/CrossActions.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/helper/CrossActions.java @@ -17,18 +17,26 @@ package fr.gouv.etalab.mastodon.helper; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Build; +import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.text.Html; +import android.util.Log; import android.widget.BaseAdapter; import java.util.ArrayList; import java.util.List; + +import fr.gouv.etalab.mastodon.activities.ShowConversationActivity; +import fr.gouv.etalab.mastodon.activities.TootActivity; import fr.gouv.etalab.mastodon.asynctasks.PostActionAsyncTask; +import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask; import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.Entities.Account; +import fr.gouv.etalab.mastodon.client.Entities.Mention; import fr.gouv.etalab.mastodon.client.Entities.Status; import fr.gouv.etalab.mastodon.drawers.AccountsSearchAdapter; import fr.gouv.etalab.mastodon.interfaces.OnPostActionInterface; @@ -42,7 +50,7 @@ import mastodon.etalab.gouv.fr.mastodon.R; public class CrossActions { public static void doCrossAction(final Context context, final Status status, final API.StatusAction doAction, final BaseAdapter baseAdapter, final OnPostActionInterface onPostActionInterface){ - List accounts = connectedAccounts(context); + List accounts = connectedAccounts(context, null); final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); boolean undoAction = (doAction == API.StatusAction.UNPIN || doAction == API.StatusAction.UNREBLOG || doAction == API.StatusAction.UNFAVOURITE ); @@ -104,6 +112,67 @@ public class CrossActions { } } + public static void doCrossReply(final Context context, final Status status, final RetrieveFeedsAsyncTask.Type type){ + List accounts = connectedAccounts(context, status); + + if( accounts.size() == 1) { + Intent intent = new Intent(context, TootActivity.class); + Bundle b = new Bundle(); + if( status.getReblog() != null ) + b.putParcelable("tootReply", status.getReblog()); + else + b.putParcelable("tootReply", status); + intent.putExtras(b); //Put your id to your next Intent + context.startActivity(intent); + if( type == RetrieveFeedsAsyncTask.Type.CONTEXT ){ + try { + //Avoid to open multi activities when replying in a conversation + ((ShowConversationActivity)context).finish(); + }catch (Exception ignored){} + + } + }else { + AlertDialog.Builder builderSingle = new AlertDialog.Builder(context); + builderSingle.setTitle(context.getString(R.string.choose_accounts)); + final AccountsSearchAdapter accountsSearchAdapter = new AccountsSearchAdapter(context, accounts, true); + final Account[] accountArray = new Account[accounts.size()]; + int i = 0; + for(Account account: accounts){ + accountArray[i] = account; + i++; + } + builderSingle.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builderSingle.setAdapter(accountsSearchAdapter, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Account account = accountArray[which]; + Intent intent = new Intent(context, TootActivity.class); + Bundle b = new Bundle(); + if( status.getReblog() != null ) + b.putParcelable("tootReply", status.getReblog()); + else + b.putParcelable("tootReply", status); + b.putParcelable("accountReply", account); + intent.putExtras(b); //Put your id to your next Intent + context.startActivity(intent); + if( type == RetrieveFeedsAsyncTask.Type.CONTEXT ){ + try { + //Avoid to open multi activities when replying in a conversation + ((ShowConversationActivity)context).finish(); + }catch (Exception ignored){} + + } + dialog.dismiss(); + } + }); + builderSingle.show(); + } + } /** @@ -215,15 +284,48 @@ public class CrossActions { * @param context Context * @return List */ - private static List connectedAccounts(Context context){ + private static List connectedAccounts(Context context, Status status){ final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - List accounts = new AccountDAO(context, db).getAllAccount(); - if( sharedpreferences.getBoolean(Helper.SET_ALLOW_CROSS_ACTIONS, true) && accounts.size() > 1 ){ + List accountstmp = new AccountDAO(context, db).getAllAccount(); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + Account currentAccount = new AccountDAO(context, db).getAccountByID(userId); + List accounts = new ArrayList<>(); + if( sharedpreferences.getBoolean(Helper.SET_ALLOW_CROSS_ACTIONS, true) && accountstmp.size() > 1 ){ + //It's for a reply + if( status != null){ + //Status is private or direct + if( status.getVisibility().equals("private") || status.getVisibility().equals("direct") ){ + //Retrieves mentioned accounts and compares them to the list of accounts in the device. + List mentions = status.getMentions(); + List addedAccount = new ArrayList<>(); + //Adds the owner + accounts.add(currentAccount); + addedAccount.add(currentAccount.getId() + "|" + currentAccount.getAcct()); + for(Mention mention: mentions){ + for(Account account: accountstmp){ + String mentionAcct = (mention.getAcct().contains("@"))?mention.getAcct():mention.getAcct()+"@"+currentAccount.getInstance(); + if( (account.getAcct() + "@" + account.getInstance()).equals(mentionAcct) && !addedAccount.contains(account.getId() + "|" + account.getAcct())) { + accounts.add(account); + } + } + } + for(Account account: accountstmp){ + Account tootOwner = status.getAccount(); + String mentionAcct = (tootOwner.getAcct().contains("@"))?tootOwner.getAcct():tootOwner.getAcct()+"@"+currentAccount.getInstance(); + if( (account.getAcct() + "@" + account.getInstance()).equals(mentionAcct) && !addedAccount.contains(account.getId() + "|" + account.getAcct())) { + accounts.add(account); + } + } + }else { + accounts = accountstmp; + } + }else { + accounts = accountstmp; + } return accounts; }else { List oneAccount = new ArrayList<>(); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); Account account = new AccountDAO(context, db).getAccountByID(userId); oneAccount.add(account); return oneAccount;