blob: b7a720c8b6a1849539ce7481326b79aad472d12b [file] [log] [blame]
Steve McKay878b2712017-08-21 15:17:09 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.documentsui;
18
Riddle Hsu0c375982018-06-21 22:06:43 +080019import android.os.Bundle;
20import android.view.MotionEvent;
Steve McKay878b2712017-08-21 15:17:09 -070021
Riddle Hsu0c375982018-06-21 22:06:43 +080022import androidx.annotation.VisibleForTesting;
23import androidx.recyclerview.selection.ItemDetailsLookup;
24import androidx.recyclerview.selection.ItemKeyProvider;
25import androidx.recyclerview.selection.MutableSelection;
26import androidx.recyclerview.selection.Selection;
27import androidx.recyclerview.selection.SelectionTracker;
28import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver;
Steve McKay878b2712017-08-21 15:17:09 -070029
30import java.util.Set;
31
Steve McKay878b2712017-08-21 15:17:09 -070032/**
33 * DocumentsUI SelectManager implementation that creates delegate instances
34 * each time reset is called.
35 */
Riddle Hsu0c375982018-06-21 22:06:43 +080036public final class DocsSelectionHelper extends SelectionTracker<String> {
Steve McKay878b2712017-08-21 15:17:09 -070037
Steve McKay8fc9d892017-08-22 13:57:45 -070038 private final DelegateFactory mFactory;
Steve McKay878b2712017-08-21 15:17:09 -070039
Steve McKay7bd7f0d2018-04-27 14:24:25 -070040 // initialize to a dummy object incase we get some input
41 // event drive calls before we're properly initialized.
42 // See: b/69306667.
Riddle Hsu0c375982018-06-21 22:06:43 +080043 private SelectionTracker<String> mDelegate = new DummySelectionTracker<>();
Steve McKay8fc9d892017-08-22 13:57:45 -070044
45 @VisibleForTesting
Riddle Hsu0c375982018-06-21 22:06:43 +080046 DocsSelectionHelper(DelegateFactory factory) {
Steve McKay8fc9d892017-08-22 13:57:45 -070047 mFactory = factory;
Steve McKay878b2712017-08-21 15:17:09 -070048 }
49
Riddle Hsu0c375982018-06-21 22:06:43 +080050 public void reset(SelectionTracker<String> selectionTracker) {
Steve McKay878b2712017-08-21 15:17:09 -070051 if (mDelegate != null) {
52 mDelegate.clearSelection();
53 }
Riddle Hsu0c375982018-06-21 22:06:43 +080054 mDelegate = mFactory.create(selectionTracker);
Steve McKay878b2712017-08-21 15:17:09 -070055 }
56
57 @Override
Steve McKay365e3cb2017-08-31 10:27:08 -070058 public void addObserver(SelectionObserver listener) {
59 mDelegate.addObserver(listener);
Steve McKay878b2712017-08-21 15:17:09 -070060 }
61
62 @Override
63 public boolean hasSelection() {
64 return mDelegate.hasSelection();
65 }
66
67 @Override
Riddle Hsu0c375982018-06-21 22:06:43 +080068 public Selection<String> getSelection() {
Steve McKay878b2712017-08-21 15:17:09 -070069 return mDelegate.getSelection();
70 }
71
72 @Override
Riddle Hsu0c375982018-06-21 22:06:43 +080073 public void copySelection(MutableSelection<String> dest) {
Steve McKay2d19a692017-08-22 09:05:08 -070074 mDelegate.copySelection(dest);
Steve McKay878b2712017-08-21 15:17:09 -070075 }
76
Steve McKay365e3cb2017-08-31 10:27:08 -070077 @Override
78 public boolean isSelected(String id) {
79 return mDelegate.isSelected(id);
80 }
81
Steve McKay878b2712017-08-21 15:17:09 -070082 @VisibleForTesting
83 public void replaceSelection(Iterable<String> ids) {
Steve McKay2d19a692017-08-22 09:05:08 -070084 mDelegate.clearSelection();
85 mDelegate.setItemsSelected(ids, true);
Steve McKay878b2712017-08-21 15:17:09 -070086 }
87
88 @Override
Steve McKay878b2712017-08-21 15:17:09 -070089 public boolean setItemsSelected(Iterable<String> ids, boolean selected) {
90 return mDelegate.setItemsSelected(ids, selected);
91 }
92
93 @Override
Riddle Hsu0c375982018-06-21 22:06:43 +080094 public boolean clearSelection() {
95 return mDelegate.clearSelection();
Steve McKay878b2712017-08-21 15:17:09 -070096 }
97
98 @Override
Steve McKay365e3cb2017-08-31 10:27:08 -070099 public boolean select(String modelId) {
100 return mDelegate.select(modelId);
Steve McKay878b2712017-08-21 15:17:09 -0700101 }
102
103 @Override
Steve McKay365e3cb2017-08-31 10:27:08 -0700104 public boolean deselect(String modelId) {
105 return mDelegate.deselect(modelId);
Steve McKay878b2712017-08-21 15:17:09 -0700106 }
107
108 @Override
Steve McKay365e3cb2017-08-31 10:27:08 -0700109 public void startRange(int pos) {
110 mDelegate.startRange(pos);
Steve McKay878b2712017-08-21 15:17:09 -0700111 }
112
113 @Override
Steve McKay365e3cb2017-08-31 10:27:08 -0700114 public void extendRange(int pos) {
115 mDelegate.extendRange(pos);
Steve McKay878b2712017-08-21 15:17:09 -0700116 }
117
118 @Override
Steve McKay365e3cb2017-08-31 10:27:08 -0700119 public void endRange() {
120 mDelegate.endRange();
Steve McKay878b2712017-08-21 15:17:09 -0700121 }
122
123 @Override
Steve McKay365e3cb2017-08-31 10:27:08 -0700124 public boolean isRangeActive() {
125 return mDelegate.isRangeActive();
Steve McKay878b2712017-08-21 15:17:09 -0700126 }
127
128 @Override
Steve McKay365e3cb2017-08-31 10:27:08 -0700129 public void anchorRange(int position) {
130 mDelegate.anchorRange(position);
Steve McKay878b2712017-08-21 15:17:09 -0700131 }
Steve McKay8fc9d892017-08-22 13:57:45 -0700132
Riddle Hsu0c375982018-06-21 22:06:43 +0800133 @Override
134 public void onSaveInstanceState(Bundle state) {
135 mDelegate.onSaveInstanceState(state);
Steve McKay8fc9d892017-08-22 13:57:45 -0700136 }
137
Riddle Hsu0c375982018-06-21 22:06:43 +0800138 @Override
139 public void onRestoreInstanceState(Bundle state) {
140 mDelegate.onRestoreInstanceState(state);
141 }
142
143 // Below overridden protected methods are not used for delegation. These empty implementations
144 // are just required by abstract declaration of parent class.
145 @Override
146 protected void restoreSelection(Selection<String> selection) {
147 }
148
149 @Override
150 protected AdapterDataObserver getAdapterDataObserver() {
151 return null;
152 }
153
154 @Override
155 protected void extendProvisionalRange(int position) {
156 }
157
158 @Override
159 protected void setProvisionalSelection(Set<String> newSelection) {
160 }
161
162 @Override
163 protected void clearProvisionalSelection() {
164 }
165
166 @Override
167 protected void mergeProvisionalSelection() {
168 }
169
170 public static DocsSelectionHelper create() {
171 return new DocsSelectionHelper(DelegateFactory.INSTANCE);
Steve McKay8fc9d892017-08-22 13:57:45 -0700172 }
173
174 /**
175 * Use of a factory to create selection manager instances allows testable instances to
176 * be inject from tests.
177 */
178 @VisibleForTesting
179 static class DelegateFactory {
180 static final DelegateFactory INSTANCE = new DelegateFactory();
181
Riddle Hsu0c375982018-06-21 22:06:43 +0800182 SelectionTracker<String> create(SelectionTracker<String> selectionTracker) {
183 return selectionTracker;
Steve McKay8fc9d892017-08-22 13:57:45 -0700184 }
185 }
Steve McKay7bd7f0d2018-04-27 14:24:25 -0700186
187 /**
Riddle Hsu0c375982018-06-21 22:06:43 +0800188 * Facilitates the use of ItemDetailsLookup.
Steve McKay7bd7f0d2018-04-27 14:24:25 -0700189 */
Riddle Hsu0c375982018-06-21 22:06:43 +0800190 public static abstract class DocDetailsLookup extends ItemDetailsLookup<String> {
Steve McKay7bd7f0d2018-04-27 14:24:25 -0700191
Riddle Hsu0c375982018-06-21 22:06:43 +0800192 // Override as public for usages in other packages.
Steve McKay7bd7f0d2018-04-27 14:24:25 -0700193 @Override
Riddle Hsu0c375982018-06-21 22:06:43 +0800194 public boolean overItemWithSelectionKey(MotionEvent e) {
195 return super.overItemWithSelectionKey(e);
Steve McKay7bd7f0d2018-04-27 14:24:25 -0700196 }
Riddle Hsu0c375982018-06-21 22:06:43 +0800197 }
Steve McKay7bd7f0d2018-04-27 14:24:25 -0700198
Riddle Hsu0c375982018-06-21 22:06:43 +0800199 /**
200 * Facilitates the use of stable ids.
201 */
202 public static abstract class StableIdProvider extends ItemKeyProvider<String> {
Steve McKay7bd7f0d2018-04-27 14:24:25 -0700203
Riddle Hsu0c375982018-06-21 22:06:43 +0800204 protected StableIdProvider() {
205 super(ItemKeyProvider.SCOPE_MAPPED);
Steve McKay7bd7f0d2018-04-27 14:24:25 -0700206 }
207 }
Steve McKay878b2712017-08-21 15:17:09 -0700208}