This repository has been archived by the owner on Nov 8, 2023. It is now read-only.
/
EasyEditSpan.java
144 lines (125 loc) · 4.31 KB
/
EasyEditSpan.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
* Copyright (C) 2011 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 android.text.style;
import android.annotation.NonNull;
import android.app.PendingIntent;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.Parcel;
import android.text.ParcelableSpan;
import android.text.TextUtils;
import android.widget.TextView;
/**
* Provides an easy way to edit a portion of text.
* <p>
* The {@link TextView} uses this span to allow the user to delete a chuck of text in one click.
* <p>
* {@link TextView} removes the span when the user deletes the whole text or modifies it.
* <p>
* This span can be also used to receive notification when the user deletes or modifies the text;
*/
public class EasyEditSpan implements ParcelableSpan {
/**
* The extra key field in the pending intent that describes how the text changed.
*
* @see #TEXT_DELETED
* @see #TEXT_MODIFIED
*/
public static final String EXTRA_TEXT_CHANGED_TYPE =
"android.text.style.EXTRA_TEXT_CHANGED_TYPE";
/**
* The value of {@link #EXTRA_TEXT_CHANGED_TYPE} when the text wrapped by this span is deleted.
*/
public static final int TEXT_DELETED = 1;
/**
* The value of {@link #EXTRA_TEXT_CHANGED_TYPE} when the text wrapped by this span is modified.
*/
public static final int TEXT_MODIFIED = 2;
private final PendingIntent mPendingIntent;
private boolean mDeleteEnabled;
/**
* Creates the span. No intent is sent when the wrapped text is modified or
* deleted.
*/
public EasyEditSpan() {
mPendingIntent = null;
mDeleteEnabled = true;
}
/**
* @param pendingIntent The intent will be sent when the wrapped text is deleted or modified.
* When the pending intent is sent, {@link #EXTRA_TEXT_CHANGED_TYPE} is
* added in the intent to describe how the text changed.
*/
public EasyEditSpan(PendingIntent pendingIntent) {
mPendingIntent = pendingIntent;
mDeleteEnabled = true;
}
/**
* Constructor called from {@link TextUtils} to restore the span.
*/
public EasyEditSpan(@NonNull Parcel source) {
mPendingIntent = source.readParcelable(null, android.app.PendingIntent.class);
mDeleteEnabled = (source.readByte() == 1);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
writeToParcelInternal(dest, flags);
}
/** @hide */
public void writeToParcelInternal(@NonNull Parcel dest, int flags) {
dest.writeParcelable(mPendingIntent, 0);
dest.writeByte((byte) (mDeleteEnabled ? 1 : 0));
}
@Override
public int getSpanTypeId() {
return getSpanTypeIdInternal();
}
/** @hide */
public int getSpanTypeIdInternal() {
return TextUtils.EASY_EDIT_SPAN;
}
/**
* @return True if the {@link TextView} should offer the ability to delete the text.
*
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public boolean isDeleteEnabled() {
return mDeleteEnabled;
}
/**
* Enables or disables the deletion of the text.
*
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public void setDeleteEnabled(boolean value) {
mDeleteEnabled = value;
}
/**
* @return the pending intent to send when the wrapped text is deleted or modified.
*
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public PendingIntent getPendingIntent() {
return mPendingIntent;
}
}