/*
* Copyright (C) 2014 Freddie (Musenkishi) Lust-Hed
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.musenkishi.wally.base;
import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.model.GlideUrl;
import com.crashlytics.android.Crashlytics;
import com.musenkishi.wally.BuildConfig;
import com.musenkishi.wally.dataprovider.DataProvider;
import com.musenkishi.wally.dataprovider.SharedPreferencesDataProvider;
import com.musenkishi.wally.dataprovider.okhttp.OkHttpUrlLoader;
import com.musenkishi.wally.fragments.SearchFragment;
import com.musenkishi.wally.models.ExceptionReporter;
import com.musenkishi.wally.models.filters.FilterAspectRatioKeys;
import com.musenkishi.wally.models.filters.FilterBoardsKeys;
import com.musenkishi.wally.models.filters.FilterGroupsStructure;
import com.musenkishi.wally.models.filters.FilterPurityKeys;
import com.musenkishi.wally.models.filters.FilterResOptKeys;
import com.musenkishi.wally.models.filters.FilterResolutionKeys;
import com.musenkishi.wally.models.filters.FilterTimeSpanKeys;
import com.squareup.okhttp.OkHttpClient;
import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
/**
* Created by Musenkishi on 2014-07-25.
*/
public class WallyApplication extends Application {
private static final int FAMILIAR_USER_COUNT = 3;
private static boolean SHOULD_SHOW_CRASH_LOGGING_PERMISSION = false;
private static DataProvider dataProvider;
private static Context applicationContext;
private static HashMap<Long, String> pairedDownloadIds;
private static HashSet<Long> downloadIDs;
private static HashMap<String, Object> searchFragmentMessages;
private static Bitmap bitmapThumb;
@Override
public void onCreate(){
super.onCreate();
Glide.get(this).register(GlideUrl.class, InputStream.class,
new OkHttpUrlLoader.Factory(new OkHttpClient()));
applicationContext = getApplicationContext();
startCrashLoggingIfUserAccepted();
checkVersionInstalled(BuildConfig.VERSION_CODE);
}
private void checkVersionInstalled(int currentVersion) {
int defaultVersion = 1;
int latestVersion = getDataProviderInstance()
.getSharedPreferencesDataProviderInstance()
.getLatestVersion(defaultVersion); //This is just to get a default version.
if (latestVersion < currentVersion) {
// The user comes from an app version where they might have
// Wallbase filter settings that conflicts with Wallhaven's filters.
// That's why the user's settings gets reset.
if (latestVersion == defaultVersion) {
getDataProviderInstance()
.getSharedPreferencesDataProviderInstance()
.getPrefs()
.edit()
.clear()
.apply();
}
}
getDataProviderInstance()
.getSharedPreferencesDataProviderInstance()
.setLatestVersion(BuildConfig.VERSION_CODE);
}
public static Context getContext(){
return applicationContext;
}
public static boolean shouldShowCrashLoggingPermission(){
return SHOULD_SHOW_CRASH_LOGGING_PERMISSION;
}
public static void setShouldShowCrashLoggingPermission(boolean shouldShow){
SHOULD_SHOW_CRASH_LOGGING_PERMISSION = shouldShow;
}
private void startCrashLoggingIfUserAccepted() {
if (getDataProviderInstance().getSharedPreferencesDataProviderInstance().getAppStartCount() >= FAMILIAR_USER_COUNT) {
switch (getDataProviderInstance().getSharedPreferencesDataProviderInstance().hasUserApprovedCrashLogging()){
case SharedPreferencesDataProvider.CRASH_LOGGING_APPROVED:
startCrashlytics(getContext());
break;
case SharedPreferencesDataProvider.CRASH_LOGGING_NOT_READ:
SHOULD_SHOW_CRASH_LOGGING_PERMISSION = true;
break;
case SharedPreferencesDataProvider.CRASH_LOGGING_NOT_APPROVED:
break;
default:
break;
}
} else {
getDataProviderInstance().getSharedPreferencesDataProviderInstance().incrementAppStartCount();
}
}
public static void startCrashlytics(Context context) {
if (!BuildConfig.DEBUG){
Crashlytics.start(context);
}
}
public static DataProvider getDataProviderInstance(){
if (dataProvider == null){
dataProvider = new DataProvider(getContext(), new ExceptionReporter.OnReportListener() {
@Override
public void report(Class fromClass, String reason, String exceptionMessage) {
if (getDataProviderInstance()
.getSharedPreferencesDataProviderInstance()
.hasUserApprovedCrashLogging() ==
SharedPreferencesDataProvider.CRASH_LOGGING_APPROVED) {
String message = "Class: " + fromClass.getName() + ", reason: " + reason +
", exceptionMessage: " + exceptionMessage;
Crashlytics.log(message);
}
}
});
}
return dataProvider;
}
public static HashMap<Long, String> getDownloadIDs() {
if (pairedDownloadIds == null) {
pairedDownloadIds = new HashMap<Long, String>();
}
return pairedDownloadIds;
}
public static FilterGroupsStructure getFilterSettings(){
FilterGroupsStructure filterGroupsStructure = new FilterGroupsStructure();
filterGroupsStructure.setTimespanFilter(dataProvider.getTimespan(FilterTimeSpanKeys.PARAMETER_KEY));
filterGroupsStructure.setBoardsFilter(dataProvider.getBoards(FilterBoardsKeys.PARAMETER_KEY));
filterGroupsStructure.setPurityFilter(dataProvider.getPurity(FilterPurityKeys.PARAMETER_KEY));
filterGroupsStructure.setAspectRatioFilter(dataProvider.getAspectRatio(FilterAspectRatioKeys.PARAMETER_KEY));
filterGroupsStructure.setResOptFilter(dataProvider.getResolutionOption(FilterResOptKeys.PARAMETER_KEY));
filterGroupsStructure.setResolutionFilter(dataProvider.getResolution(FilterResolutionKeys.PARAMETER_KEY));
return filterGroupsStructure;
}
public static Bitmap getBitmapThumb() {
return bitmapThumb;
}
public static void setBitmapThumb(Bitmap bitmapThumb) {
WallyApplication.bitmapThumb = bitmapThumb;
}
public static HashMap<String, Object> getSearchFragmentMessages() {
if (searchFragmentMessages == null) {
searchFragmentMessages = new HashMap<>();
}
return searchFragmentMessages;
}
public static HashMap<String, Object> readMessages(String fragmentTag) {
HashMap<String, Object> messages = new HashMap<>();
if (fragmentTag != null) {
if (fragmentTag.equals(SearchFragment.TAG)
&& !getSearchFragmentMessages().isEmpty()) {
messages.putAll(searchFragmentMessages);
searchFragmentMessages.clear();
return messages;
}
}
return messages;
}
}