Show UndoBar when dismiss-by-swipe
This commit is contained in:
parent
6c81f6c868
commit
9444f26673
@ -6,6 +6,7 @@ import android.content.DialogInterface;
|
|||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.Parcelable;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v7.widget.SearchView;
|
import android.support.v7.widget.SearchView;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@ -42,6 +43,8 @@ import de.danoeh.antennapod.core.storage.DBTasks;
|
|||||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||||
import de.danoeh.antennapod.core.storage.DownloadRequester;
|
import de.danoeh.antennapod.core.storage.DownloadRequester;
|
||||||
import de.danoeh.antennapod.core.util.QueueSorter;
|
import de.danoeh.antennapod.core.util.QueueSorter;
|
||||||
|
import de.danoeh.antennapod.core.util.gui.FeedItemUndoToken;
|
||||||
|
import de.danoeh.antennapod.core.util.gui.UndoBarController;
|
||||||
import de.danoeh.antennapod.menuhandler.MenuItemUtils;
|
import de.danoeh.antennapod.menuhandler.MenuItemUtils;
|
||||||
import de.danoeh.antennapod.menuhandler.NavDrawerActivity;
|
import de.danoeh.antennapod.menuhandler.NavDrawerActivity;
|
||||||
|
|
||||||
@ -59,6 +62,8 @@ public class QueueFragment extends Fragment {
|
|||||||
private TextView txtvEmpty;
|
private TextView txtvEmpty;
|
||||||
private ProgressBar progLoading;
|
private ProgressBar progLoading;
|
||||||
|
|
||||||
|
private UndoBarController undoBarController;
|
||||||
|
|
||||||
private List<FeedItem> queue;
|
private List<FeedItem> queue;
|
||||||
private List<Downloader> downloaderList;
|
private List<Downloader> downloaderList;
|
||||||
|
|
||||||
@ -120,6 +125,7 @@ public class QueueFragment extends Fragment {
|
|||||||
unregisterForContextMenu(listView);
|
unregisterForContextMenu(listView);
|
||||||
listAdapter = null;
|
listAdapter = null;
|
||||||
activity.set(null);
|
activity.set(null);
|
||||||
|
undoBarController = null;
|
||||||
viewsCreated = false;
|
viewsCreated = false;
|
||||||
blockDownloadObserverUpdate = false;
|
blockDownloadObserverUpdate = false;
|
||||||
if (downloadObserver != null) {
|
if (downloadObserver != null) {
|
||||||
@ -302,12 +308,30 @@ public class QueueFragment extends Fragment {
|
|||||||
@Override
|
@Override
|
||||||
public void remove(int which) {
|
public void remove(int which) {
|
||||||
Log.d(TAG, "remove("+which+")");
|
Log.d(TAG, "remove("+which+")");
|
||||||
final FeedItem item = queue.remove(which);
|
stopItemLoader();
|
||||||
DBWriter.removeQueueItem(getActivity(), item.getId(), false);
|
FeedItem item = (FeedItem) listView.getAdapter().getItem(which);
|
||||||
listAdapter.notifyDataSetChanged();
|
DBWriter.removeQueueItem(getActivity(), item.getId(), true);
|
||||||
|
undoBarController.showUndoBar(false,
|
||||||
|
getString(R.string.removed_from_queue), new FeedItemUndoToken(item,
|
||||||
|
which)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
undoBarController = new UndoBarController(root.findViewById(R.id.undobar), new UndoBarController.UndoListener() {
|
||||||
|
@Override
|
||||||
|
public void onUndo(Parcelable token) {
|
||||||
|
// Perform the undo
|
||||||
|
FeedItemUndoToken undoToken = (FeedItemUndoToken) token;
|
||||||
|
if (token != null) {
|
||||||
|
long itemId = undoToken.getFeedItemId();
|
||||||
|
int position = undoToken.getPosition();
|
||||||
|
DBWriter.addQueueItemAt(getActivity(), itemId, position, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
registerForContextMenu(listView);
|
registerForContextMenu(listView);
|
||||||
|
|
||||||
if (!itemsLoaded) {
|
if (!itemsLoaded) {
|
||||||
|
@ -43,4 +43,18 @@
|
|||||||
android:indeterminateOnly="true"
|
android:indeterminateOnly="true"
|
||||||
android:visibility="gone" />
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/undobar"
|
||||||
|
style="@style/UndoBar">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/undobar_message"
|
||||||
|
style="@style/UndoBarMessage"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/undobar_button"
|
||||||
|
style="@style/UndoBarButton"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
@ -44,4 +44,5 @@ dependencies {
|
|||||||
compile 'com.squareup.okhttp:okhttp:2.2.0'
|
compile 'com.squareup.okhttp:okhttp:2.2.0'
|
||||||
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
|
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
|
||||||
compile 'com.squareup.okio:okio:1.2.0'
|
compile 'com.squareup.okio:okio:1.2.0'
|
||||||
|
compile 'com.nineoldandroids:library:2.4.0'
|
||||||
}
|
}
|
@ -0,0 +1,121 @@
|
|||||||
|
package de.danoeh.antennapod.core.util.gui;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.nineoldandroids.animation.Animator;
|
||||||
|
import com.nineoldandroids.animation.AnimatorListenerAdapter;
|
||||||
|
import com.nineoldandroids.view.ViewHelper;
|
||||||
|
import com.nineoldandroids.view.ViewPropertyAnimator;
|
||||||
|
|
||||||
|
import de.danoeh.antennapod.core.R;
|
||||||
|
|
||||||
|
import static com.nineoldandroids.view.ViewPropertyAnimator.animate;
|
||||||
|
|
||||||
|
public class UndoBarController {
|
||||||
|
private View mBarView;
|
||||||
|
private TextView mMessageView;
|
||||||
|
private ViewPropertyAnimator mBarAnimator;
|
||||||
|
private Handler mHideHandler = new Handler();
|
||||||
|
|
||||||
|
private UndoListener mUndoListener;
|
||||||
|
|
||||||
|
// State objects
|
||||||
|
private Parcelable mUndoToken;
|
||||||
|
private CharSequence mUndoMessage;
|
||||||
|
|
||||||
|
public interface UndoListener {
|
||||||
|
void onUndo(Parcelable token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UndoBarController(View undoBarView, UndoListener undoListener) {
|
||||||
|
mBarView = undoBarView;
|
||||||
|
mBarAnimator = animate(mBarView);
|
||||||
|
mUndoListener = undoListener;
|
||||||
|
|
||||||
|
mMessageView = (TextView) mBarView.findViewById(R.id.undobar_message);
|
||||||
|
mBarView.findViewById(R.id.undobar_button)
|
||||||
|
.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
hideUndoBar(false);
|
||||||
|
mUndoListener.onUndo(mUndoToken);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
hideUndoBar(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showUndoBar(boolean immediate, CharSequence message, Parcelable undoToken) {
|
||||||
|
mUndoToken = undoToken;
|
||||||
|
mUndoMessage = message;
|
||||||
|
mMessageView.setText(mUndoMessage);
|
||||||
|
|
||||||
|
mHideHandler.removeCallbacks(mHideRunnable);
|
||||||
|
mHideHandler.postDelayed(mHideRunnable,
|
||||||
|
mBarView.getResources().getInteger(R.integer.undobar_hide_delay));
|
||||||
|
|
||||||
|
mBarView.setVisibility(View.VISIBLE);
|
||||||
|
if (immediate) {
|
||||||
|
ViewHelper.setAlpha(mBarView, 1);
|
||||||
|
} else {
|
||||||
|
mBarAnimator.cancel();
|
||||||
|
mBarAnimator
|
||||||
|
.alpha(1)
|
||||||
|
.setDuration(
|
||||||
|
mBarView.getResources()
|
||||||
|
.getInteger(android.R.integer.config_shortAnimTime))
|
||||||
|
.setListener(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void hideUndoBar(boolean immediate) {
|
||||||
|
mHideHandler.removeCallbacks(mHideRunnable);
|
||||||
|
if (immediate) {
|
||||||
|
mBarView.setVisibility(View.GONE);
|
||||||
|
ViewHelper.setAlpha(mBarView, 0);
|
||||||
|
mUndoMessage = null;
|
||||||
|
} else {
|
||||||
|
mBarAnimator.cancel();
|
||||||
|
mBarAnimator
|
||||||
|
.alpha(0)
|
||||||
|
.setDuration(mBarView.getResources()
|
||||||
|
.getInteger(android.R.integer.config_shortAnimTime))
|
||||||
|
.setListener(new AnimatorListenerAdapter() {
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(Animator animation) {
|
||||||
|
mBarView.setVisibility(View.GONE);
|
||||||
|
mUndoMessage = null;
|
||||||
|
mUndoToken = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
|
outState.putCharSequence("undo_message", mUndoMessage);
|
||||||
|
outState.putParcelable("undo_token", mUndoToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||||
|
if (savedInstanceState != null) {
|
||||||
|
mUndoMessage = savedInstanceState.getCharSequence("undo_message");
|
||||||
|
mUndoToken = savedInstanceState.getParcelable("undo_token");
|
||||||
|
|
||||||
|
if (mUndoToken != null || !TextUtils.isEmpty(mUndoMessage)) {
|
||||||
|
showUndoBar(true, mUndoMessage, mUndoToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Runnable mHideRunnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
hideUndoBar(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user