Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / net / cronet / android / sample / src / org / chromium / cronet_sample_apk / CronetSampleActivity.java
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
5 package org.chromium.cronet_sample_apk;
6
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;
15
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;
21
22 import java.io.ByteArrayInputStream;
23 import java.io.InputStream;
24
25 import java.nio.channels.Channels;
26 import java.nio.channels.ReadableByteChannel;
27 import java.nio.channels.WritableByteChannel;
28 import java.util.HashMap;
29 import java.util.Map;
30
31 /**
32  * Activity for managing the Cronet Sample.
33  */
34 public class CronetSampleActivity extends Activity {
35     private static final String TAG = "CronetSampleActivity";
36
37     public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs";
38
39     public static final String POST_DATA_KEY = "postData";
40
41     UrlRequestContext mRequestContext;
42
43     String mUrl;
44
45     boolean mLoading = false;
46
47     int mHttpStatusCode = 0;
48
49     class SampleRequestContext extends UrlRequestContext {
50         public SampleRequestContext() {
51             super(getApplicationContext(), "Cronet Sample",
52                     UrlRequestContext.LOG_VERBOSE);
53         }
54     }
55
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);
61         }
62
63         @Override
64         protected void onRequestComplete() {
65             mHttpStatusCode = super.getHttpStatusCode();
66             Log.i(TAG, "****** Request Complete, status code is "
67                     + mHttpStatusCode);
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() {
75                 public void run() {
76                     mLoading = false;
77                     Toast toast = Toast.makeText(getApplicationContext(), text,
78                             Toast.LENGTH_SHORT);
79                     toast.show();
80                     promptForURL(url);
81                 }
82             });
83         }
84     }
85
86     class SampleHttpUrlRequestListener implements HttpUrlRequestListener {
87         public SampleHttpUrlRequestListener() {
88         }
89
90         @Override
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() {
102                 public void run() {
103                     mLoading = false;
104                     Toast toast = Toast.makeText(getApplicationContext(), text,
105                             Toast.LENGTH_SHORT);
106                     toast.show();
107                     promptForURL(url);
108                 }
109             });
110         }
111     }
112
113     @Override
114     protected void onCreate(final Bundle savedInstanceState) {
115         super.onCreate(savedInstanceState);
116
117         try {
118             LibraryLoader.ensureInitialized();
119         } catch (UnsatisfiedLinkError e) {
120             Log.e(TAG, "libcronet_sample initialization failed.", e);
121             finish();
122             return;
123         }
124
125         mRequestContext = new SampleRequestContext();
126
127         String appUrl = getUrlFromIntent(getIntent());
128         if (appUrl == null) {
129             promptForURL("https://");
130         } else {
131             startWithURL(appUrl);
132         }
133     }
134
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);
141         input.setText(url);
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();
146                 startWithURL(url);
147             }
148         });
149         alert.show();
150     }
151
152     private static String getUrlFromIntent(Intent intent) {
153         return intent != null ? intent.getDataString() : null;
154     }
155
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) {
164                     Log.i(TAG,
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(
170                                 dataStream);
171                         request.setUploadChannel("text/plain", dataChannel);
172                     }
173                 }
174             }
175         }
176     }
177
178     private void startWithURL(String url) {
179         Log.i(TAG, "Cronet started: " + url);
180         mUrl = url;
181         mLoading = true;
182
183         HashMap<String, String> headers = new HashMap<String, String>();
184         HttpUrlRequestListener listener = new SampleHttpUrlRequestListener();
185
186         HttpUrlRequest request = HttpUrlRequestFactory.newRequest(
187                 getApplicationContext(), url,
188                 UrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener);
189         request.start();
190     }
191
192     private void startWithURL_UrlRequest(String url) {
193         Log.i(TAG, "Cronet started: " + url);
194         mUrl = url;
195         mLoading = true;
196
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);
202         request.start();
203     }
204
205     public String getUrl() {
206         return mUrl;
207     }
208
209     public boolean isLoading() {
210         return mLoading;
211     }
212
213     public int getHttpStatusCode() {
214         return mHttpStatusCode;
215     }
216 }