blob: 95372a0637e00a6fb65a4c85bab562870ba17112 [file] [log] [blame]
// Copyright 2017 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.chrome.browser.vr;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import org.chromium.base.metrics.CachedMetrics.BooleanHistogramSample;
import org.chromium.chrome.browser.util.IntentUtils;
/**
* Handles the DOFF flow when Chrome is launched in VR mode and the FRE is not complete. This is
* needed because VrCore doesn't allow calling DOFF from a non-active VR activity (b/63435686), so
* we can't do it from {@link FirstRunActivity}. The android:enableVrMode attribute in the manifest
* makes this a VR activity allowing us to call DOFF before triggering the standard 2D FRE flow.
* This should be removed when b/63435686 is fixed.
*/
public class VrFirstRunActivity extends Activity {
private static final long SHOW_DOFF_TIMEOUT_MS = 500;
private static final BooleanHistogramSample sFreNotCompleteBrowserHistogram =
new BooleanHistogramSample("VRFreNotComplete.Browser");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
assert VrIntentUtils.isVrIntent(getIntent());
recordFreHistogram();
// VrCore version M21 allows a transitioning VR activity to call DOFF and requires that
// we set VR mode programmatically. Up until then, this hack of having a pure VR activity
// works, but there's still a race every now and then that causes Chrome to crash and
// that's why we have a timeout below before we call DOFF. Redundantly setting VR mode
// here ensures that this never happens for users running the latest version of VrCore.
VrShellDelegate.setVrModeEnabled(this, true);
VrDaydreamApi daydreamApi = VrShellDelegate.getVrDaydreamApi();
if (!daydreamApi.isDaydreamCurrentViewer()) {
showFre();
return;
}
// Show DOFF with a timeout so that this activity has enough time to be the active VR
// app.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
daydreamApi.exitFromVr(
VrFirstRunActivity.this, VrShellDelegate.EXIT_VR_RESULT, new Intent());
}
}, SHOW_DOFF_TIMEOUT_MS);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode != VrShellDelegate.EXIT_VR_RESULT) return;
if (resultCode == Activity.RESULT_OK) {
showFre();
return;
}
finish();
VrShellDelegate.getVrDaydreamApi().launchVrHomescreen();
}
private void showFre() {
// Start the actual 2D FRE if the user successfully exited VR.
Intent freIntent = (Intent) IntentUtils.safeGetParcelableExtra(
getIntent(), VrIntentUtils.VR_FRE_INTENT_EXTRA);
IntentUtils.safeStartActivity(this, freIntent);
finish();
}
private void recordFreHistogram() {
sFreNotCompleteBrowserHistogram.record(true);
}
}