Loading packages/DocumentsUI/src/com/android/documentsui/Events.java +43 −6 Original line number Diff line number Diff line Loading @@ -16,8 +16,13 @@ package com.android.documentsui; import static com.android.documentsui.Shared.DEBUG; import android.graphics.Point; import android.os.Looper; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.util.Pools; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; Loading Loading @@ -133,17 +138,49 @@ public final class Events { } public static final class MotionInputEvent implements InputEvent { private final MotionEvent mEvent; private final int mPosition; private static final String TAG = "MotionInputEvent"; private static final Pools.SimplePool<MotionInputEvent> sPool = new Pools.SimplePool<>(1); private MotionEvent mEvent; private int mPosition; private MotionInputEvent() { if (DEBUG) Log.i(TAG, "Created a new instance."); } public static MotionInputEvent obtain(MotionEvent event, RecyclerView view) { // Make sure events are only used in main thread. assert(Looper.myLooper() == Looper.getMainLooper()); public MotionInputEvent(MotionEvent event, RecyclerView view) { mEvent = event; MotionInputEvent instance = sPool.acquire(); instance = (instance != null ? instance : new MotionInputEvent()); instance.mEvent = event; // Consider determining position lazily as an optimization. View child = view.findChildViewUnder(mEvent.getX(), mEvent.getY()); mPosition = (child!= null) View child = view.findChildViewUnder(event.getX(), event.getY()); instance.mPosition = (child != null) ? view.getChildAdapterPosition(child) : RecyclerView.NO_POSITION; return instance; } public void recycle() { // Make sure events are only used in main thread. assert(Looper.myLooper() == Looper.getMainLooper()); mEvent = null; mPosition = -1; boolean released = sPool.release(this); // This assert is used to guarantee we won't generate too many instances that can't be // held in the pool, which indicates our pool size is too small. // // Right now one instance is enough because we expect all instances are only used in // main thread. assert(released); } @Override Loading packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java +12 −6 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.android.documentsui.Events.MotionInputEvent; import com.android.documentsui.RecentsProvider.RecentColumns; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DurableUtils; Loading Loading @@ -140,13 +141,18 @@ public class RecentsCreateFragment extends Fragment { new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { Events.MotionInputEvent event = new Events.MotionInputEvent(e, mRecView); final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); try { if (event.isOverItem() && event.isActionUp()) { final DocumentStack stack = mAdapter.getItem(event.getItemPosition()); ((BaseActivity) getActivity()).onStackPicked(stack); return true; } return false; } finally { event.recycle(); } } @Override Loading packages/DocumentsUI/src/com/android/documentsui/dirlist/BandController.java +12 −2 Original line number Diff line number Diff line Loading @@ -85,12 +85,22 @@ public class BandController extends RecyclerView.OnScrollListener { new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { return handleEvent(new MotionInputEvent(e, view)); final MotionInputEvent event = MotionInputEvent.obtain(e, view); try { return handleEvent(event); } finally { event.recycle(); } } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { if (Events.isMouseEvent(e)) { processInputEvent(new MotionInputEvent(e, view)); final MotionInputEvent event = MotionInputEvent.obtain(e, view); try { processInputEvent(event); } finally { event.recycle(); } } } @Override Loading packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +21 −12 Original line number Diff line number Diff line Loading @@ -1634,8 +1634,9 @@ public class DirectoryFragment extends Fragment // Single tap logic: // If the selection manager is active, it gets first whack at handling tap // events. Otherwise, tap events are routed to the target DocumentHolder. boolean handled = mSelectionManager.onSingleTapUp( new MotionInputEvent(e, mRecView)); final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); try { boolean handled = mSelectionManager.onSingleTapUp(event); if (handled) { return handled; Loading @@ -1648,13 +1649,21 @@ public class DirectoryFragment extends Fragment } return handled; } finally { event.recycle(); } } @Override public void onLongPress(MotionEvent e) { // Long-press events get routed directly to the selection manager. They can be // changed to route through the DocumentHolder if necessary. mSelectionManager.onLongPress(new MotionInputEvent(e, mRecView)); final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); try { mSelectionManager.onLongPress(event); } finally { event.recycle(); } } @Override Loading Loading
packages/DocumentsUI/src/com/android/documentsui/Events.java +43 −6 Original line number Diff line number Diff line Loading @@ -16,8 +16,13 @@ package com.android.documentsui; import static com.android.documentsui.Shared.DEBUG; import android.graphics.Point; import android.os.Looper; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.util.Pools; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; Loading Loading @@ -133,17 +138,49 @@ public final class Events { } public static final class MotionInputEvent implements InputEvent { private final MotionEvent mEvent; private final int mPosition; private static final String TAG = "MotionInputEvent"; private static final Pools.SimplePool<MotionInputEvent> sPool = new Pools.SimplePool<>(1); private MotionEvent mEvent; private int mPosition; private MotionInputEvent() { if (DEBUG) Log.i(TAG, "Created a new instance."); } public static MotionInputEvent obtain(MotionEvent event, RecyclerView view) { // Make sure events are only used in main thread. assert(Looper.myLooper() == Looper.getMainLooper()); public MotionInputEvent(MotionEvent event, RecyclerView view) { mEvent = event; MotionInputEvent instance = sPool.acquire(); instance = (instance != null ? instance : new MotionInputEvent()); instance.mEvent = event; // Consider determining position lazily as an optimization. View child = view.findChildViewUnder(mEvent.getX(), mEvent.getY()); mPosition = (child!= null) View child = view.findChildViewUnder(event.getX(), event.getY()); instance.mPosition = (child != null) ? view.getChildAdapterPosition(child) : RecyclerView.NO_POSITION; return instance; } public void recycle() { // Make sure events are only used in main thread. assert(Looper.myLooper() == Looper.getMainLooper()); mEvent = null; mPosition = -1; boolean released = sPool.release(this); // This assert is used to guarantee we won't generate too many instances that can't be // held in the pool, which indicates our pool size is too small. // // Right now one instance is enough because we expect all instances are only used in // main thread. assert(released); } @Override Loading
packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java +12 −6 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.android.documentsui.Events.MotionInputEvent; import com.android.documentsui.RecentsProvider.RecentColumns; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DurableUtils; Loading Loading @@ -140,13 +141,18 @@ public class RecentsCreateFragment extends Fragment { new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { Events.MotionInputEvent event = new Events.MotionInputEvent(e, mRecView); final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); try { if (event.isOverItem() && event.isActionUp()) { final DocumentStack stack = mAdapter.getItem(event.getItemPosition()); ((BaseActivity) getActivity()).onStackPicked(stack); return true; } return false; } finally { event.recycle(); } } @Override Loading
packages/DocumentsUI/src/com/android/documentsui/dirlist/BandController.java +12 −2 Original line number Diff line number Diff line Loading @@ -85,12 +85,22 @@ public class BandController extends RecyclerView.OnScrollListener { new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { return handleEvent(new MotionInputEvent(e, view)); final MotionInputEvent event = MotionInputEvent.obtain(e, view); try { return handleEvent(event); } finally { event.recycle(); } } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { if (Events.isMouseEvent(e)) { processInputEvent(new MotionInputEvent(e, view)); final MotionInputEvent event = MotionInputEvent.obtain(e, view); try { processInputEvent(event); } finally { event.recycle(); } } } @Override Loading
packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +21 −12 Original line number Diff line number Diff line Loading @@ -1634,8 +1634,9 @@ public class DirectoryFragment extends Fragment // Single tap logic: // If the selection manager is active, it gets first whack at handling tap // events. Otherwise, tap events are routed to the target DocumentHolder. boolean handled = mSelectionManager.onSingleTapUp( new MotionInputEvent(e, mRecView)); final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); try { boolean handled = mSelectionManager.onSingleTapUp(event); if (handled) { return handled; Loading @@ -1648,13 +1649,21 @@ public class DirectoryFragment extends Fragment } return handled; } finally { event.recycle(); } } @Override public void onLongPress(MotionEvent e) { // Long-press events get routed directly to the selection manager. They can be // changed to route through the DocumentHolder if necessary. mSelectionManager.onLongPress(new MotionInputEvent(e, mRecView)); final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); try { mSelectionManager.onLongPress(event); } finally { event.recycle(); } } @Override Loading