163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay/* 263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Copyright 2017 The Android Open Source Project 363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * 463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Licensed under the Apache License, Version 2.0 (the "License"); 563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * you may not use this file except in compliance with the License. 663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * You may obtain a copy of the License at 763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * 863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * http://www.apache.org/licenses/LICENSE-2.0 963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * 1063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Unless required by applicable law or agreed to in writing, software 1163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * distributed under the License is distributed on an "AS IS" BASIS, 1263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * See the License for the specific language governing permissions and 1463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * limitations under the License. 1563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay */ 1663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 1763d2846409d84487d4856d3b8d18cc4684352e29Steve McKaypackage com.example.android.supportv7.widget.selection.fancy; 1863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 1963d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.content.Context; 2063d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.net.Uri; 2163d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.os.Bundle; 2263d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.util.Log; 2363d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.view.Menu; 2463d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.view.MenuItem; 2563d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.view.MotionEvent; 2663d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.widget.Toast; 2763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 28def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.annotation.CallSuper; 29def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.appcompat.app.AppCompatActivity; 302a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails; 312a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.ItemKeyProvider; 322a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.SelectionPredicates; 332a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.SelectionTracker; 342a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.SelectionTracker.SelectionObserver; 352a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.StorageStrategy; 36def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.recyclerview.widget.GridLayoutManager; 37def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.recyclerview.widget.RecyclerView; 38def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas 39def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport com.example.android.supportv7.R; 4063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 4163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay/** 4263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * ContentPager demo activity. 4363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay */ 4463d2846409d84487d4856d3b8d18cc4684352e29Steve McKaypublic class FancySelectionDemoActivity extends AppCompatActivity { 4563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 4663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private static final String TAG = "SelectionDemos"; 4763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private static final String EXTRA_COLUMN_COUNT = "demo-column-count"; 4863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 4963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private FancySelectionDemoAdapter mAdapter; 507fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay private SelectionTracker<Uri> mSelectionTracker; 5163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 5263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private GridLayoutManager mLayout; 5363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private int mColumnCount = 1; // This will get updated when layout changes. 5463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 5563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 5663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay protected void onCreate(Bundle savedInstanceState) { 5763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay super.onCreate(savedInstanceState); 5863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 5963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay setContentView(R.layout.selection_demo_layout); 6063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay RecyclerView recView = (RecyclerView) findViewById(R.id.list); 6163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 6263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mLayout = new GridLayoutManager(this, mColumnCount); 6363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay recView.setLayoutManager(mLayout); 6463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mAdapter = new FancySelectionDemoAdapter(this); 6563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay recView.setAdapter(mAdapter); 6663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay ItemKeyProvider<Uri> keyProvider = mAdapter.getItemKeyProvider(); 6763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 687fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay SelectionTracker.Builder<Uri> builder = new SelectionTracker.Builder<>( 697fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay "fancy-demo", 7063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay recView, 7163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay keyProvider, 727fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay new FancyDetailsLookup(recView), 737fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay StorageStrategy.createParcelableStorage(Uri.class)); 7463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 7563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay // Override default behaviors and build in multi select mode. 767fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay // Call .withSelectionPredicate(SelectionTracker.SelectionPredicate.SINGLE_ANYTHING) 7763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay // for single selection mode. 787fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay mSelectionTracker = builder 797fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay .withSelectionPredicate(SelectionPredicates.createSelectAnything()) 807fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay .withOnDragInitiatedListener(new OnDragInitiatedListener(this)) 817fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay .withOnContextClickListener(new OnContextClickListener(this)) 827fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay .withOnItemActivatedListener(new OnItemActivatedListener(this)) 837fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay .withFocusDelegate(new FocusDelegate(this)) 8463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay .withBandOverlay(R.drawable.selection_demo_band_overlay) 8563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay .build(); 8663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 877fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay // Lazily bind SelectionTracker. Allows us to defer initialization of the 887fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay // SelectionTracker dependency until after the adapter is created. 897fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay mAdapter.bindSelectionHelper(mSelectionTracker); 9063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 9163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay // TODO: Glue selection to ActionMode, since that'll be a common practice. 927fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay mSelectionTracker.addObserver( 9363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay new SelectionObserver<Long>() { 9463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 9563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public void onSelectionChanged() { 967fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay Log.i(TAG, "Selection changed to: " + mSelectionTracker.getSelection()); 9763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 9863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay }); 9963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 10063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay // Restore selection from saved state. 10163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay updateFromSavedState(savedInstanceState); 10263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 10363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 10463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 10563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay protected void onSaveInstanceState(Bundle state) { 10663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay super.onSaveInstanceState(state); 1077fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay mSelectionTracker.onSaveInstanceState(state); 10863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay state.putInt(EXTRA_COLUMN_COUNT, mColumnCount); 10963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 11063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 11163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private void updateFromSavedState(Bundle state) { 1127fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay mSelectionTracker.onRestoreInstanceState(state); 11363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 11463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay if (state != null) { 11563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay if (state.containsKey(EXTRA_COLUMN_COUNT)) { 11663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mColumnCount = state.getInt(EXTRA_COLUMN_COUNT); 11763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mLayout.setSpanCount(mColumnCount); 11863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 11963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 12063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 12163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 12263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 12363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public boolean onCreateOptionsMenu(Menu menu) { 12463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay boolean showMenu = super.onCreateOptionsMenu(menu); 12563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay getMenuInflater().inflate(R.menu.selection_demo_actions, menu); 12663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return showMenu; 12763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 12863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 12963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 13063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @CallSuper 13163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public boolean onPrepareOptionsMenu(Menu menu) { 13263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay super.onPrepareOptionsMenu(menu); 13363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay menu.findItem(R.id.option_menu_add_column).setEnabled(mColumnCount <= 3); 13463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay menu.findItem(R.id.option_menu_remove_column).setEnabled(mColumnCount > 1); 13563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return true; 13663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 13763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 13863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 13963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public boolean onOptionsItemSelected(MenuItem item) { 14063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay switch (item.getItemId()) { 14163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay case R.id.option_menu_add_column: 14263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay // TODO: Add columns 14363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mLayout.setSpanCount(++mColumnCount); 14463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return true; 14563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 14663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay case R.id.option_menu_remove_column: 14763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mLayout.setSpanCount(--mColumnCount); 14863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return true; 14963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 15063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay default: 15163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return super.onOptionsItemSelected(item); 15263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 15363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 15463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 15563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 15663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public void onBackPressed() { 1577fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay if (mSelectionTracker.clearSelection()) { 15863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return; 15963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } else { 16063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay super.onBackPressed(); 16163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 16263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 16363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 16463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private static void toast(Context context, String msg) { 16563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); 16663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 16763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 16863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 16963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay protected void onDestroy() { 1707fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay mSelectionTracker.clearSelection(); 17163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay super.onDestroy(); 17263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 17363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 17463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 17563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay protected void onStart() { 17663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay super.onStart(); 17763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mAdapter.loadData(); 17863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 17963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 1807fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay private static final class FocusDelegate extends 1812a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikas androidx.recyclerview.selection.FocusDelegate<Uri> { 18263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 18363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private final Context mContext; 18463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 1857fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay private FocusDelegate(Context context) { 18663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mContext = context; 18763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 18863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 18963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 19063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public void focusItem(ItemDetails<Uri> item) { 19163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay toast(mContext, "Focused item: " + item.getSelectionKey()); 19263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 19363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 19463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 19563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public boolean hasFocusedItem() { 19663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return false; 19763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 19863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 19963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 20063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public int getFocusedPosition() { 20163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return 0; 20263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 20363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 20463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 20563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public void clearFocus() { 20663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay toast(mContext, "Cleared focus."); 20763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 20863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 20963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 2107fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay private static final class OnItemActivatedListener implements 2112a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikas androidx.recyclerview.selection.OnItemActivatedListener<Uri> { 2127fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay 2137fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay private final Context mContext; 2147fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay 2157fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay OnItemActivatedListener(Context context) { 2167fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay mContext = context; 2177fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay } 2187fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay 2197fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay @Override 2207fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay public boolean onItemActivated(ItemDetails<Uri> item, MotionEvent e) { 2217fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay toast(mContext, "Activate item: " + item.getSelectionKey()); 2227fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay return true; 2237fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay } 2247fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay } 2257fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay 2267fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay private static final class OnContextClickListener implements 2272a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikas androidx.recyclerview.selection.OnContextClickListener { 22863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 22963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private final Context mContext; 23063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 2317fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay OnContextClickListener(Context context) { 23263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mContext = context; 23363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 23463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 23563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay @Override 23663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public boolean onContextClick(MotionEvent e) { 23763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay toast(mContext, "Context click received."); 23863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return true; 23963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 24063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay }; 24163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 2427fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay private static final class OnDragInitiatedListener implements 2432a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikas androidx.recyclerview.selection.OnDragInitiatedListener { 24463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 24563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay private final Context mContext; 24663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 2477fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay private OnDragInitiatedListener(Context context) { 24863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay mContext = context; 24963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 25063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay 25163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay public boolean onDragInitiated(MotionEvent e) { 25263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay toast(mContext, "onDragInitiated received."); 25363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay return true; 25463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 25563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay } 25663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay} 257