Commit e26c22f0 authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

WebLayer: add TelemetryActivity

This activity has no visible UI, and is to be used for perf tests
so that performance measurements won't be affected by changes to
WebLayerShellActivity. If we don't do this, we're forced to keep
the shell's top chrome the exact same size forever. See linked bug.

Android WebView also has a TelemetryActivity.

Bug: 1045609
Change-Id: I7aa0443ef93a225ed6b594aba09d4c64158408ed
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2052805Reviewed-by: default avatarClark DuVall <cduvall@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#742185}
parent 56c87e21
......@@ -32,6 +32,7 @@ android_library("weblayer_shell_java") {
]
sources = [
"shell_apk/src/org/chromium/weblayer/shell/InstrumentationActivity.java",
"shell_apk/src/org/chromium/weblayer/shell/TelemetryActivity.java",
"shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java",
]
}
......
......@@ -29,6 +29,9 @@
</activity>
<activity android:name="InstrumentationActivity">
</activity>
<activity android:name="TelemetryActivity"
android:theme="@android:style/Theme.Holo.Light.NoActionBar">
</activity>
{% if weblayer_package is defined %}
<meta-data android:name="org.chromium.weblayer.WebLayerPackage"
android:value="{{ weblayer_package }}"/>
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.weblayer.shell;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.InputType;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import org.chromium.weblayer.Browser;
import org.chromium.weblayer.Profile;
import org.chromium.weblayer.Tab;
import org.chromium.weblayer.TabCallback;
import org.chromium.weblayer.UnsupportedVersionException;
import org.chromium.weblayer.WebLayer;
import java.util.List;
/**
* Activity for running performance tests.
*
* There's no visible chrome, just content.
*/
public class TelemetryActivity extends FragmentActivity {
private static final String KEY_MAIN_VIEW_ID = "mainViewId";
private Profile mProfile;
private Fragment mFragment;
private Browser mBrowser;
private Tab mTab;
private EditText mUrlView;
private View mMainView;
private int mMainViewId;
private ViewGroup mTopContentsContainer;
private Bundle mSavedInstanceState;
private TabCallback mTabCallback;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSavedInstanceState = savedInstanceState;
LinearLayout mainView = new LinearLayout(this);
if (savedInstanceState == null) {
mMainViewId = View.generateViewId();
} else {
mMainViewId = savedInstanceState.getInt(KEY_MAIN_VIEW_ID);
}
mainView.setId(mMainViewId);
mMainView = mainView;
setContentView(mainView);
mUrlView = new EditText(this);
mUrlView.setId(View.generateViewId());
mUrlView.setSelectAllOnFocus(true);
mUrlView.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
mUrlView.setImeOptions(EditorInfo.IME_ACTION_GO);
// The background of the top-view must be opaque, otherwise it bleeds through to the
// cc::Layer that mirrors the contents of the top-view.
mUrlView.setBackgroundColor(0xFFa9a9a9);
// Top contents container is zero height so changes to the UI don't affect viewport size and
// performance.
mTopContentsContainer = new RelativeLayout(this);
mTopContentsContainer.addView(
mUrlView, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0));
// If activity is re-created during process restart, FragmentManager attaches
// BrowserFragment immediately, resulting in synchronous init. By the time this line
// executes, the synchronous init has already happened, so WebLayer#createAsync will
// deliver WebLayer instance to callbacks immediately.
createWebLayerAsync();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mTabCallback != null) {
mTab.unregisterTabCallback(mTabCallback);
mTabCallback = null;
}
}
private void createWebLayerAsync() {
try {
WebLayer.loadAsync(getApplicationContext(), webLayer -> onWebLayerReady());
} catch (UnsupportedVersionException e) {
throw new RuntimeException("Failed to initialize WebLayer", e);
}
}
private void onWebLayerReady() {
if (mBrowser != null || isFinishing() || isDestroyed()) return;
mFragment = getOrCreateBrowserFragment();
mBrowser = Browser.fromFragment(mFragment);
mProfile = mBrowser.getProfile();
mBrowser.setTopView(mTopContentsContainer);
setTab(mBrowser.getActiveTab());
if (getIntent() != null) {
mTab.getNavigationController().navigate(Uri.parse(getIntent().getDataString()));
}
}
private void setTab(Tab tab) {
assert mTab == null;
mTab = tab;
mTabCallback = new TabCallback() {
@Override
public void onVisibleUriChanged(Uri uri) {
mUrlView.setText(uri.toString());
}
};
mTab.registerTabCallback(mTabCallback);
}
private Fragment getOrCreateBrowserFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
if (mSavedInstanceState != null) {
// FragmentManager could have re-created the fragment.
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments.size() > 1) {
throw new IllegalStateException("More than one fragment added, shouldn't happen");
}
if (fragments.size() == 1) {
return fragments.get(0);
}
}
return createBrowserFragment(mMainViewId);
}
private Fragment createBrowserFragment(int viewId) {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = WebLayer.createBrowserFragment("DefaultProfile", null);
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(viewId, fragment);
// Note the commitNow() instead of commit(). We want the fragment to get attached to
// activity synchronously, so we can use all the functionality immediately. Otherwise we'd
// have to wait until the commit is executed.
transaction.commitNow();
return fragment;
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment