/
DateSelector.java
128 lines (111 loc) · 3.8 KB
/
DateSelector.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.material.datepicker;
import com.google.android.material.R;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.annotation.StringRes;
import androidx.annotation.StyleRes;
import androidx.core.util.Pair;
import com.google.android.material.internal.ViewUtils;
import java.util.Collection;
/**
* Interface for users of {@link MaterialCalendar<S>} to control how the Calendar displays and
* returns selections.
*
* <p>Implementors must implement {@link Parcelable} so that selection can be maintained through
* Lifecycle events (e.g., Fragment destruction).
*
* <p>Dates are represented as times in UTC milliseconds.
*
* @param <S> The type of item available when cells are selected in the {@link AdapterView}
* @hide
*/
@RestrictTo(Scope.LIBRARY_GROUP)
public interface DateSelector<S> extends Parcelable {
/** Returns the current selection. */
@Nullable
S getSelection();
/** Returns true if the current selection is acceptable. */
boolean isSelectionComplete();
/**
* Sets the current selection to {@code selection}.
*
* @throws IllegalArgumentException If {@code selection} creates an invalid state.
*/
void setSelection(@NonNull S selection);
/**
* Allows this selection handler to respond to clicks within the {@link AdapterView}.
*
* @param selection The selected day represented as time in UTC milliseconds.
*/
void select(long selection);
/**
* Returns a list of longs whose time value represents days that should be marked selected.
*
* <p>Uses {@code R.styleable.MaterialCalendar_daySelectedStyle} for styling.
*/
@NonNull
Collection<Long> getSelectedDays();
/**
* Returns a list of ranges whose time values represent ranges that should be filled.
*
* <p>Uses {@code R.styleable.MaterialCalendar_rangeFillColor} for styling.
*/
@NonNull
Collection<Pair<Long, Long>> getSelectedRanges();
@NonNull
String getSelectionDisplayString(Context context);
@StringRes
int getDefaultTitleResId();
@StyleRes
int getDefaultThemeResId(Context context);
@NonNull
View onCreateTextInputView(
@NonNull LayoutInflater layoutInflater,
@Nullable ViewGroup viewGroup,
@Nullable Bundle bundle,
@NonNull CalendarConstraints constraints,
@NonNull OnSelectionChangedListener<S> listener);
static void showKeyboardWithAutoHideBehavior(@NonNull EditText... editTexts) {
if (editTexts.length == 0) {
return;
}
View.OnFocusChangeListener listener =
(view, hasFocus) -> {
for (EditText editText : editTexts) {
if (editText.hasFocus()) {
return;
}
}
ViewUtils.hideKeyboard(view);
};
for (EditText editText : editTexts) {
editText.setOnFocusChangeListener(listener);
}
ViewUtils.requestFocusAndShowKeyboard(editTexts[0]);
}
}