| /* |
| * 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); |
| } |