package org.indywidualni.fblite.util.logger; import android.Manifest; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.preference.PreferenceManager; import android.support.v4.content.ContextCompat; import android.util.Log; import android.widget.Toast; import org.indywidualni.fblite.MyApplication; import org.indywidualni.fblite.R; import java.io.File; import java.lang.ref.WeakReference; /** Singleton pattern */ public final class Logger { private static volatile Logger instance; private static final int MSG_SHOW_TOAST = 1; private final SharedPreferences preferences; private final String logFilePath; private final MyHandler messageHandler; private Logger() { messageHandler = new MyHandler(this); preferences = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContextOfApplication()); logFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + MyApplication.getContextOfApplication().getString(R.string.app_name) .replace(" ", "") + ".log"; } public static Logger getInstance() { if (instance == null) { synchronized (Logger.class) { if (instance == null) instance = new Logger(); } } return instance; } private boolean checkStoragePermission() { String storagePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE; int hasPermission = ContextCompat.checkSelfPermission(MyApplication.getContextOfApplication(), storagePermission); return hasPermission == PackageManager.PERMISSION_GRANTED; } private static class MyHandler extends Handler { private final WeakReference<Logger> mLogger; public MyHandler(Logger logger) { mLogger = new WeakReference<>(logger); } @Override public void handleMessage(Message msg) { Logger logger = mLogger.get(); if (logger != null) { if (msg.what == MSG_SHOW_TOAST) { String message = (String) msg.obj; Toast.makeText(MyApplication.getContextOfApplication(), message , Toast.LENGTH_SHORT) .show(); } } } } private void displayStoragePermissionRefused() { Message msg = new Message(); msg.what = MSG_SHOW_TOAST; msg.obj = MyApplication.getContextOfApplication().getString(R.string.file_logger_needs_permission); messageHandler.sendMessage(msg); } public synchronized void i(String tag, String msg) { final boolean fileLoggingEnabled = preferences.getBoolean("file_logging", false); final boolean mounted = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); final boolean storageReady = mounted && checkStoragePermission(); if (fileLoggingEnabled && storageReady) { FileLog.open(logFilePath, Log.VERBOSE, 1000000); // 1 megabyte FileLog.i(tag, msg); FileLog.close(); } else if (fileLoggingEnabled) { displayStoragePermissionRefused(); Log.i(tag, msg); } else { // use a standard logger instead Log.i(tag, msg); } } }