// Signature format: 3.0
package androidx.remotecallback {

  public class AppWidgetProviderWithCallbacks<T extends androidx.remotecallback.CallbackReceiver> extends android.appwidget.AppWidgetProvider implements androidx.remotecallback.CallbackReceiver<T> {
    ctor public AppWidgetProviderWithCallbacks();
    method public T! createRemoteCallback(android.content.Context!);
  }

  public abstract class BroadcastReceiverWithCallbacks<T extends androidx.remotecallback.CallbackReceiver> extends android.content.BroadcastReceiver implements androidx.remotecallback.CallbackReceiver<T> {
    ctor public BroadcastReceiverWithCallbacks();
    method public T! createRemoteCallback(android.content.Context!);
    method public void onReceive(android.content.Context!, android.content.Intent!);
    field public static final String ACTION_BROADCAST_CALLBACK = "androidx.remotecallback.action.BROADCAST_CALLBACK";
  }

  public class CallbackHandlerRegistry {
    ctor public CallbackHandlerRegistry();
    method public <T extends androidx.remotecallback.CallbackReceiver> void invokeCallback(android.content.Context!, T!, android.content.Intent!);
    method public <T extends androidx.remotecallback.CallbackReceiver> void invokeCallback(android.content.Context!, T!, android.os.Bundle!);
    method public static <T extends androidx.remotecallback.CallbackReceiver> void registerCallbackHandler(Class<T>!, String!, androidx.remotecallback.CallbackHandlerRegistry.CallbackHandler<T>!);
    method public static androidx.remotecallback.RemoteCallback! stubToRemoteCallback(androidx.remotecallback.CallbackReceiver!, Class<? extends androidx.remotecallback.CallbackReceiver>!, android.os.Bundle!, String!);
  }

  public static interface CallbackHandlerRegistry.CallbackHandler<T extends androidx.remotecallback.CallbackReceiver> {
    method public void executeCallback(android.content.Context!, T!, android.os.Bundle!);
  }

  public interface CallbackReceiver<T> {
    method public T! createRemoteCallback(android.content.Context!);
  }

  public abstract class ContentProviderWithCallbacks<T extends androidx.remotecallback.ContentProviderWithCallbacks> extends android.content.ContentProvider implements androidx.remotecallback.CallbackReceiver<T> {
    ctor public ContentProviderWithCallbacks();
    method public T! createRemoteCallback(android.content.Context!);
  }

  @java.lang.annotation.Target(java.lang.annotation.ElementType.PARAMETER) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface ExternalInput {
    method public abstract String value();
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface RemoteCallable {
  }

  public class RemoteCallback {
    method public static <T extends androidx.remotecallback.CallbackReceiver> T! create(Class<T>!, android.content.Context!);
    method public android.os.Bundle! getArgumentBundle();
    method public String! getMethodName();
    method public String getReceiverClass();
    method public int getType();
    method public android.app.PendingIntent! toPendingIntent();
    field public static final androidx.remotecallback.RemoteCallback! LOCAL;
    field public static final int TYPE_PROVIDER = 1; // 0x1
    field public static final int TYPE_RECEIVER = 0; // 0x0
  }

}

