// Path: app/src/main/java/com/github/istin/schedule/manager/ConfigurationManager.java
// public class ConfigurationManager {
// 
//     public static final String KEY_CONFIG = "_config";
// 
//     public static final String APP_SERVICE_KEY = "config:manager";
// 
//     public static ConfigurationManager get(Context pContext) {
//         return CoreApplication.get(pContext, APP_SERVICE_KEY);
//     }
// 
//     public boolean isConfigured() {
//         return getConfig() != null;
//     }
// 
//     public static class Config implements Serializable {
// 
//         @SerializedName("l")
//         private Lecturer mLecturer;
// 
//         @SerializedName("u")
//         private University mUniversity;
// 
//         public Config(University pUniversity, Lecturer pLecturer) {
//             mLecturer = pLecturer;
//             mUniversity = pUniversity;
//         }
// 
//         public Lecturer getLecturer() {
//             return mLecturer;
//         }
// 
//         public University getUniversity() {
//             return mUniversity;
//         }
// 
//     }
// 
//     private Config mConfig;
// 
//     private Context mContext;
// 
//     private Object mLock = new Object();
// 
//     private boolean isInited = false;
// 
//     public ConfigurationManager(Context pContext) {
//         mContext = pContext;
//         new Thread(new Runnable() {
//             @Override
//             public void run() {
//                 if (isInited) {
//                     return;
//                 }
//                 firstInitialization();
//             }
//         }).start();
//     }
// 
//     protected void firstInitialization() {
//         synchronized (mLock) {
//             if (isInited) {
//                 return;
//             }
//             final SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
//             final String value = defaultSharedPreferences.getString(KEY_CONFIG, null);
//             if (value != null) {
//                 mConfig = new Gson().fromJson(value, Config.class);
//             }
//             isInited = true;
//         }
//     }
// 
//     public void setConfig(Config pConfig) {
//         mConfig = pConfig;
//         final SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
//         final String value = new Gson().toJson(mConfig, Config.class);
//         defaultSharedPreferences.edit().putString(KEY_CONFIG, value).apply();
//     }
// 
//     public Config getConfig() {
//         if (isInited) {
//             return mConfig;
//         }
//         firstInitialization();
//         return mConfig;
//     }
// }
// 
// Path: app/src/main/java/com/github/istin/schedule/manager/ThreadManager.java
// public class ThreadManager {
// 
//     public static final String APP_SERVICE_KEY = "thread:manager";
// 
//     public static ThreadManager get(Context pContext) {
//         return CoreApplication.get(pContext, APP_SERVICE_KEY);
//     }
// 
//     public interface IExecutionListener<Result> {
// 
//         void onJobStarted();
// 
//         void onDone(Result pResult);
// 
//         void onError(Exception e);
// 
//     }
// 
//     public interface IJob<Result> {
// 
//         Result doJob() throws Exception;
// 
//     }
// 
//     public <Result> void execute(final IJob<Result> pJob, final IExecutionListener<Result> pExecutionListener) {
//         pExecutionListener.onJobStarted();
//         final Handler handler = new Handler();
//         new Thread(new Runnable() {
//             @Override
//             public void run() {
//                 try {
//                     final Result result = pJob.doJob();
//                     handler.post(new Runnable() {
//                         @Override
//                         public void run() {
//                             pExecutionListener.onDone(result);
//                         }
//                     });
//                 } catch (final Exception e) {
//                     handler.post(new Runnable() {
//                         @Override
//                         public void run() {
//                             pExecutionListener.onError(e);
//                         }
//                     });
//                 }
//             }
//         }).start();
//     }
// 
// }


import android.app.Application;
import android.content.Context;
import com.github.istin.schedule.manager.ConfigurationManager;
import com.github.istin.schedule.manager.ThreadManager;
package com.github.istin.schedule;



/**
 * Created by uladzimir_klyshevich on 10/5/15.
 */
public class CoreApplication extends Application {

