/*
* Copyright 2016 Hippo Seven
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hippo.ehviewer.ui.scene;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
import com.h6ah4i.android.widget.advrecyclerview.animator.SwipeDismissItemAnimator;
import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter;
import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange;
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager;
import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager;
import com.h6ah4i.android.widget.advrecyclerview.swipeable.SwipeableItemAdapter;
import com.h6ah4i.android.widget.advrecyclerview.swipeable.SwipeableItemConstants;
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultAction;
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultActionDefault;
import com.h6ah4i.android.widget.advrecyclerview.swipeable.action.SwipeResultActionMoveToSwipedDirection;
import com.h6ah4i.android.widget.advrecyclerview.touchguard.RecyclerViewTouchActionGuardManager;
import com.h6ah4i.android.widget.advrecyclerview.utils.AbstractDraggableSwipeableItemViewHolder;
import com.hippo.easyrecyclerview.EasyRecyclerView;
import com.hippo.ehviewer.EhDB;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.dao.QuickSearch;
import com.hippo.util.DrawableManager;
import com.hippo.view.ViewTransition;
import com.hippo.yorozuya.ViewUtils;
import junit.framework.Assert;
import java.util.List;
public final class QuickSearchScene extends ToolbarScene {
/*---------------
Whole life cycle
---------------*/
@Nullable
private List<QuickSearch> mQuickSearchList;
/*---------------
View life cycle
---------------*/
@Nullable
private EasyRecyclerView mRecyclerView;
@Nullable
private ViewTransition mViewTransition;
@Nullable
private RecyclerView.Adapter mAdapter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mQuickSearchList = EhDB.getAllQuickSearch();
}
@Override
public void onDestroy() {
super.onDestroy();
mQuickSearchList = null;
}
@SuppressWarnings("deprecation")
@Nullable
@Override
public View onCreateView3(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.scene_label_list, container, false);
mRecyclerView = (EasyRecyclerView) ViewUtils.$$(view, R.id.recycler_view);
TextView tip = (TextView) ViewUtils.$$(view, R.id.tip);
mViewTransition = new ViewTransition(mRecyclerView, tip);
Context context = getContext2();
Assert.assertNotNull(context);
Drawable drawable = DrawableManager.getDrawable(context, R.drawable.big_search);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
tip.setCompoundDrawables(null, drawable, null, null);
tip.setText(R.string.no_quick_search);
// touch guard manager (this class is required to suppress scrolling while swipe-dismiss animation is running)
RecyclerViewTouchActionGuardManager guardManager = new RecyclerViewTouchActionGuardManager();
guardManager.setInterceptVerticalScrollingWhileAnimationRunning(true);
guardManager.setEnabled(true);
// drag & drop manager
RecyclerViewDragDropManager dragDropManager = new RecyclerViewDragDropManager();
dragDropManager.setDraggingItemShadowDrawable(
(NinePatchDrawable) context.getResources().getDrawable(R.drawable.shadow_8dp));
// swipe manager
RecyclerViewSwipeManager swipeManager = new RecyclerViewSwipeManager();
RecyclerView.Adapter adapter = new QuickSearchAdapter();
adapter.setHasStableIds(true);
adapter = dragDropManager.createWrappedAdapter(adapter); // wrap for dragging
adapter = swipeManager.createWrappedAdapter(adapter); // wrap for swiping
mAdapter = adapter;
final GeneralItemAnimator animator = new SwipeDismissItemAnimator();
animator.setSupportsChangeAnimations(false);
mRecyclerView.hasFixedSize();
mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
mRecyclerView.setAdapter(adapter);
mRecyclerView.setItemAnimator(animator);
guardManager.attachRecyclerView(mRecyclerView);
swipeManager.attachRecyclerView(mRecyclerView);
dragDropManager.attachRecyclerView(mRecyclerView);
updateView();
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setTitle(R.string.quick_search);
setNavigationIcon(R.drawable.v_arrow_left_dark_x24);
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (null != mRecyclerView) {
mRecyclerView.stopScroll();
mRecyclerView = null;
}
mViewTransition = null;
mAdapter = null;
}
@Override
public void onNavigationClick() {
onBackPressed();
}
private void updateView() {
if (mViewTransition != null) {
if (mQuickSearchList != null && mQuickSearchList.size() > 0) {
mViewTransition.showView(0);
} else {
mViewTransition.showView(1);
}
}
}
private class QuickSearchHolder extends AbstractDraggableSwipeableItemViewHolder {
public final View swipeHandler;
public final TextView label;
public final View dragHandler;
public QuickSearchHolder(View itemView) {
super(itemView);
swipeHandler = ViewUtils.$$(itemView, R.id.swipe_handler);
label = (TextView) ViewUtils.$$(itemView, R.id.label);
dragHandler = ViewUtils.$$(itemView, R.id.drag_handler);
}
@Override
public View getSwipeableContainerView() {
return swipeHandler;
}
}
private class QuickSearchAdapter extends RecyclerView.Adapter<QuickSearchHolder>
implements DraggableItemAdapter<QuickSearchHolder>,
SwipeableItemAdapter<QuickSearchHolder> {
private final LayoutInflater mInflater;
public QuickSearchAdapter() {
mInflater = getLayoutInflater2();
Assert.assertNotNull(mInflater);
}
@Override
public QuickSearchHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new QuickSearchHolder(mInflater.inflate(R.layout.item_label_list, parent, false));
}
@Override
public void onBindViewHolder(QuickSearchHolder holder, int position) {
if (mQuickSearchList != null) {
holder.label.setText(mQuickSearchList.get(position).name);
}
holder.setSwipeItemHorizontalSlideAmount(0);
}
@Override
public long getItemId(int position) {
return mQuickSearchList != null ? mQuickSearchList.get(position).getId() : 0;
}
@Override
public int getItemCount() {
return mQuickSearchList != null ? mQuickSearchList.size() : 0;
}
@Override
public boolean onCheckCanStartDrag(QuickSearchHolder holder, int position, int x, int y) {
return ViewUtils.isViewUnder(holder.dragHandler, x, y, 0);
}
@Override
public ItemDraggableRange onGetItemDraggableRange(QuickSearchHolder holder, int position) {
return null;
}
@Override
public void onMoveItem(int fromPosition, int toPosition) {
if (fromPosition == toPosition) {
return;
}
if (null == mQuickSearchList) {
return;
}
EhDB.moveQuickSearch(fromPosition, toPosition);
final QuickSearch item = mQuickSearchList.remove(fromPosition);
mQuickSearchList.add(toPosition, item);
notifyItemMoved(fromPosition, toPosition);
}
@Override
public boolean onCheckCanDrop(int draggingPosition, int dropPosition) {
return true;
}
@Override
public int onGetSwipeReactionType(QuickSearchHolder holder, int position, int x, int y) {
if (ViewUtils.isViewUnder(holder.getSwipeableContainerView(), x, y, 0)) {
return SwipeableItemConstants.REACTION_CAN_SWIPE_LEFT;
} else {
return SwipeableItemConstants.REACTION_CAN_NOT_SWIPE_BOTH_H;
}
}
@Override
public void onSetSwipeBackground(QuickSearchHolder holder, int position, int type) {}
@Override
public SwipeResultAction onSwipeItem(QuickSearchHolder holder, int position, int result) {
switch (result) {
// swipe left --- pin
case SwipeableItemConstants.RESULT_SWIPED_LEFT:
return new SwipeLeftResultAction(position);
// other --- do nothing
case SwipeableItemConstants.RESULT_SWIPED_RIGHT:
case SwipeableItemConstants.RESULT_CANCELED:
default:
return new SwipeResultActionDefault();
}
}
}
private class SwipeLeftResultAction extends SwipeResultActionMoveToSwipedDirection {
private final int mPosition;
public SwipeLeftResultAction(int position) {
mPosition = position;
}
@Override
protected void onPerformAction() {
super.onPerformAction();
Context context = getContext2();
final List<QuickSearch> quickSearchList = mQuickSearchList;
if (null == context || null == quickSearchList || mPosition < 0 || mPosition >= quickSearchList.size()) {
return;
}
final QuickSearch quickSearch = quickSearchList.get(mPosition);
new AlertDialog.Builder(context)
.setTitle(R.string.delete_quick_search_title)
.setMessage(getString(R.string.delete_quick_search_message, quickSearch.name))
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
EhDB.deleteQuickSearch(quickSearch);
quickSearchList.remove(mPosition);
}
})
.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (null != mAdapter) {
mAdapter.notifyDataSetChanged();
}
updateView();
}
}).show();
}
}
}