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
172a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikaspackage androidx.recyclerview.selection;
1863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
19ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.annotation.NonNull;
202a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
2160dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikasimport androidx.recyclerview.widget.RecyclerView;
2263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
2363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay/**
247fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay * Override methods in this class to provide application specific behaviors
257fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay * related to focusing item.
2663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay *
277fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay * @param <K> Selection key type. @see {@link StorageStrategy} for supported types.
2863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay */
297fb763509e07f98d650efc25c91bff8b1cb239acSteve McKaypublic abstract class FocusDelegate<K> {
3063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
31c05db2551709fb74903cce69f3e4b9f553e607afJake Wharton    static <K> FocusDelegate<K> dummy() {
327fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay        return new FocusDelegate<K>() {
3363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            @Override
347fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay            public void focusItem(@NonNull ItemDetails<K> item) {
3563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
3663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
3763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            @Override
3863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            public boolean hasFocusedItem() {
3963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                return false;
4063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
4163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
4263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            @Override
4363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            public int getFocusedPosition() {
4463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                return RecyclerView.NO_POSITION;
4563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
4663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
4763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            @Override
4863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            public void clearFocus() {
4963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay            }
5063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        };
5163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
5263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
5363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    /**
5463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     * If environment supports focus, focus {@code item}.
5563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     */
567fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay    public abstract void focusItem(@NonNull ItemDetails<K> item);
5763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
5863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    /**
5963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     * @return true if there is a focused item.
6063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     */
6163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public abstract boolean hasFocusedItem();
6263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
6363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    /**
6463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     * @return the position of the currently focused item, if any.
6563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     */
6663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public abstract int getFocusedPosition();
6763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
6863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    /**
6963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     * If the environment supports focus and something is focused, unfocus it.
7063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay     */
7163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public abstract void clearFocus();
7263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay}
73