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