Prepare frontend 5 - Animations with cross-account actions

This commit is contained in:
stom79 2019-01-15 14:43:56 +01:00
parent 5c2708abef
commit 907bbfe335
6 changed files with 184 additions and 49 deletions

View File

@ -109,14 +109,13 @@ public class PostActionAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
if(MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON) {
if(MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) {
//Remote action
API api;
if (account != null)
api = new API(contextReference.get(), account.getInstance(), account.getToken());
else
api = new API(contextReference.get());
if (remoteStatus != null) {
String uri;
if (remoteStatus.getReblog() != null) {

View File

@ -30,6 +30,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
@ -41,6 +42,7 @@ import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target;
import com.varunest.sparkbutton.SparkButton;
import java.util.ArrayList;
import java.util.List;
@ -51,6 +53,7 @@ import fr.gouv.etalab.mastodon.activities.MainActivity;
import fr.gouv.etalab.mastodon.activities.MediaActivity;
import fr.gouv.etalab.mastodon.activities.ShowAccountActivity;
import fr.gouv.etalab.mastodon.activities.ShowConversationActivity;
import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask;
import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoAsyncTask;
import fr.gouv.etalab.mastodon.client.API;
import fr.gouv.etalab.mastodon.client.APIResponse;
@ -84,12 +87,13 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA
private final int HIDDEN_STATUS = 0;
private static final int DISPLAYED_STATUS = 1;
private List<String> timedMute;
private RetrieveFeedsAsyncTask.Type type;
public PixelfedListAdapter(Context context, List<Status> statuses){
public PixelfedListAdapter(Context context, RetrieveFeedsAsyncTask.Type type, List<Status> statuses){
super();
this.context = context;
this.statuses = statuses;
this.type = type;
layoutInflater = LayoutInflater.from(this.context);
pixelfedListAdapter = this;
}
@ -139,9 +143,11 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA
private class ViewHolderPixelfed extends RecyclerView.ViewHolder{
ImageView art_media, pf_pp, pf_fav, pf_comment, pf_share;
ImageView art_media, pf_pp, pf_comment, pf_share;
SparkButton pf_fav;
TextView pf_username, pf_likes, pf_description, pf_date;
CardView pf_cardview;
LinearLayout pf_bottom_container;
ViewHolderPixelfed(View itemView) {
super(itemView);
art_media = itemView.findViewById(R.id.art_media);
@ -154,6 +160,7 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA
pf_comment = itemView.findViewById(R.id.pf_comment);
pf_share = itemView.findViewById(R.id.pf_share);
pf_cardview = itemView.findViewById(R.id.pf_cardview);
pf_bottom_container = itemView.findViewById(R.id.pf_bottom_container);
}
}
@ -259,7 +266,7 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA
});
holder.pf_description.setText(status.getContentSpan(), TextView.BufferType.SPANNABLE);
holder.pf_date.setText(Helper.dateToString(status.getCreated_at()));
holder.pf_description.setOnClickListener(new View.OnClickListener() {
holder.pf_comment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) {
@ -274,28 +281,69 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA
}
});
if (status.getDisplayNameSpan() != null && status.getDisplayNameSpan().toString().trim().length() > 0)
holder.pf_username.setText(status.getDisplayNameSpan(), TextView.BufferType.SPANNABLE);
else
holder.pf_username.setText(status.getAccount().getUsername());
int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
if (theme == Helper.THEME_BLACK) {
changeDrawableColor(context, holder.pf_fav, R.color.action_black);
holder.pf_fav.setInActiveImageTint(R.color.action_black);
changeDrawableColor(context, R.drawable.ic_pixelfed_favorite_border, R.color.action_black);
changeDrawableColor(context, holder.pf_comment, R.color.action_black);
changeDrawableColor(context, holder.pf_share, R.color.action_black);
holder.pf_cardview.setCardBackgroundColor(ContextCompat.getColor(context, R.color.black_3));
} else if (theme == Helper.THEME_DARK) {
changeDrawableColor(context, holder.pf_fav, R.color.action_dark);
holder.pf_fav.setInActiveImageTint(R.color.action_dark);
changeDrawableColor(context, holder.pf_comment, R.color.action_dark);
changeDrawableColor(context, R.drawable.ic_pixelfed_favorite_border, R.color.action_dark);
changeDrawableColor(context, holder.pf_share, R.color.action_dark);
holder.pf_cardview.setCardBackgroundColor(ContextCompat.getColor(context, R.color.mastodonC1_));
} else {
changeDrawableColor(context, holder.pf_fav, R.color.action_light);
holder.pf_fav.setInActiveImageTint(R.color.action_light);
changeDrawableColor(context, holder.pf_comment, R.color.action_light);
changeDrawableColor(context, R.drawable.ic_pixelfed_favorite_border, R.color.action_light);
changeDrawableColor(context, holder.pf_share, R.color.action_light);
holder.pf_cardview.setCardBackgroundColor(ContextCompat.getColor(context, R.color.white));
}
holder.pf_fav.pressOnTouch(false);
holder.pf_fav.setActiveImage(R.drawable.ic_pixelfed_favorite);
holder.pf_fav.setInactiveImage(R.drawable.ic_pixelfed_favorite_border);
holder.pf_fav.setDisableCircle(true);
holder.pf_fav.setActiveImageTint(R.color.pixelfed_like);
holder.pf_fav.setColors(R.color.pixelfed_like, R.color.pixelfed_like);
if (!status.isFavAnimated()) {
if (status.isFavourited() || (status.getReblog() != null && status.getReblog().isFavourited())) {
holder.pf_fav.setChecked(true);
} else {
holder.pf_fav.setChecked(false);
}
} else {
status.setFavAnimated(false);
holder.pf_fav.setChecked(true);
holder.pf_fav.setAnimationSpeed(1.0f);
holder.pf_fav.playAnimation();
}
boolean confirmFav = sharedpreferences.getBoolean(Helper.SET_NOTIF_VALIDATION_FAV, false);
holder.pf_fav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!status.isFavourited() && confirmFav)
status.setFavAnimated(true);
if (!status.isFavourited() && !confirmFav) {
status.setFavAnimated(true);
notifyStatusChanged(status);
}
CrossActions.doCrossAction(context, type, status, null, (status.isFavourited() || (status.getReblog() != null && status.getReblog().isFavourited())) ? API.StatusAction.UNFAVOURITE : API.StatusAction.FAVOURITE, pixelfedListAdapter, PixelfedListAdapter.this, true);
}
});
}
}

