// Signature format: 3.0
package androidx.contentpager.content {

  public class ContentPager {
    ctor public ContentPager(android.content.ContentResolver!, androidx.contentpager.content.ContentPager.QueryRunner!);
    ctor public ContentPager(android.content.ContentResolver, androidx.contentpager.content.ContentPager.QueryRunner, int);
    method public static android.os.Bundle createArgs(int, int);
    method @MainThread public androidx.contentpager.content.Query query(@RequiresPermission.Read android.net.Uri, String[]?, android.os.Bundle, android.os.CancellationSignal?, androidx.contentpager.content.ContentPager.ContentCallback);
    method @MainThread public void reset();
    field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
    field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
    field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
    field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
    field public static final String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
    field public static final String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
    field public static final String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
    field public static final String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
    field public static final String QUERY_ARG_LIMIT = "android:query-arg-limit";
    field public static final String QUERY_ARG_OFFSET = "android:query-arg-offset";
  }

  public static interface ContentPager.ContentCallback {
    method @MainThread public void onCursorReady(androidx.contentpager.content.Query, android.database.Cursor?);
  }

  @IntDef({androidx.contentpager.content.ContentPager.CURSOR_DISPOSITION_COPIED, androidx.contentpager.content.ContentPager.CURSOR_DISPOSITION_PAGED, androidx.contentpager.content.ContentPager.CURSOR_DISPOSITION_REPAGED, androidx.contentpager.content.ContentPager.CURSOR_DISPOSITION_WRAPPED}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentPager.CursorDisposition {
  }

  public static interface ContentPager.QueryRunner {
    method public void cancel(androidx.contentpager.content.Query);
    method public boolean isRunning(androidx.contentpager.content.Query);
    method public void query(androidx.contentpager.content.Query, androidx.contentpager.content.ContentPager.QueryRunner.Callback);
  }

  public static interface ContentPager.QueryRunner.Callback {
    method public void onQueryFinished(androidx.contentpager.content.Query, android.database.Cursor?);
    method public android.database.Cursor? runQueryInBackground(androidx.contentpager.content.Query);
  }

  public final class LoaderQueryRunner implements androidx.contentpager.content.ContentPager.QueryRunner {
    ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
    method public void cancel(androidx.contentpager.content.Query);
    method public boolean isRunning(androidx.contentpager.content.Query);
    method public void query(androidx.contentpager.content.Query, androidx.contentpager.content.ContentPager.QueryRunner.Callback);
  }

  public final class Query {
    method public int getId();
    method public int getLimit();
    method public int getOffset();
    method public android.net.Uri getUri();
  }

}

