| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/gsa/GSAServiceClient.java
|
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/gsa/GSAServiceClient.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/gsa/GSAServiceClient.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a0082ab56e14bd85ef15b246033a87e99e62ad54
|
| --- /dev/null
|
| +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/gsa/GSAServiceClient.java
|
| @@ -0,0 +1,139 @@
|
| +// Copyright 2015 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.gsa;
|
| +
|
| +import android.content.ComponentName;
|
| +import android.content.Context;
|
| +import android.content.Intent;
|
| +import android.content.ServiceConnection;
|
| +import android.os.Bundle;
|
| +import android.os.Handler;
|
| +import android.os.IBinder;
|
| +import android.os.Message;
|
| +import android.os.Messenger;
|
| +import android.os.RemoteException;
|
| +import android.util.Log;
|
| +
|
| +import org.chromium.chrome.browser.ChromeMobileApplication;
|
| +
|
| +/**
|
| + * A simple client that connects and talks to the GSAService using Messages.
|
| + */
|
| +public class GSAServiceClient {
|
| + private static final String TAG = "GSAServiceClient";
|
| +
|
| + /**
|
| + * Constants for gsa communication. These should not change without corresponding changes on the
|
| + * service side in GSA.
|
| + */
|
| + private static final String GSA_SERVICE =
|
| + "com.google.android.ssb.action.SSB_SERVICE";
|
| + public static final int REQUEST_REGISTER_CLIENT = 2;
|
| + public static final int RESPONSE_UPDATE_SSB = 3;
|
| +
|
| + public static final String KEY_GSA_STATE = "ssb_service:ssb_state";
|
| + public static final String KEY_GSA_CONTEXT = "ssb_service:ssb_context";
|
| + public static final String KEY_GSA_PACKAGE_NAME = "ssb_service:ssb_package_name";
|
| +
|
| + /** Messenger to handle incoming messages from the service */
|
| + private final Messenger mMessenger = new Messenger(new IncomingHandler());
|
| + private final GSAServiceConnection mConnection;
|
| + private final GSAHelper mGsaHelper;
|
| + private Context mContext;
|
| +
|
| + /** Messenger for communicating with service. */
|
| + private Messenger mService;
|
| +
|
| +
|
| + /**
|
| + * Handler of incoming messages from service.
|
| + */
|
| + private class IncomingHandler extends Handler {
|
| + @Override
|
| + public void handleMessage(Message msg) {
|
| + if (msg.what == RESPONSE_UPDATE_SSB) {
|
| + if (mService == null) return;
|
| + Bundle bundle = (Bundle) msg.obj;
|
| + String account =
|
| + mGsaHelper.getGSAAccountFromState(bundle.getByteArray(KEY_GSA_STATE));
|
| + GSAState.getInstance(mContext.getApplicationContext()).setGsaAccount(account);
|
| + } else {
|
| + super.handleMessage(msg);
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Constructs an instance of this class.
|
| + */
|
| + public GSAServiceClient(Context context) {
|
| + mContext = context;
|
| + mConnection = new GSAServiceConnection();
|
| + mGsaHelper = ((ChromeMobileApplication) mContext.getApplicationContext())
|
| + .createGsaHelper();
|
| + }
|
| +
|
| + /**
|
| + * Establishes a connection to the service. Call this method once the callback passed here is
|
| + * ready to handle calls.
|
| + * If you pass in an GSA context, it will be sent up the service as soon as the connection is
|
| + * established.
|
| + * @return Whether or not the connection to the service was established successfully.
|
| + */
|
| + public boolean connect() {
|
| + if (mService != null) Log.e(TAG, "Already connected.");
|
| + Intent intent = new Intent(GSA_SERVICE).setPackage(GSAState.SEARCH_INTENT_PACKAGE);
|
| + return mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
| + }
|
| +
|
| + /**
|
| + * Disconnects from the service and resets the client's state.
|
| + */
|
| + public void disconnect() {
|
| + if (mService == null) return;
|
| +
|
| + mContext.unbindService(mConnection);
|
| + mContext = null;
|
| + mService = null;
|
| + }
|
| +
|
| + /**
|
| + * Indicates whether or not the client is currently connected to the service.
|
| + * @return true if connected, false otherwise.
|
| + */
|
| + public boolean isConnected() {
|
| + return mService != null;
|
| + }
|
| +
|
| + private class GSAServiceConnection implements ServiceConnection {
|
| + private static final String SERVICE_CONNECTION_TAG = "GSAServiceConnection";
|
| +
|
| + @Override
|
| + public void onServiceDisconnected(ComponentName name) {
|
| + mService = null;
|
| + }
|
| +
|
| + @Override
|
| + public void onServiceConnected(ComponentName name, IBinder service) {
|
| + // Ignore this call if we disconnected in the meantime.
|
| + if (mContext == null) return;
|
| +
|
| + mService = new Messenger(service);
|
| + try {
|
| + Message registerClientMessage = Message.obtain(
|
| + null, REQUEST_REGISTER_CLIENT);
|
| + registerClientMessage.replyTo = mMessenger;
|
| + Bundle b = mGsaHelper.getBundleForRegisteringGSAClient(mContext);
|
| + registerClientMessage.setData(b);
|
| + registerClientMessage.getData().putString(
|
| + KEY_GSA_PACKAGE_NAME, mContext.getPackageName());
|
| + mService.send(registerClientMessage);
|
| + // Send prepare overlay message if there is a pending GSA context.
|
| + } catch (RemoteException e) {
|
| + Log.w(SERVICE_CONNECTION_TAG, "GSAServiceConnection - remote call failed", e);
|
| + }
|
| + }
|
| + }
|
| +}
|
|
|