1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.cronet_sample_apk;
7 import android.app.Activity;
8 import android.app.AlertDialog;
9 import android.content.DialogInterface;
10 import android.content.Intent;
11 import android.os.Bundle;
12 import android.util.Log;
13 import android.widget.EditText;
14 import android.widget.Toast;
16 import org.chromium.net.HttpUrlRequest;
17 import org.chromium.net.HttpUrlRequestFactory;
18 import org.chromium.net.HttpUrlRequestListener;
19 import org.chromium.net.UrlRequest;
20 import org.chromium.net.UrlRequestContext;
22 import java.io.ByteArrayInputStream;
23 import java.io.InputStream;
25 import java.nio.channels.Channels;
26 import java.nio.channels.ReadableByteChannel;
27 import java.nio.channels.WritableByteChannel;
28 import java.util.HashMap;
32 * Activity for managing the Cronet Sample.
34 public class CronetSampleActivity extends Activity {
35 private static final String TAG = "CronetSampleActivity";
37 public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs";
39 public static final String POST_DATA_KEY = "postData";
41 UrlRequestContext mRequestContext;
45 boolean mLoading = false;
47 int mHttpStatusCode = 0;
49 class SampleRequestContext extends UrlRequestContext {
50 public SampleRequestContext() {
51 super(getApplicationContext(), "Cronet Sample",
52 UrlRequestContext.LOG_VERBOSE);
56 class SampleRequest extends UrlRequest {
57 public SampleRequest(UrlRequestContext requestContext, String url,
58 int priority, Map<String, String> headers,
59 WritableByteChannel sink) {
60 super(requestContext, url, priority, headers, sink);
64 protected void onRequestComplete() {
65 mHttpStatusCode = super.getHttpStatusCode();
66 Log.i(TAG, "****** Request Complete, status code is "
68 Intent intent = new Intent(getApplicationContext(),
69 CronetSampleActivity.class);
70 startActivity(intent);
71 final String url = super.getUrl();
72 final CharSequence text = "Completed " + url + " ("
73 + mHttpStatusCode + ")";
74 CronetSampleActivity.this.runOnUiThread(new Runnable() {
77 Toast toast = Toast.makeText(getApplicationContext(), text,
86 class SampleHttpUrlRequestListener implements HttpUrlRequestListener {
87 public SampleHttpUrlRequestListener() {
91 public void onRequestComplete(HttpUrlRequest request) {
92 Log.i(TAG, "****** Request Complete, status code is "
93 + getHttpStatusCode());
94 Intent intent = new Intent(getApplicationContext(),
95 CronetSampleActivity.class);
96 startActivity(intent);
97 final String url = request.getUrl();
98 final CharSequence text = "Completed " + request.getUrl() + " ("
99 + request.getHttpStatusCode() + ")";
100 mHttpStatusCode = request.getHttpStatusCode();
101 CronetSampleActivity.this.runOnUiThread(new Runnable() {
104 Toast toast = Toast.makeText(getApplicationContext(), text,
114 protected void onCreate(final Bundle savedInstanceState) {
115 super.onCreate(savedInstanceState);
118 LibraryLoader.ensureInitialized();
119 } catch (UnsatisfiedLinkError e) {
120 Log.e(TAG, "libcronet_sample initialization failed.", e);
125 mRequestContext = new SampleRequestContext();
127 String appUrl = getUrlFromIntent(getIntent());
128 if (appUrl == null) {
129 promptForURL("https://");
131 startWithURL(appUrl);
135 private void promptForURL(String url) {
136 Log.i(TAG, "No URL provided via intent, prompting user...");
137 AlertDialog.Builder alert = new AlertDialog.Builder(this);
138 alert.setTitle("Enter a URL");
139 alert.setMessage("Enter a URL");
140 final EditText input = new EditText(this);
142 alert.setView(input);
143 alert.setPositiveButton("Load", new DialogInterface.OnClickListener() {
144 public void onClick(DialogInterface dialog, int button) {
145 String url = input.getText().toString();
152 private static String getUrlFromIntent(Intent intent) {
153 return intent != null ? intent.getDataString() : null;
156 private void applyCommandLineToRequest(UrlRequest request) {
157 Intent intent = getIntent();
158 Bundle extras = intent.getExtras();
159 Log.i(TAG, "Cronet extras: " + extras);
160 if (extras != null) {
161 String[] commandLine = extras.getStringArray(COMMAND_LINE_ARGS_KEY);
162 if (commandLine != null) {
163 for (int i = 0; i < commandLine.length; ++i) {
165 "Cronet commandLine[" + i + "]=" + commandLine[i]);
166 if (commandLine[i].equals(POST_DATA_KEY)) {
167 InputStream dataStream = new ByteArrayInputStream(
168 commandLine[++i].getBytes());
169 ReadableByteChannel dataChannel = Channels.newChannel(
171 request.setUploadChannel("text/plain", dataChannel);
178 private void startWithURL(String url) {
179 Log.i(TAG, "Cronet started: " + url);
183 HashMap<String, String> headers = new HashMap<String, String>();
184 HttpUrlRequestListener listener = new SampleHttpUrlRequestListener();
186 HttpUrlRequest request = HttpUrlRequestFactory.newRequest(
187 getApplicationContext(), url,
188 UrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener);
192 private void startWithURL_UrlRequest(String url) {
193 Log.i(TAG, "Cronet started: " + url);
197 HashMap<String, String> headers = new HashMap<String, String>();
198 WritableByteChannel sink = Channels.newChannel(System.out);
199 UrlRequest request = new SampleRequest(mRequestContext, url,
200 UrlRequest.REQUEST_PRIORITY_MEDIUM, headers, sink);
201 applyCommandLineToRequest(request);
205 public String getUrl() {
209 public boolean isLoading() {
213 public int getHttpStatusCode() {
214 return mHttpStatusCode;