View File

@ -32,7 +32,6 @@ import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -215,7 +214,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn
}else if( instanceType.equals("PIXELFED")){
if( remoteInstance != null && MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) //if it's a Peertube account connected
remoteInstance = account.getInstance();
pixelfedListAdapter = new PixelfedListAdapter(context, this.statuses);
pixelfedListAdapter = new PixelfedListAdapter(context, type, this.statuses);
lv_status.setAdapter(pixelfedListAdapter);
}else if( instanceType.equals("ART")){
artListAdapter = new ArtListAdapter(context, this.statuses);
@ -528,7 +527,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn
artListAdapter.notifyItemRangeInserted(previousPosition, statuses.size());
}
}else if(instanceType.equals("PIXELFED") ) {
Log.v(Helper.TAG,"statuses: " + statuses.size());
this.statuses.addAll(statuses);
pixelfedListAdapter.notifyItemRangeInserted(previousPosition, statuses.size());
}

View File

@ -46,6 +46,7 @@ import fr.gouv.etalab.mastodon.client.Entities.Mention;
import fr.gouv.etalab.mastodon.client.Entities.Results;
import fr.gouv.etalab.mastodon.client.Entities.Status;
import fr.gouv.etalab.mastodon.drawers.AccountsSearchAdapter;
import fr.gouv.etalab.mastodon.drawers.PixelfedListAdapter;
import fr.gouv.etalab.mastodon.drawers.StatusListAdapter;
import fr.gouv.etalab.mastodon.interfaces.OnPostActionInterface;
import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
@ -142,22 +143,48 @@ public class CrossActions {
SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
Account currentAccount = new AccountDAO(context, db).getAccountByID(userId);
if (confirmation)
displayConfirmationDialogCrossAction(context, currentAccount, doAction, status, onPostActionInterface);
displayConfirmationDialogCrossAction(context, currentAccount, doAction, status, onPostActionInterface, baseAdapter);
else
new PostActionAsyncTask(context, currentAccount, status, doAction, onPostActionInterface).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else if (accounts.size() == 1 || undoAction) {
if (confirmation)
displayConfirmationDialog(context, doAction, status, baseAdapter, onPostActionInterface);
else {
if (doAction == API.StatusAction.REBLOG || doAction == API.StatusAction.UNREBLOG)
reblogAction(context, status, baseAdapter, onPostActionInterface);
reblogAction(context, status, onPostActionInterface);
else if (doAction == API.StatusAction.FAVOURITE || doAction == API.StatusAction.UNFAVOURITE)
favouriteAction(context, status, baseAdapter, onPostActionInterface);
favouriteAction(context, status, onPostActionInterface);
else if (doAction == API.StatusAction.PIN || doAction == API.StatusAction.UNPIN)
pinAction(context, status, baseAdapter, onPostActionInterface);
if( doAction == API.StatusAction.FAVOURITE || doAction == API.StatusAction.UNFAVOURITE){
if (doAction == API.StatusAction.FAVOURITE) {
status.setFavourited(true);
status.setFavAnimated(true);
}else{
status.setFavourited(false);
status.setFavAnimated(false);
}
if(baseAdapter instanceof PixelfedListAdapter)
((PixelfedListAdapter) baseAdapter).notifyStatusChanged(status);
else if(baseAdapter instanceof StatusListAdapter)
((StatusListAdapter) baseAdapter).notifyStatusChanged(status);
}else if(doAction == API.StatusAction.REBLOG || doAction == API.StatusAction.UNREBLOG){
if (doAction == API.StatusAction.REBLOG) {
status.setReblogged(true);
status.setBoostAnimated(true);
}else{
status.setReblogged(false);
status.setBoostAnimated(false);
}
if(baseAdapter instanceof PixelfedListAdapter)
((PixelfedListAdapter) baseAdapter).notifyStatusChanged(status);
else if(baseAdapter instanceof StatusListAdapter)
((StatusListAdapter) baseAdapter).notifyStatusChanged(status);
}
}
} else {
AlertDialog.Builder builderSingle = new AlertDialog.Builder(context, style);
builderSingle.setTitle(context.getString(R.string.choose_accounts));
final AccountsSearchAdapter accountsSearchAdapter = new AccountsSearchAdapter(context, accounts, true);
@ -702,11 +729,37 @@ public class CrossActions {
@Override
public void onClick(DialogInterface dialog, int which) {
if( action == API.StatusAction.REBLOG || action == API.StatusAction.UNREBLOG)
reblogAction(context, status, baseAdapter, onPostActionInterface);
reblogAction(context, status, onPostActionInterface);
else if( action == API.StatusAction.FAVOURITE || action == API.StatusAction.UNFAVOURITE)
favouriteAction(context, status, baseAdapter, onPostActionInterface);
favouriteAction(context, status, onPostActionInterface);
else if ( action == API.StatusAction.PIN || action == API.StatusAction.UNPIN)
pinAction(context, status, baseAdapter, onPostActionInterface);
if( action == API.StatusAction.FAVOURITE || action == API.StatusAction.UNFAVOURITE){
if (action == API.StatusAction.FAVOURITE) {
status.setFavourited(true);
status.setFavAnimated(true);
}else{
status.setFavourited(false);
status.setFavAnimated(false);
}
if(baseAdapter instanceof PixelfedListAdapter)
((PixelfedListAdapter) baseAdapter).notifyStatusChanged(status);
else if(baseAdapter instanceof StatusListAdapter)
((StatusListAdapter) baseAdapter).notifyStatusChanged(status);
}else if(action == API.StatusAction.REBLOG || action == API.StatusAction.UNREBLOG){
if (action == API.StatusAction.REBLOG) {
status.setReblogged(true);
status.setBoostAnimated(true);
}else{
status.setReblogged(false);
status.setBoostAnimated(false);
}
if(baseAdapter instanceof PixelfedListAdapter)
((PixelfedListAdapter) baseAdapter).notifyStatusChanged(status);
else if(baseAdapter instanceof StatusListAdapter)
((StatusListAdapter) baseAdapter).notifyStatusChanged(status);
}
dialog.dismiss();
}
})
@ -727,7 +780,7 @@ public class CrossActions {
* @param action int
* @param status Status
*/
private static void displayConfirmationDialogCrossAction(final Context context,Account currentAccount, final API.StatusAction action, final Status status, final OnPostActionInterface onPostActionInterface){
private static void displayConfirmationDialogCrossAction(final Context context,Account currentAccount, final API.StatusAction action, final Status status, final OnPostActionInterface onPostActionInterface, final RecyclerView.Adapter baseAdapter){
String title = null;
if( action == API.StatusAction.FAVOURITE){
@ -756,6 +809,31 @@ public class CrossActions {
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if( action == API.StatusAction.FAVOURITE || action == API.StatusAction.UNFAVOURITE){
if (action == API.StatusAction.FAVOURITE) {
status.setFavourited(true);
status.setFavAnimated(true);
}else{
status.setFavourited(false);
status.setFavAnimated(false);
}
if(baseAdapter instanceof PixelfedListAdapter)
((PixelfedListAdapter) baseAdapter).notifyStatusChanged(status);
else if(baseAdapter instanceof StatusListAdapter)
((StatusListAdapter) baseAdapter).notifyStatusChanged(status);
}else if(action == API.StatusAction.REBLOG || action == API.StatusAction.UNREBLOG){
if (action == API.StatusAction.REBLOG) {
status.setReblogged(true);
status.setBoostAnimated(true);
}else{
status.setReblogged(false);
status.setBoostAnimated(false);
}
if(baseAdapter instanceof PixelfedListAdapter)
((PixelfedListAdapter) baseAdapter).notifyStatusChanged(status);
else if(baseAdapter instanceof StatusListAdapter)
((StatusListAdapter) baseAdapter).notifyStatusChanged(status);
}
new PostActionAsyncTask(context, currentAccount, status, action, onPostActionInterface).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
dialog.dismiss();
}
@ -789,7 +867,8 @@ public class CrossActions {
* Favourites/Unfavourites a status
* @param status Status
*/
private static void favouriteAction(Context context, Status status, RecyclerView.Adapter baseAdapter, OnPostActionInterface onPostActionInterface){
private static void favouriteAction(Context context, Status status,OnPostActionInterface onPostActionInterface){
if( status.isFavourited() || (status.getReblog() != null && status.getReblog().isFavourited())){
new PostActionAsyncTask(context, API.StatusAction.UNFAVOURITE, status.getId(), onPostActionInterface).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
status.setFavourited(false);
@ -797,14 +876,13 @@ public class CrossActions {
new PostActionAsyncTask(context, API.StatusAction.FAVOURITE, status.getId(), onPostActionInterface).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
status.setFavourited(true);
}
baseAdapter.notifyDataSetChanged();
}
/**
* Reblog/Unreblog a status
* @param status Status
*/
private static void reblogAction(Context context, Status status, RecyclerView.Adapter baseAdapter, OnPostActionInterface onPostActionInterface){
private static void reblogAction(Context context, Status status, OnPostActionInterface onPostActionInterface){
if( status.isReblogged() || (status.getReblog()!= null && status.getReblog().isReblogged())){
String statusId = status.getReblog()!=null?status.getReblog().getId():status.getId();
new PostActionAsyncTask(context, API.StatusAction.UNREBLOG, statusId, onPostActionInterface).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
@ -813,7 +891,6 @@ public class CrossActions {
new PostActionAsyncTask(context, API.StatusAction.REBLOG, status.getId(), onPostActionInterface).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
status.setReblogged(true);
}
baseAdapter.notifyDataSetChanged();
}
/**

View File

@ -15,9 +15,9 @@
You should have received a copy of the GNU General Public License along with Mastalab; if not,
see <http://www.gnu.org/licenses>.
-->
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/pf_cardview"
android:layout_marginBottom="20dp"
android:layout_height="wrap_content">
@ -70,47 +70,58 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
<com.varunest.sparkbutton.SparkButton
android:id="@+id/pf_fav"
android:contentDescription="@string/add_image_to_favorite"
android:src="@drawable/ic_pixelfed_favorite_border"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_width="30dp"
android:layout_height="30dp"
app:sparkbutton_activeImage="@drawable/ic_pixelfed_favorite"
app:sparkbutton_inActiveImage="@drawable/ic_pixelfed_favorite_border"
android:contentDescription="@string/favourite"
app:sparkbutton_iconSize="30dp"
/>
<ImageView
android:layout_marginStart="15dp"
android:layout_marginLeft="15dp"
android:id="@+id/pf_comment"
android:contentDescription="@string/leave_a_comment"
android:src="@drawable/ic_pixelfed_comment"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_width="30dp"
android:layout_height="30dp" />
<ImageView
android:layout_marginStart="15dp"
android:layout_marginLeft="15dp"
android:id="@+id/pf_share"
android:contentDescription="@string/share_with"
android:src="@drawable/ic_menu_share"
android:layout_width="30dp"
android:layout_height="30dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/pf_bottom_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_marginTop="5dp"
android:textStyle="bold"
android:id="@+id/pf_likes"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginTop="5dp"
android:id="@+id/pf_description"
android:textIsSelectable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginTop="5dp"
android:id="@+id/pf_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<TextView
android:layout_marginTop="5dp"
android:textStyle="bold"
android:id="@+id/pf_likes"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginTop="5dp"
android:id="@+id/pf_description"
android:textIsSelectable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginTop="5dp"
android:id="@+id/pf_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>

View File

@ -114,4 +114,6 @@
<color name="peertube_orange">#F1680D</color>
<color name="unfollow">#c52404</color>
<color name="pixelfed_like">#dc3545</color>
</resources>