CronetSampleActivity.java revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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. 4 5package org.chromium.cronet_sample_apk; 6 7import android.app.Activity; 8import android.app.AlertDialog; 9import android.content.DialogInterface; 10import android.content.Intent; 11import android.os.Bundle; 12import android.os.Environment; 13import android.util.Log; 14import android.widget.EditText; 15import android.widget.Toast; 16 17import org.chromium.net.ChromiumUrlRequestFactory; 18import org.chromium.net.HttpUrlRequest; 19import org.chromium.net.HttpUrlRequestFactory; 20import org.chromium.net.HttpUrlRequestFactoryConfig; 21import org.chromium.net.HttpUrlRequestListener; 22 23import java.io.ByteArrayInputStream; 24import java.io.InputStream; 25 26import java.nio.channels.Channels; 27import java.nio.channels.ReadableByteChannel; 28import java.util.HashMap; 29 30/** 31 * Activity for managing the Cronet Sample. 32 */ 33public class CronetSampleActivity extends Activity { 34 private static final String TAG = "CronetSampleActivity"; 35 36 public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs"; 37 38 public static final String POST_DATA_KEY = "postData"; 39 public static final String CONFIG_KEY = "config"; 40 41 ChromiumUrlRequestFactory mChromiumRequestFactory; 42 HttpUrlRequestFactory mRequestFactory; 43 44 String mUrl; 45 46 boolean mLoading = false; 47 48 int mHttpStatusCode = 0; 49 50 class SampleHttpUrlRequestListener implements HttpUrlRequestListener { 51 public SampleHttpUrlRequestListener() { 52 } 53 54 @Override 55 public void onResponseStarted(HttpUrlRequest request) { 56 Log.i(TAG, "****** Response Started, content length is " 57 + request.getContentLength()); 58 Log.i(TAG, "*** Headers Are *** " + request.getAllHeaders()); 59 } 60 61 @Override 62 public void onRequestComplete(HttpUrlRequest request) { 63 Log.i(TAG, "****** Request Complete, status code is " 64 + getHttpStatusCode()); 65 Intent intent = new Intent(getApplicationContext(), 66 CronetSampleActivity.class); 67 startActivity(intent); 68 final String url = request.getUrl(); 69 final CharSequence text = "Completed " + request.getUrl() + " (" 70 + request.getHttpStatusCode() + ")"; 71 mHttpStatusCode = request.getHttpStatusCode(); 72 CronetSampleActivity.this.runOnUiThread(new Runnable() { 73 public void run() { 74 mLoading = false; 75 Toast toast = Toast.makeText(getApplicationContext(), text, 76 Toast.LENGTH_SHORT); 77 toast.show(); 78 promptForURL(url); 79 } 80 }); 81 } 82 } 83 84 @Override 85 protected void onCreate(final Bundle savedInstanceState) { 86 super.onCreate(savedInstanceState); 87 88 HttpUrlRequestFactoryConfig config = new HttpUrlRequestFactoryConfig(); 89 config.enableHttpCache(HttpUrlRequestFactoryConfig.HttpCache.IN_MEMORY, 90 100 * 1024) 91 .enableSPDY(true) 92 .enableQUIC(true); 93 94 // Override config if it is passed from the launcher. 95 String configString = getCommandLineArg(CONFIG_KEY); 96 if (configString != null) { 97 try { 98 Log.i(TAG, "Using Config: " + configString); 99 config = new HttpUrlRequestFactoryConfig(configString); 100 } catch (org.json.JSONException e) { 101 Log.e(TAG, "Invalid Config.", e); 102 finish(); 103 return; 104 } 105 } 106 107 mRequestFactory = HttpUrlRequestFactory.createFactory( 108 getApplicationContext(), config); 109 110 mChromiumRequestFactory = new ChromiumUrlRequestFactory( 111 getApplicationContext(), config); 112 113 String appUrl = getUrlFromIntent(getIntent()); 114 if (appUrl == null) { 115 promptForURL("https://"); 116 } else { 117 startWithURL(appUrl); 118 } 119 } 120 121 private void promptForURL(String url) { 122 Log.i(TAG, "No URL provided via intent, prompting user..."); 123 AlertDialog.Builder alert = new AlertDialog.Builder(this); 124 alert.setTitle("Enter a URL"); 125 alert.setMessage("Enter a URL"); 126 final EditText input = new EditText(this); 127 input.setText(url); 128 alert.setView(input); 129 alert.setPositiveButton("Load", new DialogInterface.OnClickListener() { 130 public void onClick(DialogInterface dialog, int button) { 131 String url = input.getText().toString(); 132 startWithURL(url); 133 } 134 }); 135 alert.show(); 136 } 137 138 private static String getUrlFromIntent(Intent intent) { 139 return intent != null ? intent.getDataString() : null; 140 } 141 142 private String getCommandLineArg(String key) { 143 Intent intent = getIntent(); 144 Bundle extras = intent.getExtras(); 145 Log.i(TAG, "Cronet extras: " + extras); 146 if (extras != null) { 147 String[] commandLine = extras.getStringArray(COMMAND_LINE_ARGS_KEY); 148 if (commandLine != null) { 149 for (int i = 0; i < commandLine.length; ++i) { 150 Log.i(TAG, 151 "Cronet commandLine[" + i + "]=" + commandLine[i]); 152 if (commandLine[i].equals(key)) { 153 return commandLine[++i]; 154 } 155 } 156 } 157 } 158 return null; 159 } 160 161 private void applyCommandLineToHttpUrlRequest(HttpUrlRequest request) { 162 String postData = getCommandLineArg(POST_DATA_KEY); 163 if (postData != null) { 164 InputStream dataStream = new ByteArrayInputStream( 165 postData.getBytes()); 166 ReadableByteChannel dataChannel = Channels.newChannel(dataStream); 167 request.setUploadChannel("text/plain", dataChannel, 168 postData.length()); 169 request.setHttpMethod("POST"); 170 } 171 } 172 173 public void startWithURL(String url) { 174 Log.i(TAG, "Cronet started: " + url); 175 mUrl = url; 176 mLoading = true; 177 178 HashMap<String, String> headers = new HashMap<String, String>(); 179 HttpUrlRequestListener listener = new SampleHttpUrlRequestListener(); 180 HttpUrlRequest request = mRequestFactory.createRequest( 181 url, HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener); 182 applyCommandLineToHttpUrlRequest(request); 183 request.start(); 184 } 185 186 public String getUrl() { 187 return mUrl; 188 } 189 190 public boolean isLoading() { 191 return mLoading; 192 } 193 194 public int getHttpStatusCode() { 195 return mHttpStatusCode; 196 } 197 198 public void startNetLog() { 199 mChromiumRequestFactory.getRequestContext().startNetLogToFile( 200 Environment.getExternalStorageDirectory().getPath() + 201 "/cronet_sample_netlog.json"); 202 } 203 204 public void stopNetLog() { 205 mChromiumRequestFactory.getRequestContext().stopNetLog(); 206 } 207} 208