// Copyright 2016 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.blimp;
import android.content.Context;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.blimp_public.BlimpClientContext;
import org.chromium.blimp_public.BlimpClientContextDelegate;
import org.chromium.chrome.browser.ApplicationLifetime;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.signin.AccountSigninActivity;
import org.chromium.chrome.browser.signin.SigninAccessPoint;
/**
* The ChromeBlimpClientContextDelegate for //chrome which provides the necessary functionality
* required to run Blimp. This is the Java counterparty to the C++
* ChromeBlimpClientContextDelegateAndroid.
*
* There can only be a single delegate for any given BlimpClientContext. To create one and attach
* it, call {@link ChromeBlimpClientContextDelegate#createAndSetDelegateForContext(Profile)}.
* When the delegate should be deleted, a call to {@link #destroy} is required.
*/
public class ChromeBlimpClientContextDelegate implements BlimpClientContextDelegate {
/**
* {@link BlimpClientContext} associated with this delegate.
*/
private BlimpClientContext mBlimpClientContext;
/**
* Creates a new ChromeBlimpClientContextDelegate that is owned by the caller. It automatically
* attaches itself as the sole delegate for the BlimpClientContext attached to the given
* profile. When the delegate should be deleted, the caller of this method must call
* {@link #destroy()} to ensure that the native counterparts are cleaned up. The call to
* {@link #destroy()} also removes the delegate from the BlimpClientContext by clearing the
* pointer for the delegate by calling BlimpClientContext::SetDelegate(nullptr).
*
* @param profile The profile to use to look for the BlimpClientContext.
* @return The newly created delegate, owned by the caller.
*/
public static ChromeBlimpClientContextDelegate createAndSetDelegateForContext(Profile profile) {
return new ChromeBlimpClientContextDelegate(profile);
}
/**
* @return {@link BlimpClientContext} object this delegate belongs to.
*/
public BlimpClientContext getBlimpClientContext() {
return mBlimpClientContext;
}
@Override
public void restartBrowser() {
ApplicationLifetime.terminate(true);
}
@Override
public void startUserSignInFlow(Context context) {
// TODO(xingliu): Figure out if Blimp should have its own SigninAccessPoint.
AccountSigninActivity.startAccountSigninActivity(context, SigninAccessPoint.SETTINGS);
}
/**
* The pointer to the ChromeBlimpClientContextDelegateAndroid JNI bridge.
*/
private long mNativeChromeBlimpClientContextDelegateAndroid;
private ChromeBlimpClientContextDelegate(Profile profile) {
// Create native delegate object.
mNativeChromeBlimpClientContextDelegateAndroid = nativeInit(profile);
BlimpClientContext context =
BlimpClientContextFactory.getBlimpClientContextForProfile(profile);
mBlimpClientContext = context;
// Set ourselves as the Java delegate object.
mBlimpClientContext.setDelegate(this);
// Connect to engine on start up.
if (mBlimpClientContext.isBlimpEnabled()) {
mBlimpClientContext.connect();
}
}
@CalledByNative
private void clearNativePtr() {
mNativeChromeBlimpClientContextDelegateAndroid = 0;
}
public void destroy() {
assert mNativeChromeBlimpClientContextDelegateAndroid != 0;
nativeDestroy(mNativeChromeBlimpClientContextDelegateAndroid);
}
private native long nativeInit(Profile profile);
private native void nativeDestroy(long nativeChromeBlimpClientContextDelegateAndroid);
}