package bf.io.openshop;
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
import android.support.test.espresso.IdlingResource;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
import com.facebook.FacebookSdk;
import java.util.Locale;
import bf.io.openshop.api.OkHttpStack;
import bf.io.openshop.testing.EspressoIdlingResource;
import timber.log.Timber;
/**
* Created by petr.melicherik.
*/
public class MyApplication extends Application {
public static final String PACKAGE_NAME = MyApplication.class.getPackage().getName();
private static final String TAG = MyApplication.class.getSimpleName();
public static String APP_VERSION = "0.0.0";
public static String ANDROID_ID = "0000000000000000";
private static MyApplication mInstance;
private RequestQueue mRequestQueue;
public static synchronized MyApplication getInstance() {
return mInstance;
}
/**
* Method sets app specific language localization by selected shop.
* Have to be called from every activity.
*
* @param lang language code.
*/
public static void setAppLocale(String lang) {
Resources res = mInstance.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale(lang);
Timber.d("Setting language: %s", lang);
res.updateConfiguration(conf, dm);
}
/**
* Method provides defaultRetryPolice.
* First Attempt = 14+(14*1)= 28s.
* Second attempt = 28+(28*1)= 56s.
* then invoke Response.ErrorListener callback.
*
* @return DefaultRetryPolicy object
*/
public static DefaultRetryPolicy getDefaultRetryPolice() {
return new DefaultRetryPolicy(14000, 2, 1);
}
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
FacebookSdk.sdkInitialize(this);
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
} else {
// TODO example of implementation custom crash reporting solution - Crashlytics.
// Fabric.with(this, new Crashlytics());
// Timber.plant(new CrashReportingTree());
}
try {
ANDROID_ID = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
if (ANDROID_ID == null || ANDROID_ID.isEmpty()) {
ANDROID_ID = "0000000000000000";
}
} catch (Exception e) {
ANDROID_ID = "0000000000000000";
}
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
APP_VERSION = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
// should never happen
Timber.e(e, "App versionName not found. WTF?. This should never happen.");
}
}
/**
* Method check, if internet is available.
*
* @return true if internet is available. Else otherwise.
*/
public boolean isDataConnected() {
ConnectivityManager connectMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectMan.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
}
public boolean isWiFiConnection() {
ConnectivityManager connectMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectMan.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////// Volley request ///////////////////////////////////////////////////////////////////////////////////////
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(this, new OkHttpStack());
}
return mRequestQueue;
}
@VisibleForTesting
public void setRequestQueue(RequestQueue requestQueue) {
mRequestQueue = requestQueue;
}
@VisibleForTesting
public IdlingResource getCountingIdlingResource() {
return EspressoIdlingResource.getIdlingResource();
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
// set the default tag if tag is empty
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
//////////////////////// end of Volley request. ///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TODO example of implementation custom crash reporting solution - Crashlytics.
// /**
// * A tree which logs important information for crash reporting.
// */
// private static class CrashReportingTree extends Timber.Tree {
// @Override
// protected void log(int priority, String tag, String message, Throwable t) {
// // Define message log priority
// if (priority <= android.util.Log.VERBOSE) {
// return;
// }
//
// if (t != null) {
// if (message != null) logMessage(tag, message);
// Crashlytics.logException(t);
// } else {
// logMessage(tag, message);
// }
// }
//
// private void logMessage(String tag, String message) {
// if (tag != null)
// Crashlytics.log("TAG: " + tag + ". MSG: " + message);
// else
// Crashlytics.log(message);
// }
// }
}