Merge branch 'improve_muted' into develop
This commit is contained in:
commit
bddb07e59a
|
@ -43,6 +43,7 @@ public class PostActionAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||||
private Account account;
|
private Account account;
|
||||||
private fr.gouv.etalab.mastodon.client.Entities.Status remoteStatus;
|
private fr.gouv.etalab.mastodon.client.Entities.Status remoteStatus;
|
||||||
private WeakReference<Context> contextReference;
|
private WeakReference<Context> contextReference;
|
||||||
|
private boolean muteNotifications;
|
||||||
|
|
||||||
public PostActionAsyncTask(Context context, API.StatusAction apiAction, String targetedId, OnPostActionInterface onPostActionInterface){
|
public PostActionAsyncTask(Context context, API.StatusAction apiAction, String targetedId, OnPostActionInterface onPostActionInterface){
|
||||||
this.contextReference = new WeakReference<>(context);
|
this.contextReference = new WeakReference<>(context);
|
||||||
|
@ -75,6 +76,13 @@ public class PostActionAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||||
this.comment = comment;
|
this.comment = comment;
|
||||||
this.status = status;
|
this.status = status;
|
||||||
}
|
}
|
||||||
|
public PostActionAsyncTask(Context context, API.StatusAction apiAction, String targetedId, boolean muteNotifications, OnPostActionInterface onPostActionInterface){
|
||||||
|
this.contextReference = new WeakReference<>(context);
|
||||||
|
this.listener = onPostActionInterface;
|
||||||
|
this.apiAction = apiAction;
|
||||||
|
this.targetedId = targetedId;
|
||||||
|
this.muteNotifications = muteNotifications;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground(Void... params) {
|
protected Void doInBackground(Void... params) {
|
||||||
|
@ -100,6 +108,8 @@ public class PostActionAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||||
statusCode = api.reportAction(status, comment);
|
statusCode = api.reportAction(status, comment);
|
||||||
else if (apiAction == API.StatusAction.CREATESTATUS)
|
else if (apiAction == API.StatusAction.CREATESTATUS)
|
||||||
statusCode = api.statusAction(status);
|
statusCode = api.statusAction(status);
|
||||||
|
else if( apiAction == API.StatusAction.MUTE_NOTIFICATIONS)
|
||||||
|
statusCode = api.muteNotifications(targetedId, muteNotifications);
|
||||||
else
|
else
|
||||||
statusCode = api.postAction(apiAction, targetedId);
|
statusCode = api.postAction(apiAction, targetedId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ package fr.gouv.etalab.mastodon.client;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
@ -62,6 +63,7 @@ public class API {
|
||||||
REBLOG,
|
REBLOG,
|
||||||
UNREBLOG,
|
UNREBLOG,
|
||||||
MUTE,
|
MUTE,
|
||||||
|
MUTE_NOTIFICATIONS,
|
||||||
UNMUTE,
|
UNMUTE,
|
||||||
BLOCK,
|
BLOCK,
|
||||||
UNBLOCK,
|
UNBLOCK,
|
||||||
|
@ -731,6 +733,29 @@ public class API {
|
||||||
return postAction(statusAction, targetedId, null, null);
|
return postAction(statusAction, targetedId, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes the post action for a status
|
||||||
|
* @param targetedId String id of the targeted Id *can be this of a status or an account*
|
||||||
|
* @param muteNotifications - boolean - notifications should be also muted
|
||||||
|
* @return in status code - Should be equal to 200 when action is done
|
||||||
|
*/
|
||||||
|
public int muteNotifications(String targetedId, boolean muteNotifications){
|
||||||
|
|
||||||
|
HashMap<String, String> params = new HashMap<>();
|
||||||
|
params.put("notifications", Boolean.toString(muteNotifications));
|
||||||
|
try {
|
||||||
|
HttpsConnection httpsConnection = new HttpsConnection();
|
||||||
|
httpsConnection.post(getAbsoluteUrl(String.format("/accounts/%s/mute", targetedId)), 60, params, prefKeyOauthTokenT);
|
||||||
|
actionCode = httpsConnection.getActionCode();
|
||||||
|
} catch (HttpsConnection.HttpsConnectionException e) {
|
||||||
|
setError(e.getStatusCode(), e);
|
||||||
|
e.printStackTrace();
|
||||||
|
}catch (Exception e) {
|
||||||
|
setDefaultError();
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return actionCode;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes the post action
|
* Makes the post action
|
||||||
|
@ -1753,7 +1778,7 @@ public class API {
|
||||||
account.setNote(resobj.get("note").toString());
|
account.setNote(resobj.get("note").toString());
|
||||||
try{
|
try{
|
||||||
account.setMoved_to_account(parseAccountResponse(context, resobj.getJSONObject("moved")));
|
account.setMoved_to_account(parseAccountResponse(context, resobj.getJSONObject("moved")));
|
||||||
}catch (Exception ignored){ignored.printStackTrace();}
|
}catch (Exception ignored){account.setMoved_to_account(null);}
|
||||||
account.setUrl(resobj.get("url").toString());
|
account.setUrl(resobj.get("url").toString());
|
||||||
account.setAvatar(resobj.get("avatar").toString());
|
account.setAvatar(resobj.get("avatar").toString());
|
||||||
account.setAvatar_static(resobj.get("avatar_static").toString());
|
account.setAvatar_static(resobj.get("avatar_static").toString());
|
||||||
|
@ -1800,6 +1825,11 @@ public class API {
|
||||||
relationship.setFollowed_by(Boolean.valueOf(resobj.get("followed_by").toString()));
|
relationship.setFollowed_by(Boolean.valueOf(resobj.get("followed_by").toString()));
|
||||||
relationship.setBlocking(Boolean.valueOf(resobj.get("blocking").toString()));
|
relationship.setBlocking(Boolean.valueOf(resobj.get("blocking").toString()));
|
||||||
relationship.setMuting(Boolean.valueOf(resobj.get("muting").toString()));
|
relationship.setMuting(Boolean.valueOf(resobj.get("muting").toString()));
|
||||||
|
try {
|
||||||
|
relationship.setMuting_notifications(Boolean.valueOf(resobj.get("muting_notifications").toString()));
|
||||||
|
}catch (Exception ignored){
|
||||||
|
relationship.setMuting_notifications(true);
|
||||||
|
}
|
||||||
relationship.setRequested(Boolean.valueOf(resobj.get("requested").toString()));
|
relationship.setRequested(Boolean.valueOf(resobj.get("requested").toString()));
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
setDefaultError();
|
setDefaultError();
|
||||||
|
|
|
@ -61,7 +61,7 @@ public class Account implements Parcelable {
|
||||||
private followAction followType = followAction.NOTHING;
|
private followAction followType = followAction.NOTHING;
|
||||||
private boolean isMakingAction = false;
|
private boolean isMakingAction = false;
|
||||||
private Account moved_to_account;
|
private Account moved_to_account;
|
||||||
|
private boolean muting_notifications;
|
||||||
|
|
||||||
public followAction getFollowType() {
|
public followAction getFollowType() {
|
||||||
return followType;
|
return followType;
|
||||||
|
@ -87,6 +87,14 @@ public class Account implements Parcelable {
|
||||||
this.moved_to_account = moved_to_account;
|
this.moved_to_account = moved_to_account;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isMuting_notifications() {
|
||||||
|
return muting_notifications;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMuting_notifications(boolean muting_notifications) {
|
||||||
|
this.muting_notifications = muting_notifications;
|
||||||
|
}
|
||||||
|
|
||||||
public enum followAction{
|
public enum followAction{
|
||||||
FOLLOW,
|
FOLLOW,
|
||||||
NOT_FOLLOW,
|
NOT_FOLLOW,
|
||||||
|
|
|
@ -27,6 +27,7 @@ public class Relationship {
|
||||||
private boolean blocking;
|
private boolean blocking;
|
||||||
private boolean muting;
|
private boolean muting;
|
||||||
private boolean requested;
|
private boolean requested;
|
||||||
|
private boolean muting_notifications;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
|
@ -75,4 +76,12 @@ public class Relationship {
|
||||||
public void setRequested(boolean requested) {
|
public void setRequested(boolean requested) {
|
||||||
this.requested = requested;
|
this.requested = requested;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isMuting_notifications() {
|
||||||
|
return muting_notifications;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMuting_notifications(boolean muting_notifications) {
|
||||||
|
this.muting_notifications = muting_notifications;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import android.support.design.widget.FloatingActionButton;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.text.util.Linkify;
|
import android.text.util.Linkify;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
@ -114,10 +115,26 @@ public class AccountsListAdapter extends RecyclerView.Adapter implements OnPostA
|
||||||
holder.account_follow.setVisibility(View.VISIBLE);
|
holder.account_follow.setVisibility(View.VISIBLE);
|
||||||
holder.account_follow_request.setVisibility(View.GONE);
|
holder.account_follow_request.setVisibility(View.GONE);
|
||||||
}else if( account.getFollowType() == Account.followAction.MUTE){
|
}else if( account.getFollowType() == Account.followAction.MUTE){
|
||||||
holder.account_follow.setImageResource(R.drawable.ic_volume_mute);
|
|
||||||
|
if(account.isMuting_notifications())
|
||||||
|
holder.account_mute_notification.setImageResource(R.drawable.ic_notifications_active);
|
||||||
|
else
|
||||||
|
holder.account_mute_notification.setImageResource(R.drawable.ic_notifications_off);
|
||||||
|
|
||||||
|
holder.account_mute_notification.setVisibility(View.VISIBLE);
|
||||||
|
holder.account_follow.setImageResource(R.drawable.ic_volume_up);
|
||||||
doAction = API.StatusAction.UNMUTE;
|
doAction = API.StatusAction.UNMUTE;
|
||||||
holder.account_follow.setVisibility(View.VISIBLE);
|
holder.account_follow.setVisibility(View.VISIBLE);
|
||||||
holder.account_follow_request.setVisibility(View.GONE);
|
holder.account_follow_request.setVisibility(View.GONE);
|
||||||
|
final int positionFinal = position;
|
||||||
|
holder.account_mute_notification.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
account.setMuting_notifications(!account.isMuting_notifications());
|
||||||
|
new PostActionAsyncTask(context, API.StatusAction.MUTE_NOTIFICATIONS, account.getId(), account.isMuting_notifications(), AccountsListAdapter.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
|
accountsListAdapter.notifyItemChanged(positionFinal);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -237,7 +254,7 @@ public class AccountsListAdapter extends RecyclerView.Adapter implements OnPostA
|
||||||
TextView account_sc;
|
TextView account_sc;
|
||||||
TextView account_fgc;
|
TextView account_fgc;
|
||||||
TextView account_frc;
|
TextView account_frc;
|
||||||
FloatingActionButton account_follow;
|
FloatingActionButton account_follow, account_mute_notification;
|
||||||
TextView account_follow_request;
|
TextView account_follow_request;
|
||||||
LinearLayout account_container;
|
LinearLayout account_container;
|
||||||
|
|
||||||
|
@ -252,6 +269,7 @@ public class AccountsListAdapter extends RecyclerView.Adapter implements OnPostA
|
||||||
account_fgc = itemView.findViewById(R.id.account_fgc);
|
account_fgc = itemView.findViewById(R.id.account_fgc);
|
||||||
account_frc = itemView.findViewById(R.id.account_frc);
|
account_frc = itemView.findViewById(R.id.account_frc);
|
||||||
account_follow = itemView.findViewById(R.id.account_follow);
|
account_follow = itemView.findViewById(R.id.account_follow);
|
||||||
|
account_mute_notification = itemView.findViewById(R.id.account_mute_notification);
|
||||||
account_follow_request = itemView.findViewById(R.id.account_follow_request);
|
account_follow_request = itemView.findViewById(R.id.account_follow_request);
|
||||||
account_container = itemView.findViewById(R.id.account_container);
|
account_container = itemView.findViewById(R.id.account_container);
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,7 @@ public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccou
|
||||||
}
|
}
|
||||||
swipeRefreshLayout.setRefreshing(false);
|
swipeRefreshLayout.setRefreshing(false);
|
||||||
firstLoad = false;
|
firstLoad = false;
|
||||||
if( type != RetrieveAccountsAsyncTask.Type.BLOCKED && type != RetrieveAccountsAsyncTask.Type.MUTED)
|
if( type != RetrieveAccountsAsyncTask.Type.BLOCKED )
|
||||||
new RetrieveManyRelationshipsAsyncTask(context, accounts,DisplayAccountsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
new RetrieveManyRelationshipsAsyncTask(context, accounts,DisplayAccountsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,15 +225,16 @@ public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccou
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if( account.getId().equals(relationship.getId())){
|
if( account.getId().equals(relationship.getId())){
|
||||||
|
account.setMuting_notifications(relationship.isMuting_notifications());
|
||||||
if( relationship.isFollowing())
|
if( relationship.isFollowing())
|
||||||
account.setFollowType(Account.followAction.FOLLOW);
|
account.setFollowType(Account.followAction.FOLLOW);
|
||||||
else
|
else
|
||||||
account.setFollowType(Account.followAction.NOT_FOLLOW);
|
account.setFollowType(Account.followAction.NOT_FOLLOW);
|
||||||
if(relationship.isBlocking())
|
if(relationship.isBlocking())
|
||||||
account.setFollowType(Account.followAction.BLOCK);
|
account.setFollowType(Account.followAction.BLOCK);
|
||||||
else if(relationship.isMuting())
|
else if(relationship.isMuting()) {
|
||||||
account.setFollowType(Account.followAction.MUTE);
|
account.setFollowType(Account.followAction.MUTE);
|
||||||
else if(relationship.isRequested())
|
}else if(relationship.isRequested())
|
||||||
account.setFollowType(Account.followAction.REQUEST_SENT);
|
account.setFollowType(Account.followAction.REQUEST_SENT);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFFFF"
|
||||||
|
android:pathData="M7.58,4.08L6.15,2.65C3.75,4.48 2.17,7.3 2.03,10.5h2c0.15,-2.65 1.51,-4.97 3.55,-6.42zM19.97,10.5h2c-0.15,-3.2 -1.73,-6.02 -4.12,-7.85l-1.42,1.43c2.02,1.45 3.39,3.77 3.54,6.42zM18,11c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2v-5zM12,22c0.14,0 0.27,-0.01 0.4,-0.04 0.65,-0.14 1.18,-0.58 1.44,-1.18 0.1,-0.24 0.15,-0.5 0.15,-0.78h-4c0.01,1.1 0.9,2 2.01,2z"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFFFF"
|
||||||
|
android:pathData="M20,18.69L7.84,6.14 5.27,3.49 4,4.76l2.8,2.8v0.01c-0.52,0.99 -0.8,2.16 -0.8,3.42v5l-2,2v1h13.73l2,2L21,19.72l-1,-1.03zM12,22c1.11,0 2,-0.89 2,-2h-4c0,1.11 0.89,2 2,2zM18,14.68L18,11c0,-3.08 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68c-0.15,0.03 -0.29,0.08 -0.42,0.12 -0.1,0.03 -0.2,0.07 -0.3,0.11h-0.01c-0.01,0 -0.01,0 -0.02,0.01 -0.23,0.09 -0.46,0.2 -0.68,0.31 0,0 -0.01,0 -0.01,0.01L18,14.68z"/>
|
||||||
|
</vector>
|
|
@ -134,15 +134,32 @@
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
/>
|
/>
|
||||||
<android.support.design.widget.FloatingActionButton
|
<LinearLayout
|
||||||
android:id="@+id/account_follow"
|
android:layout_width="wrap_content"
|
||||||
android:visibility="gone"
|
android:layout_height="wrap_content"
|
||||||
app:fabSize="mini"
|
android:orientation="vertical">
|
||||||
android:layout_width="40dp"
|
<android.support.design.widget.FloatingActionButton
|
||||||
android:layout_height="40dp"
|
android:id="@+id/account_follow"
|
||||||
android:layout_margin="5dp"
|
android:visibility="gone"
|
||||||
android:scaleType="fitXY"
|
app:fabSize="mini"
|
||||||
android:layout_gravity="center"
|
android:layout_width="40dp"
|
||||||
android:gravity="center"
|
android:layout_height="40dp"
|
||||||
/>
|
android:layout_margin="5dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:gravity="center"
|
||||||
|
/>
|
||||||
|
<android.support.design.widget.FloatingActionButton
|
||||||
|
android:id="@+id/account_mute_notification"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:fabSize="mini"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_margin="5dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:gravity="center"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
Loading…
Reference in New Issue