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.os.Environment;
13 import android.util.Log;
14 import android.widget.EditText;
15 import android.widget.Toast;
17 import org.chromium.net.HttpUrlRequest;
18 import org.chromium.net.HttpUrlRequestFactory;
19 import org.chromium.net.HttpUrlRequestFactoryConfig;
20 import org.chromium.net.HttpUrlRequestListener;
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.util.HashMap;
30 * Activity for managing the Cronet Sample.
32 public class CronetSampleActivity extends Activity {
33 private static final String TAG = "CronetSampleActivity";
35 public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs";
37 public static final String POST_DATA_KEY = "postData";
38 public static final String CONFIG_KEY = "config";
40 HttpUrlRequestFactory mRequestFactory;
44 boolean mLoading = false;
46 int mHttpStatusCode = 0;
48 class SampleHttpUrlRequestListener implements HttpUrlRequestListener {
49 public SampleHttpUrlRequestListener() {
53 public void onResponseStarted(HttpUrlRequest request) {
54 Log.i(TAG, "****** Response Started, content length is "
55 + request.getContentLength());
56 Log.i(TAG, "*** Headers Are *** " + request.getAllHeaders());
60 public void onRequestComplete(HttpUrlRequest request) {
61 Log.i(TAG, "****** Request Complete, status code is "
62 + getHttpStatusCode());
63 Intent intent = new Intent(getApplicationContext(),
64 CronetSampleActivity.class);
65 startActivity(intent);
66 final String url = request.getUrl();
67 final CharSequence text = "Completed " + request.getUrl() + " ("
68 + request.getHttpStatusCode() + ")";
69 mHttpStatusCode = request.getHttpStatusCode();
70 CronetSampleActivity.this.runOnUiThread(new Runnable() {
73 Toast toast = Toast.makeText(getApplicationContext(), text,
83 protected void onCreate(final Bundle savedInstanceState) {
84 super.onCreate(savedInstanceState);
86 HttpUrlRequestFactoryConfig config = new HttpUrlRequestFactoryConfig();
87 config.enableHttpCache(HttpUrlRequestFactoryConfig.HttpCache.IN_MEMORY,
92 // Override config if it is passed from the launcher.
93 String configString = getCommandLineArg(CONFIG_KEY);
94 if (configString != null) {
96 Log.i(TAG, "Using Config: " + configString);
97 config = new HttpUrlRequestFactoryConfig(configString);
98 } catch (org.json.JSONException e) {
99 Log.e(TAG, "Invalid Config.", e);
105 mRequestFactory = HttpUrlRequestFactory.createFactory(
106 getApplicationContext(), config);
108 String appUrl = getUrlFromIntent(getIntent());
109 if (appUrl == null) {
110 promptForURL("https://");
112 startWithURL(appUrl);
116 private void promptForURL(String url) {
117 Log.i(TAG, "No URL provided via intent, prompting user...");
118 AlertDialog.Builder alert = new AlertDialog.Builder(this);
119 alert.setTitle("Enter a URL");
120 alert.setMessage("Enter a URL");
121 final EditText input = new EditText(this);
123 alert.setView(input);
124 alert.setPositiveButton("Load", new DialogInterface.OnClickListener() {
125 public void onClick(DialogInterface dialog, int button) {
126 String url = input.getText().toString();
133 private static String getUrlFromIntent(Intent intent) {
134 return intent != null ? intent.getDataString() : null;
137 private String getCommandLineArg(String key) {
138 Intent intent = getIntent();
139 Bundle extras = intent.getExtras();
140 Log.i(TAG, "Cronet extras: " + extras);
141 if (extras != null) {
142 String[] commandLine = extras.getStringArray(COMMAND_LINE_ARGS_KEY);
143 if (commandLine != null) {
144 for (int i = 0; i < commandLine.length; ++i) {
146 "Cronet commandLine[" + i + "]=" + commandLine[i]);
147 if (commandLine[i].equals(key)) {
148 return commandLine[++i];
156 private void applyCommandLineToHttpUrlRequest(HttpUrlRequest request) {
157 String postData = getCommandLineArg(POST_DATA_KEY);
158 if (postData != null) {
159 InputStream dataStream = new ByteArrayInputStream(
160 postData.getBytes());
161 ReadableByteChannel dataChannel = Channels.newChannel(dataStream);
162 request.setUploadChannel("text/plain", dataChannel,
164 request.setHttpMethod("POST");
168 public void startWithURL(String url) {
169 Log.i(TAG, "Cronet started: " + url);
173 HashMap<String, String> headers = new HashMap<String, String>();
174 HttpUrlRequestListener listener = new SampleHttpUrlRequestListener();
175 HttpUrlRequest request = mRequestFactory.createRequest(
176 url, HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener);
177 applyCommandLineToHttpUrlRequest(request);
181 public String getUrl() {
185 public boolean isLoading() {
189 public int getHttpStatusCode() {
190 return mHttpStatusCode;
193 public void startNetLog() {
194 mRequestFactory.startNetLogToFile(
195 Environment.getExternalStorageDirectory().getPath() +
196 "/cronet_sample_netlog.json");
199 public void stopNetLog() {
200 mRequestFactory.stopNetLog();