public final class

AppConnection

extends java.lang.Object

implements Connection

 java.lang.Object

↳androidx.test.services.speakeasy.client.AppConnection

Gradle dependencies

compile group: 'androidx.test', name: 'orchestrator', version: '1.5.0'

  • groupId: androidx.test
  • artifactId: orchestrator
  • version: 1.5.0

Artifact androidx.test:orchestrator:1.5.0 it located at Google repository (https://maven.google.com/)

Androidx artifact mapping:

androidx.test:orchestrator com.android.support.test:orchestrator

Overview

Allows callers to access the speakeasy binder registry when they have a Context.

Summary

Constructors
publicAppConnection(Context context)

Methods
public voidfind(java.lang.String key, FindResultReceiver rr)

public voidpublish(IBinder binder, PublishResultReceiver rr)

from java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructors

public AppConnection(Context context)

Methods

public void publish(IBinder binder, PublishResultReceiver rr)

public void find(java.lang.String key, FindResultReceiver rr)

Source

/*
 * Copyright (C) 2017 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 androidx.test.services.speakeasy.client;

import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import androidx.test.services.speakeasy.SpeakEasyProtocol;
import java.security.SecureRandom;
import java.util.Random;

/** Allows callers to access the speakeasy binder registry when they have a Context. */
public final class AppConnection implements Connection {
  private static final String PACKAGE_NAME = "androidx.test.services";
  static final String SERVICE =
      "androidx.test.services.speakeasy.server.SpeakEasyService";
  private final String packageName;
  private final String service;
  private final Random random;
  private final Context context;

  public AppConnection(Context context) {
    this(context, PACKAGE_NAME, SERVICE, new SecureRandom());
  }

  AppConnection(Context context, String packageName, String service, Random random) {
    this.context = context.getApplicationContext();
    this.packageName = checkNotNull(packageName);
    this.service = checkNotNull(service);
    this.random = checkNotNull(random);
  }

  @Override
  public void publish(IBinder binder, PublishResultReceiver rr) {
    checkNotNull(binder);
    checkNotNull(rr);

    String key = Long.toHexString(random.nextLong());
    Intent intent = makeIntent();
    intent.putExtras(SpeakEasyProtocol.Publish.asBundle(key, binder, rr));
    startForegroundService(context, intent);
  }

  @Override
  public void find(String key, FindResultReceiver rr) {
    checkNotNull(key);
    checkNotNull(rr);
    Intent intent = makeIntent();
    intent.putExtras(SpeakEasyProtocol.Find.asBundle(key, rr));
    startForegroundService(context, intent);
  }

  private Intent makeIntent() {
    Intent i = new Intent();
    i.setClassName(packageName, service);
    return i;
  }

  private static <T> T checkNotNull(T ref) {
    if (null == ref) {
      throw new NullPointerException();
    }
    return ref;
  }

  // copy of ContentCompat.startForegroundService
  private static void startForegroundService(Context context, Intent intent) {
    if (Build.VERSION.SDK_INT >= 26) {
      context.startForegroundService(intent);
    } else {
      // Pre-O behavior.
      context.startService(intent);
    }
  }
}