1e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer/* 2e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * Copyright (C) 2015 The Android Open Source Project 3e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * 4e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * Licensed under the Apache License, Version 2.0 (the "License"); 5e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * you may not use this file except in compliance with the License. 6e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * You may obtain a copy of the License at 7e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * 8e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * http://www.apache.org/licenses/LICENSE-2.0 9e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * 10e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * Unless required by applicable law or agreed to in writing, software 11e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * distributed under the License is distributed on an "AS IS" BASIS, 12e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * See the License for the specific language governing permissions and 14e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer * limitations under the License. 15e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer */ 16e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 17e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerpackage org.chromium.latency.walt; 18e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 19e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerimport android.content.Context; 20e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerimport android.support.v4.content.AsyncTaskLoader; 21e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 22e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerimport java.io.BufferedOutputStream; 23e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerimport java.io.IOException; 24e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerimport java.io.PrintWriter; 25e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerimport java.net.HttpURLConnection; 26e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerimport java.net.URL; 27e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 28e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmerclass LogUploader extends AsyncTaskLoader<Integer> { 29e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 30e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer private String urlString; 31e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer private SimpleLogger logger; 32e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 33e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer LogUploader(Context context) { 34e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer super(context); 35e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer urlString = Utils.getStringPreference(context, R.string.preference_log_url, ""); 36e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer logger = SimpleLogger.getInstance(context); 37e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 38e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } 39e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 40e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer LogUploader(Context context, String urlString) { 41e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer super(context); 42e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer this.urlString = urlString; 43e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer logger = SimpleLogger.getInstance(context); 44e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } 45e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 46e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer @Override 47e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer public Integer loadInBackground() { 48e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer if (urlString.isEmpty()) return -1; 49e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer try { 50e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer URL url = new URL(urlString); 51e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer HttpURLConnection urlConnection = 52e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer (HttpURLConnection) url.openConnection(); 53e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer urlConnection.setRequestMethod("POST"); 54e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer urlConnection.setDoOutput(true); 55e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer urlConnection.setRequestProperty("Content-Type", "text/plain"); 56e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer BufferedOutputStream out = 57e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer new BufferedOutputStream(urlConnection.getOutputStream()); 58e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer PrintWriter writer = new PrintWriter(out); 59e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer writer.write(logger.getLogText()); 60e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer writer.flush(); 61e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer final int responseCode = urlConnection.getResponseCode(); 62e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer if (responseCode / 100 == 2) { 63e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer logger.log("Log successfully uploaded"); 64e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } else { 65e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer logger.log("Log upload may have failed. Server return status code " + responseCode); 66e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } 67e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer return responseCode; 68e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } catch (IOException e) { 69e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer logger.log("Failed to upload log"); 70e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer return -1; 71e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } 72e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } 73e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 74e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer void startUpload() { 75e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer super.forceLoad(); 76e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } 77e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer 78e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer static void uploadIfAutoEnabled(Context context) { 79e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer if (Utils.getBooleanPreference(context, R.string.preference_auto_upload_log, false)) { 80e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer new LogUploader(context).startUpload(); 81e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } 82e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer } 83e76dcf96b0c451e46cddfa695de8feeb92533937Andrew Lehmer} 84