Merge "onDetachedFromWindow is called before onAttachedToWindow"
This commit is contained in:
@@ -176,6 +176,7 @@ public final class ViewRoot extends Handler implements ViewParent,
|
||||
private final Surface mSurface = new Surface();
|
||||
|
||||
boolean mAdded;
|
||||
private boolean mAttached;
|
||||
boolean mAddedTouchMode;
|
||||
|
||||
/*package*/ int mAddNesting;
|
||||
@@ -762,7 +763,10 @@ public final class ViewRoot extends Handler implements ViewParent,
|
||||
attachInfo.mKeepScreenOn = false;
|
||||
viewVisibilityChanged = false;
|
||||
mLastConfiguration.setTo(host.getResources().getConfiguration());
|
||||
host.dispatchAttachedToWindow(attachInfo, 0);
|
||||
if (!mAttached) {
|
||||
host.dispatchAttachedToWindow(attachInfo, 0);
|
||||
mAttached = true;
|
||||
}
|
||||
//Log.i(TAG, "Screen on initialized: " + attachInfo.mKeepScreenOn);
|
||||
|
||||
} else {
|
||||
@@ -1743,8 +1747,9 @@ public final class ViewRoot extends Handler implements ViewParent,
|
||||
void dispatchDetachedFromWindow() {
|
||||
if (Config.LOGV) Log.v(TAG, "Detaching in " + this + " of " + mSurface);
|
||||
|
||||
if (mView != null) {
|
||||
if (mView != null && mAttached) {
|
||||
mView.dispatchDetachedFromWindow();
|
||||
mAttached = false;
|
||||
}
|
||||
|
||||
mView = null;
|
||||
|
||||
@@ -96,6 +96,12 @@
|
||||
|
||||
<application android:theme="@style/Theme">
|
||||
<uses-library android:name="android.test.runner" />
|
||||
<activity android:name="android.view.ViewAttachTestActivity" android:label="View Attach Test">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="StubTestBrowserActivity" android:label="Stubbed Test Browser">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
|
||||
12
core/tests/coretests/res/layout/attach_view_test.xml
Normal file
12
core/tests/coretests/res/layout/attach_view_test.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent">
|
||||
<android.view.ViewAttachView
|
||||
android:id="@+id/view_attach_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:keepScreenOn="true"/>
|
||||
</LinearLayout>
|
||||
54
core/tests/coretests/src/android/view/ViewAttachTest.java
Normal file
54
core/tests/coretests/src/android/view/ViewAttachTest.java
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* 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.view;
|
||||
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.os.SystemClock;
|
||||
import android.test.ActivityInstrumentationTestCase2;
|
||||
|
||||
public class ViewAttachTest extends
|
||||
ActivityInstrumentationTestCase2<ViewAttachTestActivity> {
|
||||
|
||||
public ViewAttachTest() {
|
||||
super(ViewAttachTestActivity.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure that onAttachedToWindow and onDetachedToWindow is called in the
|
||||
* correct order The ViewAttachTestActivity contains a view that will throw
|
||||
* an RuntimeException if onDetachedToWindow and onAttachedToWindow is
|
||||
* called in the wrong order.
|
||||
*
|
||||
* 1. Initiate the activity 2. Perform a series of orientation changes to
|
||||
* the activity (this will force the View hierarchy to be rebuild,
|
||||
* generating onAttachedToWindow and onDetachedToWindow)
|
||||
*
|
||||
* Expected result: No RuntimeException is thrown from the TestView in
|
||||
* ViewFlipperTestActivity.
|
||||
*
|
||||
* @throws Throwable
|
||||
*/
|
||||
public void testAttached() throws Throwable {
|
||||
final ViewAttachTestActivity activity = getActivity();
|
||||
for (int i = 0; i < 20; i++) {
|
||||
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
||||
SystemClock.sleep(250);
|
||||
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
||||
SystemClock.sleep(250);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.view;
|
||||
|
||||
import com.android.frameworks.coretests.R;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
|
||||
public class ViewAttachTestActivity extends Activity {
|
||||
public static final String TAG = "OnAttachedTest";
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.attach_view_test);
|
||||
}
|
||||
}
|
||||
80
core/tests/coretests/src/android/view/ViewAttachView.java
Normal file
80
core/tests/coretests/src/android/view/ViewAttachView.java
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* 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.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.os.SystemClock;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
/**
|
||||
* A View that will throw a RuntimeException if onAttachedToWindow and
|
||||
* onDetachedFromWindow is called in the wrong order for ViewAttachTest
|
||||
*/
|
||||
public class ViewAttachView extends View {
|
||||
public static final String TAG = "OnAttachedTest";
|
||||
private boolean attached;
|
||||
|
||||
public ViewAttachView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
init(attrs, defStyle);
|
||||
}
|
||||
|
||||
public ViewAttachView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init(attrs, 0);
|
||||
}
|
||||
|
||||
public ViewAttachView(Context context) {
|
||||
super(context);
|
||||
init(null, 0);
|
||||
}
|
||||
|
||||
private void init(AttributeSet attrs, int defStyle) {
|
||||
SystemClock.sleep(2000);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onAttachedToWindow() {
|
||||
Log.d(TAG, "onAttachedToWindow");
|
||||
super.onAttachedToWindow();
|
||||
if (attached) {
|
||||
throw new RuntimeException("OnAttachedToWindow called more than once in a row");
|
||||
}
|
||||
attached = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
Log.d(TAG, "onDetachedFromWindow");
|
||||
super.onDetachedFromWindow();
|
||||
if (!attached) {
|
||||
throw new RuntimeException(
|
||||
"onDetachedFromWindowcalled without prior call to OnAttachedToWindow");
|
||||
}
|
||||
attached = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
super.onDraw(canvas);
|
||||
canvas.drawColor(Color.BLUE);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user