    private ConfigurationManager mConfigurationManager;

// Path: app/src/main/java/com/github/istin/schedule/manager/ConfigurationManager.java
// public class ConfigurationManager {
// 
//     public static final String KEY_CONFIG = "_config";
// 
//     public static final String APP_SERVICE_KEY = "config:manager";
// 
//     public static ConfigurationManager get(Context pContext) {
//         return CoreApplication.get(pContext, APP_SERVICE_KEY);
//     }
// 
//     public boolean isConfigured() {
//         return getConfig() != null;
//     }
// 
//     public static class Config implements Serializable {
// 
//         @SerializedName("l")
//         private Lecturer mLecturer;
// 
//         @SerializedName("u")
//         private University mUniversity;
// 
//         public Config(University pUniversity, Lecturer pLecturer) {
//             mLecturer = pLecturer;
//             mUniversity = pUniversity;
//         }
// 
//         public Lecturer getLecturer() {
//             return mLecturer;
//         }
// 
//         public University getUniversity() {
//             return mUniversity;
//         }
// 
//     }
// 
//     private Config mConfig;
// 
//     private Context mContext;
// 
//     private Object mLock = new Object();
// 
//     private boolean isInited = false;
// 
//     public ConfigurationManager(Context pContext) {
//         mContext = pContext;
//         new Thread(new Runnable() {
//             @Override
//             public void run() {
//                 if (isInited) {
//                     return;
//                 }
//                 firstInitialization();
//             }
//         }).start();
//     }
// 
//     protected void firstInitialization() {
//         synchronized (mLock) {
//             if (isInited) {
//                 return;
//             }
//             final SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
//             final String value = defaultSharedPreferences.getString(KEY_CONFIG, null);
//             if (value != null) {
//                 mConfig = new Gson().fromJson(value, Config.class);
//             }
//             isInited = true;
//         }
//     }
// 
//     public void setConfig(Config pConfig) {
//         mConfig = pConfig;
//         final SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
//         final String value = new Gson().toJson(mConfig, Config.class);
//         defaultSharedPreferences.edit().putString(KEY_CONFIG, value).apply();
//     }
// 
//     public Config getConfig() {
//         if (isInited) {
//             return mConfig;
//         }
//         firstInitialization();
//         return mConfig;
//     }
// }
// 
// Path: app/src/main/java/com/github/istin/schedule/manager/ThreadManager.java
// public class ThreadManager {
// 
//     public static final String APP_SERVICE_KEY = "thread:manager";
// 
//     public static ThreadManager get(Context pContext) {
//         return CoreApplication.get(pContext, APP_SERVICE_KEY);
//     }
// 
//     public interface IExecutionListener<Result> {
// 
//         void onJobStarted();
// 
//         void onDone(Result pResult);
// 
//         void onError(Exception e);
// 
//     }
// 
//     public interface IJob<Result> {
// 
//         Result doJob() throws Exception;
// 
//     }
// 
//     public <Result> void execute(final IJob<Result> pJob, final IExecutionListener<Result> pExecutionListener) {
//         pExecutionListener.onJobStarted();
//         final Handler handler = new Handler();
//         new Thread(new Runnable() {
//             @Override
//             public void run() {
//                 try {
//                     final Result result = pJob.doJob();
//                     handler.post(new Runnable() {
//                         @Override
//                         public void run() {
//                             pExecutionListener.onDone(result);
//                         }
//                     });
//                 } catch (final Exception e) {
//                     handler.post(new Runnable() {
//                         @Override
//                         public void run() {
//                             pExecutionListener.onError(e);
//                         }
//                     });
//                 }
//             }
//         }).start();
//     }
// 
// }


// Path: app/src/main/java/com/github/istin/schedule/CoreApplication.java
import android.app.Application;
import android.content.Context;
import com.github.istin.schedule.manager.ConfigurationManager;
import com.github.istin.schedule.manager.ThreadManager;

package com.github.istin.schedule;



/**
 * Created by uladzimir_klyshevich on 10/5/15.
 */
public class CoreApplication extends Application {

    private ConfigurationManager mConfigurationManager;

    private ThreadManager mThreadManager;