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
19b7456eb509b95016d55b676aaf56340cc87530b3Marc Blankimport android.os.Environment;
2077424af660458104b732bdcb718874b17d0cab3aMarc Blank
2177424af660458104b732bdcb718874b17d0cab3aMarc Blankimport java.io.FileWriter;
2277424af660458104b732bdcb718874b17d0cab3aMarc Blankimport java.io.IOException;
231403386ebffa1b6093a506a6a24db4523acdc315Marc Blankimport java.io.PrintWriter;
24c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blankimport java.util.Date;
2577424af660458104b732bdcb718874b17d0cab3aMarc Blank
2677424af660458104b732bdcb718874b17d0cab3aMarc Blankpublic class FileLogger {
2777424af660458104b732bdcb718874b17d0cab3aMarc Blank    private static FileLogger LOGGER = null;
28f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank    private static FileWriter sLogWriter = null;
29b7456eb509b95016d55b676aaf56340cc87530b3Marc Blank    public static String LOG_FILE_NAME =
30b7456eb509b95016d55b676aaf56340cc87530b3Marc Blank        Environment.getExternalStorageDirectory() + "/emaillog.txt";
3177424af660458104b732bdcb718874b17d0cab3aMarc Blank
3256d35257ef1493e849522c3c2828d904e4c5531fScott Kennedy    public synchronized static FileLogger getLogger() {
3377424af660458104b732bdcb718874b17d0cab3aMarc Blank        LOGGER = new FileLogger();
3477424af660458104b732bdcb718874b17d0cab3aMarc Blank        return LOGGER;
3577424af660458104b732bdcb718874b17d0cab3aMarc Blank    }
3677424af660458104b732bdcb718874b17d0cab3aMarc Blank
376ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank    private FileLogger() {
381403386ebffa1b6093a506a6a24db4523acdc315Marc Blank        try {
39f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank            sLogWriter = new FileWriter(LOG_FILE_NAME, true);
401403386ebffa1b6093a506a6a24db4523acdc315Marc Blank        } catch (IOException e) {
411403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            // Doesn't matter
4277424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
4377424af660458104b732bdcb718874b17d0cab3aMarc Blank    }
4477424af660458104b732bdcb718874b17d0cab3aMarc Blank
4577424af660458104b732bdcb718874b17d0cab3aMarc Blank    static public synchronized void close() {
46f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank        if (sLogWriter != null) {
4777424af660458104b732bdcb718874b17d0cab3aMarc Blank            try {
48f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                sLogWriter.close();
4977424af660458104b732bdcb718874b17d0cab3aMarc Blank            } catch (IOException e) {
5077424af660458104b732bdcb718874b17d0cab3aMarc Blank                // Doesn't matter
5177424af660458104b732bdcb718874b17d0cab3aMarc Blank            }
52f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank            sLogWriter = null;
5377424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
5477424af660458104b732bdcb718874b17d0cab3aMarc Blank    }
5577424af660458104b732bdcb718874b17d0cab3aMarc Blank
561403386ebffa1b6093a506a6a24db4523acdc315Marc Blank    static public synchronized void log(Exception e) {
57f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank        if (sLogWriter != null) {
581403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            log("Exception", "Stack trace follows...");
59f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank            PrintWriter pw = new PrintWriter(sLogWriter);
601403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            e.printStackTrace(pw);
611403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            pw.flush();
621403386ebffa1b6093a506a6a24db4523acdc315Marc Blank        }
631403386ebffa1b6093a506a6a24db4523acdc315Marc Blank    }
641403386ebffa1b6093a506a6a24db4523acdc315Marc Blank
65c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank    @SuppressWarnings("deprecation")
666ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank    static public synchronized void log(String prefix, String str) {
6777424af660458104b732bdcb718874b17d0cab3aMarc Blank        if (LOGGER == null) {
6877424af660458104b732bdcb718874b17d0cab3aMarc Blank            LOGGER = new FileLogger();
6977424af660458104b732bdcb718874b17d0cab3aMarc Blank            log("Logger", "\r\n\r\n --- New Log ---");
7077424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
71c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank        Date d = new Date();
72c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank        int hr = d.getHours();
73c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank        int min = d.getMinutes();
74c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank        int sec = d.getSeconds();
7577424af660458104b732bdcb718874b17d0cab3aMarc Blank
766ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank        // I don't use DateFormat here because (in my experience), it's much slower
7777424af660458104b732bdcb718874b17d0cab3aMarc Blank        StringBuffer sb = new StringBuffer(256);
7877424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append('[');
7977424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(hr);
8077424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(':');
8177424af660458104b732bdcb718874b17d0cab3aMarc Blank        if (min < 10)
8277424af660458104b732bdcb718874b17d0cab3aMarc Blank            sb.append('0');
8377424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(min);
8477424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(':');
8577424af660458104b732bdcb718874b17d0cab3aMarc Blank        if (sec < 10) {
8677424af660458104b732bdcb718874b17d0cab3aMarc Blank            sb.append('0');
8777424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
8877424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(sec);
8977424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append("] ");
9077424af660458104b732bdcb718874b17d0cab3aMarc Blank        if (prefix != null) {
9177424af660458104b732bdcb718874b17d0cab3aMarc Blank            sb.append(prefix);
9277424af660458104b732bdcb718874b17d0cab3aMarc Blank            sb.append("| ");
9377424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
9477424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append(str);
9577424af660458104b732bdcb718874b17d0cab3aMarc Blank        sb.append("\r\n");
9677424af660458104b732bdcb718874b17d0cab3aMarc Blank        String s = sb.toString();
9777424af660458104b732bdcb718874b17d0cab3aMarc Blank
98f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank        if (sLogWriter != null) {
991403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            try {
100f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                sLogWriter.write(s);
101f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                sLogWriter.flush();
1021403386ebffa1b6093a506a6a24db4523acdc315Marc Blank            } catch (IOException e) {
103f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                // Something might have happened to the sdcard
104f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
105f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                    // If the card is mounted and we can create the writer, retry
106f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                    LOGGER = new FileLogger();
107f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                    if (sLogWriter != null) {
10810ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                        try {
10910ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                            log("FileLogger", "Exception writing log; recreating...");
11010ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                            log(prefix, str);
11110ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                        } catch (Exception e1) {
11210ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                            // Nothing to do at this point
11310ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank                        }
114f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                    }
115f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank                }
11677424af660458104b732bdcb718874b17d0cab3aMarc Blank            }
11777424af660458104b732bdcb718874b17d0cab3aMarc Blank        }
11877424af660458104b732bdcb718874b17d0cab3aMarc Blank    }
11977424af660458104b732bdcb718874b17d0cab3aMarc Blank}
120