diff options
| -rw-r--r-- | core/java/android/widget/DateTimeView.java | 6 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/widget/DateTimeViewTest.java | 41 |
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(); + } +} |