Issue #903 - Display undo layout when moving elements

This commit is contained in:
tom79 2019-04-27 12:54:01 +02:00
parent 50e91b373c
commit 1e5e9e98d9
5 changed files with 105 additions and 10 deletions

View File

@ -42,6 +42,7 @@ import fr.gouv.etalab.mastodon.helper.Helper;
import fr.gouv.etalab.mastodon.helper.itemtouchhelper.ItemTouchHelperAdapter;
import fr.gouv.etalab.mastodon.helper.itemtouchhelper.ItemTouchHelperViewHolder;
import fr.gouv.etalab.mastodon.helper.itemtouchhelper.OnStartDragListener;
import fr.gouv.etalab.mastodon.helper.itemtouchhelper.OnUndoListener;
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
import fr.gouv.etalab.mastodon.sqlite.TimelinesDAO;
@ -59,12 +60,14 @@ public class ReorderTabAdapter extends RecyclerView.Adapter<ReorderTabAdapter.It
private List<ManageTimelines> mItems;
private final OnStartDragListener mDragStartListener;
private final OnUndoListener mUndoListener;
private Context context;
private SharedPreferences sharedpreferences;
public ReorderTabAdapter(Context context, List<ManageTimelines> manageTimelines, OnStartDragListener dragStartListener) {
public ReorderTabAdapter(Context context, List<ManageTimelines> manageTimelines, OnStartDragListener dragStartListener, OnUndoListener undoListener) {
this. mDragStartListener = dragStartListener;
this.mUndoListener = undoListener;
this.mItems = manageTimelines;
this.context = context;
sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
@ -197,11 +200,9 @@ public class ReorderTabAdapter extends RecyclerView.Adapter<ReorderTabAdapter.It
@Override
public void onItemDismiss(int position) {
ManageTimelines item = mItems.get(position);
mItems.get(position).setDisplayed(false);
mUndoListener.onUndo(item, position);
mItems.remove(position);
notifyItemRemoved(position);
mItems.add(item);
notifyItemInserted((mItems.size()-1));
}
@Override
@ -246,8 +247,7 @@ public class ReorderTabAdapter extends RecyclerView.Adapter<ReorderTabAdapter.It
@Override
public void onItemSelected() {
int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
itemView.setBackgroundColor(Color.LTGRAY);
itemView.setBackgroundColor(ContextCompat.getColor(context, R.color.mastodonC3));
}
@Override

View File

@ -16,8 +16,10 @@ package fr.gouv.etalab.mastodon.fragments;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
@ -26,6 +28,8 @@ import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.List;
@ -35,6 +39,7 @@ import fr.gouv.etalab.mastodon.asynctasks.SyncTimelinesAsyncTask;
import fr.gouv.etalab.mastodon.client.Entities.ManageTimelines;
import fr.gouv.etalab.mastodon.drawers.ReorderTabAdapter;
import fr.gouv.etalab.mastodon.helper.itemtouchhelper.OnStartDragListener;
import fr.gouv.etalab.mastodon.helper.itemtouchhelper.OnUndoListener;
import fr.gouv.etalab.mastodon.helper.itemtouchhelper.SimpleItemTouchHelperCallback;
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
import fr.gouv.etalab.mastodon.sqlite.TimelinesDAO;
@ -44,12 +49,16 @@ import fr.gouv.etalab.mastodon.sqlite.TimelinesDAO;
* Created by Thomas on 31/03/2019.
* Fragment to display tags
*/
public class DisplayReorderTabFragment extends Fragment implements OnStartDragListener {
public class DisplayReorderTabFragment extends Fragment implements OnStartDragListener, OnUndoListener {
private Context context;
public static boolean updated;
private ItemTouchHelper touchHelper;
private RelativeLayout undo_container;
private TextView undo_action;
private List<ManageTimelines> timelines;
private ReorderTabAdapter adapter;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
@ -60,14 +69,15 @@ public class DisplayReorderTabFragment extends Fragment implements OnStartDragLi
RecyclerView lv_reorder_tabs = rootView.findViewById(R.id.lv_reorder_tabs);
SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
List<ManageTimelines> timelines = new TimelinesDAO(context, db).getAllTimelines();
ReorderTabAdapter adapter = new ReorderTabAdapter(context, timelines, DisplayReorderTabFragment.this);
timelines = new TimelinesDAO(context, db).getAllTimelines();
adapter = new ReorderTabAdapter(context, timelines, DisplayReorderTabFragment.this, DisplayReorderTabFragment.this);
ItemTouchHelper.Callback callback =
new SimpleItemTouchHelperCallback(adapter);
touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(lv_reorder_tabs);
undo_action = rootView.findViewById(R.id.undo_action);
undo_container = rootView.findViewById(R.id.undo_container);
lv_reorder_tabs.setAdapter(adapter);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(context);
lv_reorder_tabs.setLayoutManager(mLayoutManager);
@ -91,4 +101,27 @@ public class DisplayReorderTabFragment extends Fragment implements OnStartDragLi
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
touchHelper.startDrag(viewHolder);
}
@Override
public void onUndo(ManageTimelines manageTimelines, int position) {
undo_container.setVisibility(View.VISIBLE);
undo_action.setPaintFlags(undo_action.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
undo_action.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
timelines.add(position, manageTimelines);
adapter.notifyItemInserted(position);
undo_container.setVisibility(View.GONE);
}
});
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
undo_container.setVisibility(View.GONE);
}
}, 2000);
}
}

View File

@ -0,0 +1,34 @@
package fr.gouv.etalab.mastodon.helper.itemtouchhelper;
/* Copyright 2019 Thomas Schneider
*
* This file is a part of Mastalab
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* Mastalab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with Mastalab; if not,
* see <http://www.gnu.org/licenses>. */
import fr.gouv.etalab.mastodon.client.Entities.ManageTimelines;
/**
* Listener for manual initiation of a undo.
*/
public interface OnUndoListener {
/**
* Called when an item is removed
*
* @param timelines The timeline ManageTimelines
* @param position The position of the item in tablayout
*/
void onUndo(ManageTimelines timelines, int position);
}

View File

@ -28,5 +28,32 @@
android:scrollbars="none"
>
</android.support.v7.widget.RecyclerView>
<RelativeLayout
android:id="@+id/undo_container"
android:visibility="gone"
android:background="@color/mastodonC3"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_marginBottom="0dp">
<TextView
android:id="@+id/undo_action"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:layout_alignParentEnd="true"
android:layout_centerInParent="true"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:textColor="@color/mastodonC4"
android:textAllCaps="true"
android:text="@string/undo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_alignParentRight="true" />
</RelativeLayout>
</RelativeLayout>

View File

@ -927,6 +927,7 @@
<string name="move_timeline">Move timeline</string>
<string name="hide_timeline">Hide timeline</string>
<string name="reorder_timelines">Reorder timelines</string>
<string name="undo">Undo</string>
<plurals name="number_of_vote">
<item quantity="one">%d vote</item>