blob: 80b9f097e0348713744995cc611f72fee858f71c [file] [log] [blame]
/*
* 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.contentcaptureservice.cts;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import com.android.compatibility.common.util.DoubleVisitor;
/**
* Base class for classes that have a {@code root_view} root view.
*/
abstract class AbstractRootViewActivity extends AbstractContentCaptureActivity {
private static final String TAG = AbstractRootViewActivity.class.getSimpleName();
private static DoubleVisitor<AbstractRootViewActivity, LinearLayout> sRootViewVisitor;
private static DoubleVisitor<AbstractRootViewActivity, LinearLayout> sOnAnimationVisitor;
private LinearLayout mRootView;
/**
* Sets a visitor called when the activity is created.
*/
static void onRootView(@NonNull DoubleVisitor<AbstractRootViewActivity, LinearLayout> visitor) {
sRootViewVisitor = visitor;
}
/**
* Sets a visitor to be called on {@link Activity#onEnterAnimationComplete()}.
*/
static void onAnimationComplete(
@NonNull DoubleVisitor<AbstractRootViewActivity, LinearLayout> visitor) {
sOnAnimationVisitor = visitor;
}
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentViewOnCreate(savedInstanceState);
mRootView = findViewById(getTargetRootView());
Log.d(TAG, "onCreate(): parents for " + getClass() + ": rootView=" + mRootView
+ "\ngrandParent=" + getGrandParent()
+ "\ngrandGrandParent=" + getGrandGrandParent());
if (sRootViewVisitor != null) {
Log.d(TAG, "Applying visitor to " + this + "/" + mRootView);
try {
sRootViewVisitor.visit(this, mRootView);
} finally {
sRootViewVisitor = null;
}
}
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "AutofillIds for " + getClass() + ": "
+ " rootView=" + getRootView().getAutofillId()
+ ", grandParent=" + getGrandParent().getAutofillId()
+ ", grandGrandParent=" + getGrandGrandParent().getAutofillId());
}
@Override
public void onEnterAnimationComplete() {
if (sOnAnimationVisitor != null) {
Log.i(TAG, "onEnterAnimationComplete(): applying visitor on " + this);
try {
sOnAnimationVisitor.visit(this, mRootView);
} finally {
sOnAnimationVisitor = null;
}
} else {
Log.i(TAG, "onEnterAnimationComplete(): no visitor on " + this);
}
}
public LinearLayout getRootView() {
return mRootView;
}
// TODO(b/122315042): remove this method when not needed anymore
@NonNull
public ViewGroup getGrandParent() {
return (ViewGroup) mRootView.getParent();
}
// TODO(b/122315042): remove this method when not needed anymore
@NonNull
public ViewGroup getGrandGrandParent() {
return (ViewGroup) getGrandParent().getParent();
}
protected int getTargetRootView() {
return R.id.root_view;
}
/**
* The real "onCreate" method that should be extended by subclasses.
*
*/
protected abstract void setContentViewOnCreate(Bundle savedInstanceState);
}