package com.amaze.filemanager.utils; import android.app.Application; import android.content.Context; import android.os.AsyncTask; import android.os.Handler; import android.os.HandlerThread; import android.os.StrictMode; import android.text.TextUtils; import android.widget.Toast; import com.amaze.filemanager.utils.provider.UtilitiesProvider; import com.amaze.filemanager.utils.provider.UtilitiesProviderInterface; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.Volley; /** * Created by vishal on 7/12/16. */ public class AppConfig extends Application { public static final String TAG = AppConfig.class.getSimpleName(); private UtilitiesProviderInterface utilsProvider; private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static Handler mApplicationHandler = new Handler(); private static HandlerThread sBackgroundHandlerThread = new HandlerThread("app_background"); private static Handler sBackgroundHandler; private static AppConfig mInstance; public UtilitiesProviderInterface getUtilsProvider() { return utilsProvider; } @Override public void onCreate() { super.onCreate(); mInstance = this; utilsProvider = new UtilitiesProvider(this); sBackgroundHandlerThread.start(); sBackgroundHandler = new Handler(sBackgroundHandlerThread.getLooper()); // disabling file exposure method check for api n+ StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); } @Override public void onTerminate() { super.onTerminate(); sBackgroundHandlerThread.quit(); } /** * Post a runnable to handler. Use this in case we don't have any restriction to execute after * this runnable is executed, and {@link #runInBackground(CustomAsyncCallbacks)} in case we need * to execute something after execution in background * @param runnable */ public static void runInBackground(Runnable runnable) { synchronized (sBackgroundHandler) { sBackgroundHandler.post(runnable); } } /** * A compact AsyncTask which runs which executes whatever is passed by callbacks. * Supports any class that extends an object as param array, and result too. * @param customAsyncCallbacks */ public static void runInBackground(final CustomAsyncCallbacks customAsyncCallbacks) { synchronized (customAsyncCallbacks) { new AsyncTask<Object, Void, Object>() { @Override protected Void doInBackground(Object... params) { return customAsyncCallbacks.doInBackground(); } @Override protected void onPostExecute(Object aVoid) { super.onPostExecute(aVoid); customAsyncCallbacks.onPostExecute(aVoid); } }.execute(customAsyncCallbacks.params()); } } /** * Interface providing callbacks utilized by {@link #runInBackground(CustomAsyncCallbacks)} */ public interface CustomAsyncCallbacks { <E extends Object> E doInBackground(); Void onPostExecute(Object result); <T extends Object> T[] params(); } /** * Shows a toast message * * @param context Any context belonging to this application * @param message The message to show */ public static void toast(Context context, String message) { // this is a static method so it is easier to call, // as the context checking and casting is done for you if (context == null) return; if (!(context instanceof Application)) { context = context.getApplicationContext(); } if (context instanceof Application) { final Context c = context; final String m = message; ((AppConfig) context).runInApplicationThread(new Runnable() { @Override public void run() { Toast.makeText(c, m, Toast.LENGTH_LONG).show(); } }); } } /** * Run a runnable in the main application thread * * @param r Runnable to run */ public void runInApplicationThread(Runnable r) { mApplicationHandler.post(r); } public static synchronized AppConfig getInstance() { return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(getApplicationContext()); } return mRequestQueue; } public ImageLoader getImageLoader() { getRequestQueue(); if (mImageLoader == null) { this.mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache()); } return mImageLoader; } public <T> void addToRequestQueue(Request<T> req, String tag) { req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); getRequestQueue().add(req); } public <T> void addToRequestQueue(Request<T> req) { req.setTag(TAG); getRequestQueue().add(req); } public void cancelPendingRequests(Object tag) { if (mRequestQueue != null) { mRequestQueue.cancelAll(tag); } } }