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