summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/DateTimeView.java6
-rw-r--r--core/tests/coretests/src/android/widget/DateTimeViewTest.java41
2 files changed, 45 insertions, 2 deletions
diff --git a/core/java/android/widget/DateTimeView.java b/core/java/android/widget/DateTimeView.java
index a22f345bb2fc..621a745053eb 100644
--- a/core/java/android/widget/DateTimeView.java
+++ b/core/java/android/widget/DateTimeView.java
@@ -450,8 +450,10 @@ public class DateTimeView extends TextView {
public void removeView(DateTimeView v) {
synchronized (mAttachedViews) {
- mAttachedViews.remove(v);
- if (mAttachedViews.isEmpty()) {
+ final boolean removed = mAttachedViews.remove(v);
+ // Only unregister once when we remove the last view in the list otherwise we risk
+ // trying to unregister a receiver that is no longer registered.
+ if (removed && mAttachedViews.isEmpty()) {
unregister(getApplicationContextIfAvailable(v.getContext()));
}
}
diff --git a/core/tests/coretests/src/android/widget/DateTimeViewTest.java b/core/tests/coretests/src/android/widget/DateTimeViewTest.java
new file mode 100644
index 000000000000..fbf0d36bac09
--- /dev/null
+++ b/core/tests/coretests/src/android/widget/DateTimeViewTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2018 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.widget;
+
+import android.support.test.InstrumentationRegistry;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DateTimeViewTest {
+
+ @UiThreadTest
+ @Test
+ public void additionalOnDetachedFromWindow_noException() {
+ final DateTimeView dateTimeView = new DateTimeView(InstrumentationRegistry.getContext());
+ dateTimeView.onAttachedToWindow();
+ dateTimeView.onAttachedToWindow();
+ // Even there is an additional detach (abnormal), DateTimeView should not unregister
+ // receiver again that raises "java.lang.IllegalArgumentException: Receiver not registered".
+ dateTimeView.onDetachedFromWindow();
+ }
+}