Synced translationsRemoved debuglogs.
This commit is contained in:
parent
ea07461941
commit
0aedb078d7
3 changed files with 1 additions and 439 deletions
|
|
@ -9,8 +9,6 @@ import android.support.v4.app.DialogFragment;
|
|||
|
||||
import com.afollestad.materialdialogs.MaterialDialog;
|
||||
|
||||
import hugo.weaving.DebugLog;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
|
|
@ -24,7 +22,6 @@ public class LyricsDialog extends DialogFragment {
|
|||
return dialog;
|
||||
}
|
||||
|
||||
@DebugLog
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
|
|
|
|||
|
|
@ -1,431 +0,0 @@
|
|||
/*
|
||||
* DragSortRecycler
|
||||
*
|
||||
* Added drag and drop functionality to your RecyclerView
|
||||
*
|
||||
*
|
||||
* Copyright 2014 Emile Belanger.
|
||||
*
|
||||
* 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.kabouzeid.gramophone.misc;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
|
||||
public class DragSortRecycler extends RecyclerView.ItemDecoration implements RecyclerView.OnItemTouchListener {
|
||||
|
||||
final String TAG = "DragSortRecycler";
|
||||
|
||||
final boolean DEBUG = false;
|
||||
|
||||
private int dragHandleWidth = 0;
|
||||
|
||||
private int selectedDragItemPos = -1;
|
||||
|
||||
private int fingerAnchorY;
|
||||
|
||||
private int fingerY;
|
||||
|
||||
private int fingerOffsetInViewY;
|
||||
|
||||
private float autoScrollWindow = 0.1f;
|
||||
private float autoScrollSpeed = 0.5f;
|
||||
|
||||
@Nullable
|
||||
private BitmapDrawable floatingItem;
|
||||
private Rect floatingItemStatingBounds;
|
||||
private Rect floatingItemBounds;
|
||||
|
||||
|
||||
private float floatingItemAlpha = 0.5f;
|
||||
private int floatingItemBgColor = 0;
|
||||
|
||||
private int viewHandleId = -1;
|
||||
|
||||
|
||||
OnItemMovedListener moveInterface;
|
||||
|
||||
private boolean isDragging;
|
||||
@Nullable
|
||||
OnDragStateChangedListener dragStateChangedListener;
|
||||
|
||||
|
||||
public interface OnItemMovedListener {
|
||||
void onItemMoved(int from, int to);
|
||||
}
|
||||
|
||||
public interface OnDragStateChangedListener {
|
||||
void onDragStart();
|
||||
|
||||
void onDragStop();
|
||||
}
|
||||
|
||||
private void debugLog(String log) {
|
||||
if (DEBUG)
|
||||
Log.d(TAG, log);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public RecyclerView.OnScrollListener getScrollListener() {
|
||||
return scrollListener;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the item move interface
|
||||
*/
|
||||
public void setOnItemMovedListener(OnItemMovedListener swif) {
|
||||
moveInterface = swif;
|
||||
}
|
||||
|
||||
public void setViewHandleId(int id) {
|
||||
viewHandleId = id;
|
||||
}
|
||||
|
||||
public void setLeftDragArea(int w) {
|
||||
dragHandleWidth = w;
|
||||
}
|
||||
|
||||
public void setFloatingAlpha(float a) {
|
||||
floatingItemAlpha = a;
|
||||
}
|
||||
|
||||
public void setFloatingBgColor(int c) {
|
||||
floatingItemBgColor = c;
|
||||
}
|
||||
|
||||
/*
|
||||
Set the window at top and bottom of list, must be between 0 and 0.5
|
||||
For example 0.1 uses the top and bottom 10% of the lists for scrolling
|
||||
*/
|
||||
public void setAutoScrollWindow(float w) {
|
||||
autoScrollWindow = w;
|
||||
}
|
||||
|
||||
/*
|
||||
Set the autoscroll speed, default is 0.5
|
||||
*/
|
||||
public void setAutoScrollSpeed(float speed) {
|
||||
autoScrollSpeed = speed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView rv, RecyclerView.State state) {
|
||||
super.getItemOffsets(outRect, view, rv, state);
|
||||
|
||||
debugLog("getItemOffsets");
|
||||
|
||||
debugLog("View top = " + view.getTop());
|
||||
if (selectedDragItemPos != -1) {
|
||||
int itemPos = rv.getChildAdapterPosition(view);
|
||||
debugLog("itemPos =" + itemPos);
|
||||
|
||||
if (!canDragOver(itemPos)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// float totalMovement = fingerY - fingerAnchorY;
|
||||
|
||||
if (itemPos == selectedDragItemPos) {
|
||||
view.setVisibility(View.INVISIBLE);
|
||||
} else {
|
||||
//Make view visible incase invisible
|
||||
view.setVisibility(View.VISIBLE);
|
||||
|
||||
//Find middle of the floatingItem
|
||||
float floatMiddleY = floatingItemBounds.top + floatingItemBounds.height() / 2;
|
||||
|
||||
//Moving down the list
|
||||
//These will auto-animate if the device continually sends touch motion events
|
||||
// if (totalMovment>0)
|
||||
{
|
||||
if ((itemPos > selectedDragItemPos) && (view.getTop() < floatMiddleY)) {
|
||||
float amountUp = (floatMiddleY - view.getTop()) / (float) view.getHeight();
|
||||
// amountUp *= 0.5f;
|
||||
if (amountUp > 1)
|
||||
amountUp = 1;
|
||||
|
||||
outRect.top = -(int) (floatingItemBounds.height() * amountUp);
|
||||
outRect.bottom = (int) (floatingItemBounds.height() * amountUp);
|
||||
}
|
||||
|
||||
}//Moving up the list
|
||||
// else if (totalMovment < 0)
|
||||
{
|
||||
if ((itemPos < selectedDragItemPos) && (view.getBottom() > floatMiddleY)) {
|
||||
float amountDown = ((float) view.getBottom() - floatMiddleY) / (float) view.getHeight();
|
||||
// amountDown *= 0.5f;
|
||||
if (amountDown > 1)
|
||||
amountDown = 1;
|
||||
|
||||
outRect.top = (int) (floatingItemBounds.height() * amountDown);
|
||||
outRect.bottom = -(int) (floatingItemBounds.height() * amountDown);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
outRect.top = 0;
|
||||
outRect.bottom = 0;
|
||||
//Make view visible incase invisible
|
||||
view.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the new position by scanning through the items on
|
||||
* screen and finding the positional relationship.
|
||||
* This *seems* to work, another method would be to use
|
||||
* getItemOffsets, but I think that could miss items?..
|
||||
*/
|
||||
private int getNewPostion(@NonNull RecyclerView rv) {
|
||||
int itemsOnScreen = rv.getLayoutManager().getChildCount();
|
||||
|
||||
float floatMiddleY = floatingItemBounds.top + floatingItemBounds.height() / 2;
|
||||
|
||||
int above = 0;
|
||||
int below = Integer.MAX_VALUE;
|
||||
for (int n = 0; n < itemsOnScreen; n++) //Scan though items on screen, however they may not
|
||||
{ // be in order!
|
||||
|
||||
View view = rv.getLayoutManager().getChildAt(n);
|
||||
|
||||
if (view.getVisibility() != View.VISIBLE)
|
||||
continue;
|
||||
|
||||
int itemPos = rv.getChildAdapterPosition(view);
|
||||
|
||||
if (itemPos == selectedDragItemPos) //Don't check against itself!
|
||||
continue;
|
||||
|
||||
float viewMiddleY = view.getTop() + view.getHeight() / 2;
|
||||
if (floatMiddleY > viewMiddleY) //Is above this item
|
||||
{
|
||||
if (itemPos > above)
|
||||
above = itemPos;
|
||||
} else if (floatMiddleY <= viewMiddleY) //Is below this item
|
||||
{
|
||||
if (itemPos < below)
|
||||
below = itemPos;
|
||||
}
|
||||
}
|
||||
debugLog("above = " + above + " below = " + below);
|
||||
|
||||
if (below != Integer.MAX_VALUE) {
|
||||
if (below < selectedDragItemPos) //Need to count itself
|
||||
below++;
|
||||
return below - 1;
|
||||
} else {
|
||||
if (above < selectedDragItemPos)
|
||||
above++;
|
||||
|
||||
return above;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
|
||||
debugLog("onInterceptTouchEvent");
|
||||
|
||||
//if (e.getAction() == MotionEvent.ACTION_DOWN)
|
||||
{
|
||||
View itemView = rv.findChildViewUnder(e.getX(), e.getY());
|
||||
|
||||
if (itemView == null)
|
||||
return false;
|
||||
|
||||
boolean dragging = false;
|
||||
|
||||
if ((dragHandleWidth > 0) && (e.getX() < dragHandleWidth)) {
|
||||
dragging = true;
|
||||
} else if (viewHandleId != -1) {
|
||||
//Find the handle in the list item
|
||||
View handleView = itemView.findViewById(viewHandleId);
|
||||
|
||||
if (handleView == null) {
|
||||
Log.e(TAG, "The view ID " + viewHandleId + " was not found in the RecycleView item");
|
||||
return false;
|
||||
}
|
||||
|
||||
//View should be visible to drag
|
||||
if (handleView.getVisibility() != View.VISIBLE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//We need to find the relative position of the handle to the parent view
|
||||
//Then we can work out if the touch is within the handle
|
||||
int[] parentItemPos = new int[2];
|
||||
itemView.getLocationInWindow(parentItemPos);
|
||||
|
||||
int[] handlePos = new int[2];
|
||||
handleView.getLocationInWindow(handlePos);
|
||||
|
||||
int xRel = handlePos[0] - parentItemPos[0];
|
||||
int yRel = handlePos[1] - parentItemPos[1];
|
||||
|
||||
Rect touchBounds = new Rect(itemView.getLeft() + xRel, itemView.getTop() + yRel,
|
||||
itemView.getLeft() + xRel + handleView.getWidth(),
|
||||
itemView.getTop() + yRel + handleView.getHeight()
|
||||
);
|
||||
|
||||
if (touchBounds.contains((int) e.getX(), (int) e.getY()))
|
||||
dragging = true;
|
||||
|
||||
debugLog("parentItemPos = " + parentItemPos[0] + " " + parentItemPos[1]);
|
||||
debugLog("handlePos = " + handlePos[0] + " " + handlePos[1]);
|
||||
}
|
||||
|
||||
|
||||
if (dragging) {
|
||||
debugLog("Started Drag");
|
||||
|
||||
setIsDragging(true);
|
||||
|
||||
floatingItem = createFloatingBitmap(itemView);
|
||||
|
||||
fingerAnchorY = (int) e.getY();
|
||||
fingerOffsetInViewY = fingerAnchorY - itemView.getTop();
|
||||
fingerY = fingerAnchorY;
|
||||
|
||||
selectedDragItemPos = rv.getChildAdapterPosition(itemView);
|
||||
debugLog("selectedDragItemPos = " + selectedDragItemPos);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
|
||||
debugLog("onTouchEvent");
|
||||
|
||||
if ((e.getAction() == MotionEvent.ACTION_UP) ||
|
||||
(e.getAction() == MotionEvent.ACTION_CANCEL)) {
|
||||
if ((e.getAction() == MotionEvent.ACTION_UP) && selectedDragItemPos != -1) {
|
||||
int newPos = getNewPostion(rv);
|
||||
if (moveInterface != null)
|
||||
moveInterface.onItemMoved(selectedDragItemPos, newPos);
|
||||
}
|
||||
|
||||
setIsDragging(false);
|
||||
selectedDragItemPos = -1;
|
||||
floatingItem = null;
|
||||
rv.invalidateItemDecorations();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
fingerY = (int) e.getY();
|
||||
|
||||
if (floatingItem != null) {
|
||||
floatingItemBounds.top = fingerY - fingerOffsetInViewY;
|
||||
|
||||
if (floatingItemBounds.top < -floatingItemStatingBounds.height() / 2) //Allow half the view out the top
|
||||
floatingItemBounds.top = -floatingItemStatingBounds.height() / 2;
|
||||
|
||||
floatingItemBounds.bottom = floatingItemBounds.top + floatingItemStatingBounds.height();
|
||||
|
||||
floatingItem.setBounds(floatingItemBounds);
|
||||
}
|
||||
|
||||
//Do auto scrolling at end of list
|
||||
float scrollAmount = 0;
|
||||
if (fingerY > (rv.getHeight() * (1 - autoScrollWindow))) {
|
||||
scrollAmount = (fingerY - (rv.getHeight() * (1 - autoScrollWindow)));
|
||||
} else if (fingerY < (rv.getHeight() * autoScrollWindow)) {
|
||||
scrollAmount = (fingerY - (rv.getHeight() * autoScrollWindow));
|
||||
}
|
||||
debugLog("Scroll: " + scrollAmount);
|
||||
|
||||
scrollAmount *= autoScrollSpeed;
|
||||
rv.scrollBy(0, (int) scrollAmount);
|
||||
|
||||
rv.invalidateItemDecorations();// Redraw
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
|
||||
|
||||
}
|
||||
|
||||
private void setIsDragging(final boolean dragging) {
|
||||
if (dragging != isDragging) {
|
||||
isDragging = dragging;
|
||||
if (dragStateChangedListener != null) {
|
||||
if (isDragging) {
|
||||
dragStateChangedListener.onDragStart();
|
||||
} else {
|
||||
dragStateChangedListener.onDragStop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setOnDragStateChangedListener(final OnDragStateChangedListener dragStateChangedListener) {
|
||||
this.dragStateChangedListener = dragStateChangedListener;
|
||||
}
|
||||
|
||||
|
||||
final Paint bgColor = new Paint();
|
||||
|
||||
@Override
|
||||
public void onDrawOver(@NonNull Canvas c, RecyclerView parent, RecyclerView.State state) {
|
||||
if (floatingItem != null) {
|
||||
floatingItem.setAlpha((int) (255 * floatingItemAlpha));
|
||||
bgColor.setColor(floatingItemBgColor);
|
||||
c.drawRect(floatingItemBounds, bgColor);
|
||||
floatingItem.draw(c);
|
||||
}
|
||||
}
|
||||
|
||||
final RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
|
||||
@Override
|
||||
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
|
||||
super.onScrolled(recyclerView, dx, dy);
|
||||
debugLog("Scrolled: " + dx + " " + dy);
|
||||
fingerAnchorY -= dy;
|
||||
}
|
||||
};
|
||||
|
||||
protected boolean canDragOver(int position) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private BitmapDrawable createFloatingBitmap(@NonNull View v) {
|
||||
floatingItemStatingBounds = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
|
||||
floatingItemBounds = new Rect(floatingItemStatingBounds);
|
||||
|
||||
Bitmap bitmap = Bitmap.createBitmap(floatingItemStatingBounds.width(),
|
||||
floatingItemStatingBounds.height(), Bitmap.Config.ARGB_8888);
|
||||
Canvas canvas = new Canvas(bitmap);
|
||||
v.draw(canvas);
|
||||
|
||||
BitmapDrawable retDrawable = new BitmapDrawable(v.getResources(), bitmap);
|
||||
retDrawable.setBounds(floatingItemBounds);
|
||||
|
||||
return retDrawable;
|
||||
}
|
||||
}
|
||||
|
|
@ -20,10 +20,10 @@ import android.widget.TextView;
|
|||
import com.kabouzeid.appthemehelper.ThemeStore;
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.adapter.SearchAdapter;
|
||||
import com.kabouzeid.gramophone.interfaces.LoaderIds;
|
||||
import com.kabouzeid.gramophone.loader.AlbumLoader;
|
||||
import com.kabouzeid.gramophone.loader.ArtistLoader;
|
||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
||||
import com.kabouzeid.gramophone.interfaces.LoaderIds;
|
||||
import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
|
||||
import com.kabouzeid.gramophone.util.Util;
|
||||
|
|
@ -34,7 +34,6 @@ import java.util.List;
|
|||
|
||||
import butterknife.Bind;
|
||||
import butterknife.ButterKnife;
|
||||
import hugo.weaving.DebugLog;
|
||||
|
||||
public class SearchActivity extends AbsMusicServiceActivity implements SearchView.OnQueryTextListener, LoaderManager.LoaderCallbacks<List<Object>> {
|
||||
public static final String TAG = SearchActivity.class.getSimpleName();
|
||||
|
|
@ -53,7 +52,6 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie
|
|||
private SearchAdapter adapter;
|
||||
private String query;
|
||||
|
||||
@DebugLog
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
|
@ -111,7 +109,6 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie
|
|||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
|
||||
@DebugLog
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.menu_search, menu);
|
||||
|
|
@ -171,7 +168,6 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie
|
|||
return false;
|
||||
}
|
||||
|
||||
@DebugLog
|
||||
@Override
|
||||
public boolean onQueryTextChange(String newText) {
|
||||
search(newText);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue