16ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank/*
26ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * Copyright (C) 2009 The Android Open Source Project
36ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank *
46ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * Licensed under the Apache License, Version 2.0 (the "License");
56ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * you may not use this file except in compliance with the License.
66ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * You may obtain a copy of the License at
76ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank *
86ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank *      http://www.apache.org/licenses/LICENSE-2.0
96ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank *
106ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * Unless required by applicable law or agreed to in writing, software
116ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * distributed under the License is distributed on an "AS IS" BASIS,
126ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * See the License for the specific language governing permissions and
146ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * limitations under the License.
156ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank */
166ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank
1777424af660458104b732bdcb718874b17d0cab3aMarc Blankpackage com.android.exchange.utility;
1877424af660458104b732bdcb718874b17d0cab3aMarc Blank
1977424af660458104b732bdcb718874b17d0cab3aMarc Blankimport android.content.Context;
20b7456eb509b95016d55b676aaf56340cc87530b3Marc Blankimport android.os.Environment;
2177424af660458104b732bdcb718874b17d0cab3aMarc Blank
2277424af660458104b732bdcb718874b17d0cab3aMarc Blankimport java.io.FileWriter;
2377424af660458104b732bdcb718874b17d0cab3aMarc Blankimport java.io.IOException;
241403386ebffa1b6093a506a6a24db4523acdc315Marc Blankimport java.io.PrintWriter;
25c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blankimport java.util.Date;
2677424af660458104b732bdcb718874b17d0cab3aMarc Blank
2777424af660458104b732bdcb718874b17d0cab3aMarc Blankpublic class FileLogger {
2877424af660458104b732bdcb718874b17d0cab3aMarc Blank    private static FileLogger LOGGER = null;
29f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank    private static FileWriter sLogWriter = null;
30b7456eb509b95016d55b676aaf56340cc87530b3Marc Blank    public static String LOG_FILE_NAME =
31b7456eb509b95016d55b676aaf56340cc87530b3Marc Blank        Environment.getExternalStorageDirectory() + "/emaillog.txt";
3277424af660458104b732bdcb718874b17d0cab3aMarc Blank
3377424af660458104b732bdcb718874b17d0cab3aMarc Blank    public synchronized static FileLogger getLogger (Context c) {
3477424af660458104b732bdcb718874b17d0cab3aMarc Blank        LOGGER = new FileLogger();
3577424af660458104b732bdcb718874b17d0cab3aMarc Blank        return LOGGER;
3677424af660458104b732bdcb718874b17d0cab3aMarc Blank    }
3777424af660458104b732bdcb718874b17d0cab3aMarc Blank
386ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank    private FileLogger() {
391403386ebffa1b6093a506a6a24db4523acdc315Marc Blank        try {
40f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank            sLogWriter = new FileWriter(LOG_FILE_NAME, true);
411403386ebffa1b6093a506a6a24db4523acdc315Marc Blank        } catch (IOException e) {
421403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            // Doesn't matter
4377424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
4477424af660458104b732bdcb718874b17d0cab3aMarc Blank    }
4577424af660458104b732bdcb718874b17d0cab3aMarc Blank
4677424af660458104b732bdcb718874b17d0cab3aMarc Blank    static public synchronized void close() {
47f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank        if (sLogWriter != null) {
4877424af660458104b732bdcb718874b17d0cab3aMarc Blank            try {
49f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                sLogWriter.close();
5077424af660458104b732bdcb718874b17d0cab3aMarc Blank            } catch (IOException e) {
5177424af660458104b732bdcb718874b17d0cab3aMarc Blank                // Doesn't matter
5277424af660458104b732bdcb718874b17d0cab3aMarc Blank            }
53f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank            sLogWriter = null;
5477424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
5577424af660458104b732bdcb718874b17d0cab3aMarc Blank    }
5677424af660458104b732bdcb718874b17d0cab3aMarc Blank
571403386ebffa1b6093a506a6a24db4523acdc315Marc Blank    static public synchronized void log(Exception e) {
58f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank        if (sLogWriter != null) {
591403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            log("Exception", "Stack trace follows...");
60f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank            PrintWriter pw = new PrintWriter(sLogWriter);
611403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            e.printStackTrace(pw);
621403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            pw.flush();
631403386ebffa1b6093a506a6a24db4523acdc315Marc Blank        }
641403386ebffa1b6093a506a6a24db4523acdc315Marc Blank    }
651403386ebffa1b6093a506a6a24db4523acdc315Marc Blank
66c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank    @SuppressWarnings("deprecation")
676ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank    static public synchronized void log(String prefix, String str) {
6877424af660458104b732bdcb718874b17d0cab3aMarc Blank        if (LOGGER == null) {
6977424af660458104b732bdcb718874b17d0cab3aMarc Blank            LOGGER = new FileLogger();
7077424af660458104b732bdcb718874b17d0cab3aMarc Blank            log("Logger", "\r\n\r\n --- New Log ---");
7177424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
72c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank        Date d = new Date();
73c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank        int hr = d.getHours();
74c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank        int min = d.getMinutes();
75c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank        int sec = d.getSeconds();
7677424af660458104b732bdcb718874b17d0cab3aMarc Blank
776ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank        // I don't use DateFormat here because (in my experience), it's much slower
7877424af660458104b732bdcb718874b17d0cab3aMarc Blank        StringBuffer sb = new StringBuffer(256);
7977424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append('[');
8077424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(hr);
8177424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(':');
8277424af660458104b732bdcb718874b17d0cab3aMarc Blank        if (min < 10)
8377424af660458104b732bdcb718874b17d0cab3aMarc Blank            sb.append('0');
8477424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(min);
8577424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(':');
8677424af660458104b732bdcb718874b17d0cab3aMarc Blank        if (sec < 10) {
8777424af660458104b732bdcb718874b17d0cab3aMarc Blank            sb.append('0');
8877424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
8977424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(sec);
9077424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append("] ");
9177424af660458104b732bdcb718874b17d0cab3aMarc Blank        if (prefix != null) {
9277424af660458104b732bdcb718874b17d0cab3aMarc Blank            sb.append(prefix);
9377424af660458104b732bdcb718874b17d0cab3aMarc Blank            sb.append("| ");
9477424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
9577424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(str);
9677424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append("\r\n");
9777424af660458104b732bdcb718874b17d0cab3aMarc Blank        String s = sb.toString();
9877424af660458104b732bdcb718874b17d0cab3aMarc Blank
99f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank        if (sLogWriter != null) {
1001403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            try {
101f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                sLogWriter.write(s);
102f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                sLogWriter.flush();
1031403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            } catch (IOException e) {
104f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                // Something might have happened to the sdcard
105f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
106f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                    // If the card is mounted and we can create the writer, retry
107f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                    LOGGER = new FileLogger();
108f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                    if (sLogWriter != null) {
10910ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                        try {
11010ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                            log("FileLogger", "Exception writing log; recreating...");
11110ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                            log(prefix, str);
11210ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                        } catch (Exception e1) {
11310ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                            // Nothing to do at this point
11410ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                        }
115f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                    }
116f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                }
11777424af660458104b732bdcb718874b17d0cab3aMarc Blank            }
11877424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
11977424af660458104b732bdcb718874b17d0cab3aMarc Blank    }
12077424af660458104b732bdcb718874b17d0cab3aMarc Blank}
121