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