package org.softeg.slartus.forpdaplus;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.LocaleList;
import android.preference.PreferenceManager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.View;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import org.acra.ACRA;
import org.acra.ReportField;
import org.acra.ReportingInteractionMode;
import org.acra.annotation.ReportsCrashes;
import org.apache.http.HttpResponse;
import org.softeg.slartus.forpdacommon.ExtPreferences;
import org.softeg.slartus.forpdanotifyservice.MainService;
import org.softeg.slartus.forpdanotifyservice.favorites.FavoritesNotifier;
import org.softeg.slartus.forpdanotifyservice.qms.QmsNotifier;
import org.softeg.slartus.forpdaplus.classes.common.ArrayUtils;
import org.softeg.slartus.forpdaplus.db.DbHelper;
import org.softeg.slartus.forpdaplus.prefs.PreferencesActivity;
import org.softeg.slartus.forpdaplus.tabs.TabItem;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
/**
* User: slinkin
* Date: 05.08.11
* Time: 8:03
*/
@ReportsCrashes(
mailTo = "ololosh10050@gmail.com,devuicore@gmail.com",
mode = ReportingInteractionMode.DIALOG,
customReportContent = {ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME,
ReportField.ANDROID_VERSION, ReportField.PHONE_MODEL,
ReportField.CUSTOM_DATA, ReportField.STACK_TRACE, ReportField.LOGCAT},
resToastText = R.string.crash_toast_text, // optional, displayed as soon as the crash occurs, before collecting data which can take a few seconds
resDialogText = R.string.crash_dialog_text,
resDialogIcon = R.drawable.icon_mat, //optional. default is a warning sign
resDialogTitle = R.string.crash_dialog_title, // optional. default is your application name
resDialogCommentPrompt = R.string.crash_dialog_comment_prompt, // optional. when defined, adds a user text field input with this text resource as a label
resDialogOkToast = R.string.crash_dialog_ok_toast, // optional. displays a Toast message when the user accepts to send a report.)
resDialogTheme = R.style.Crash_Dialog
)
public class App extends android.app.Application {
public static final int THEME_LIGHT = 0;
public static final int THEME_DARK = 1;
public static final int THEME_BLACK = 6;
public static final int THEME_MATERIAL_LIGHT = 2;
public static final int THEME_MATERIAL_DARK = 3;
public static final int THEME_MATERIAL_BLACK = 5;
public static final int THEME_LIGHT_OLD_HD = 4;
public static final int THEME_CUSTOM_CSS = 99;
private final Integer[] LIGHT_THEMES = {THEME_LIGHT, THEME_LIGHT_OLD_HD, THEME_MATERIAL_LIGHT};
private final Integer[] DARK_THEMES = {THEME_MATERIAL_DARK, THEME_DARK};
public static final int THEME_TYPE_LIGHT = 0;
public static final int THEME_TYPE_DARK = 2;
public static final int THEME_TYPE_BLACK = 3;
private Locale locale;
private String lang;
private String currentFragmentTag;
private int tabIterator = 0;
public int getTabIterator() {
return tabIterator;
}
public void setTabIterator(int tabIterator) {
this.tabIterator = tabIterator;
}
public void clearTabIterator() {
tabIterator = 0;
}
public void plusTabIterator() {
tabIterator++;
}
public String getCurrentFragmentTag() {
return currentFragmentTag;
}
public void setCurrentFragmentTag(String s) {
currentFragmentTag = s;
}
private List<TabItem> mTabItems = new ArrayList<>();
public void setmTabItems(List<TabItem> mTabItems) {
this.mTabItems = mTabItems;
}
public List<TabItem> getTabItems() {
return mTabItems;
}
public int getLastTabPosition(int delPos) {
if ((mTabItems.size() - 1) < delPos) delPos--;
return delPos;
}
public boolean isContainsByTag(String tag) {
for (TabItem item : getTabItems())
if (item.getTag().equals(tag)) return true;
return false;
}
public boolean isContainsByUrl(String url) {
for (TabItem item : getTabItems())
if (item.getUrl().equals(url)) return true;
return false;
}
public TabItem getTabByTag(String tag) {
for (TabItem item : getTabItems())
if (item.getTag().equals(tag)) return item;
return null;
}
public TabItem getTabByUrl(String url) {
for (TabItem item : getTabItems())
if (item.getUrl().equals(url)) return item;
return null;
}
private AtomicInteger m_AtomicInteger = new AtomicInteger();
public int getUniqueIntValue() {
return m_AtomicInteger.incrementAndGet();
}
private SharedPreferences preferences;
public SharedPreferences getPreferences() {
if (preferences == null)
preferences = PreferenceManager.getDefaultSharedPreferences(this);
return preferences;
}
public String getWebViewFont() {
return getPreferences().getString("webViewFontName", "");
}
public int getColorAccent(String type) {
int color = 0;
switch (type) {
case "Accent":
color = getPreferences().getInt("accentColor", Color.rgb(2, 119, 189));
break;
case "Pressed":
color = getPreferences().getInt("accentColorPressed", Color.rgb(0, 89, 159));
break;
}
return color;
}
public int getMainAccentColor() {
int color = R.color.accentPink;
switch (getPreferences().getString("mainAccentColor", "pink")) {
case "pink":
color = R.color.accentPink;
break;
case "blue":
color = R.color.accentBlue;
break;
case "gray":
color = R.color.accentGray;
break;
}
return color;
}
public int getThemeStyleResID() {
int theme = R.style.ThemeLight;
String color = getPreferences().getString("mainAccentColor", "pink");
int themeType = getThemeType();
if (themeType == THEME_TYPE_LIGHT) {
switch (color) {
case "pink":
theme = R.style.MainPinkLight;
break;
case "blue":
theme = R.style.MainBlueLight;
break;
case "gray":
theme = R.style.MainGrayLight;
break;
}
} else if (themeType == THEME_TYPE_DARK) {
switch (color) {
case "pink":
theme = R.style.MainPinkDark;
break;
case "blue":
theme = R.style.MainBlueDark;
break;
case "gray":
theme = R.style.MainGrayDark;
break;
}
} else {
switch (color) {
case "pink":
theme = R.style.MainPinkBlack;
break;
case "blue":
theme = R.style.MainBlueBlack;
break;
case "gray":
theme = R.style.MainGrayBlack;
break;
}
}
return theme;
}
public int getPrefsThemeStyleResID() {
int theme = R.style.ThemePrefsLightPink;
String color = getPreferences().getString("mainAccentColor", "pink");
int themeType = getThemeType();
if (themeType == THEME_TYPE_LIGHT) {
switch (color) {
case "pink":
theme = R.style.ThemePrefsLightPink;
break;
case "blue":
theme = R.style.ThemePrefsLightBlue;
break;
case "gray":
theme = R.style.ThemePrefsLightGray;
break;
}
} else if (themeType == THEME_TYPE_DARK) {
switch (color) {
case "pink":
theme = R.style.ThemePrefsDarkPink;
break;
case "blue":
theme = R.style.ThemePrefsDarkBlue;
break;
case "gray":
theme = R.style.ThemePrefsDarkGray;
break;
}
} else {
switch (color) {
case "pink":
theme = R.style.ThemePrefsBlackPink;
break;
case "blue":
theme = R.style.ThemePrefsBlackBlue;
break;
case "gray":
theme = R.style.ThemePrefsBlackGray;
break;
}
}
return theme;
}
public int getThemeType() {
int themeType = 0;
String themeStr = getCurrentTheme();
if (themeStr.length() < 3) {
int theme = Integer.parseInt(themeStr);
if (ArrayUtils.indexOf(theme, LIGHT_THEMES) != -1)
themeType = THEME_TYPE_LIGHT;
else if (ArrayUtils.indexOf(theme, DARK_THEMES) != -1)
themeType = THEME_TYPE_DARK;
else
themeType = THEME_TYPE_BLACK;
} else {
if (themeStr.contains("/light/"))
themeType = THEME_TYPE_LIGHT;
else if (themeStr.contains("/dark/"))
themeType = THEME_TYPE_DARK;
else if (themeStr.contains("/black/"))
themeType = THEME_TYPE_BLACK;
}
return themeType;
}
public int getThemeBackgroundColorRes() {
int themeType = getThemeType();
if (themeType == THEME_TYPE_LIGHT)
return R.color.app_background_light;
else if (themeType == THEME_TYPE_DARK)
return R.color.app_background_dark;
else
return R.color.app_background_black;
}
public int getSwipeRefreshBackground() {
int themeType = getThemeType();
if (themeType == THEME_TYPE_LIGHT)
return R.color.swipe_background_light;
else if (themeType == THEME_TYPE_DARK)
return R.color.swipe_background_dark;
else
return R.color.swipe_background_black;
}
public int getNavBarColor() {
int themeType = getThemeType();
if (themeType == THEME_TYPE_LIGHT)
return R.color.navBar_light;
else if (themeType == THEME_TYPE_DARK)
return R.color.navBar_dark;
else
return R.color.navBar_black;
}
public int getDrawerMenuText() {
int themeType = getThemeType();
if (themeType == THEME_TYPE_LIGHT)
return R.color.drawer_menu_text_light;
else if (themeType == THEME_TYPE_DARK)
return R.color.drawer_menu_text_dark;
else
return R.color.drawer_menu_text_dark;
}
public int getThemeStyleWebViewBackground() {
int themeType = getThemeType();
if (themeType == THEME_TYPE_LIGHT)
return Color.parseColor("#eeeeee");
else if (themeType == THEME_TYPE_DARK)
return Color.parseColor("#1a1a1a");
else
return Color.parseColor("#000000");
}
public String getCurrentBackgroundColorHtml() {
int themeType = getThemeType();
if (themeType == THEME_TYPE_LIGHT)
return "#eeeeee";
else if (themeType == THEME_TYPE_DARK)
return "#1a1a1a";
else
return "#000000";
}
public String getCurrentTheme() {
return getPreferences().getString("appstyle", Integer.toString(THEME_LIGHT));
}
public String getCurrentThemeName() {
int themeType = getThemeType();
if (themeType == THEME_TYPE_LIGHT)
return "white";
else if (themeType == THEME_TYPE_DARK)
return "dark";
else
return "black";
}
private String checkThemeFile(String themePath) {
try {
if (!new File(themePath).exists()) {
// Toast.makeText(INSTANCE,"не найден файл темы: "+themePath,Toast.LENGTH_LONG).show();
return defaultCssTheme();
}
return themePath;
} catch (Throwable ex) {
return defaultCssTheme();
}
}
private String defaultCssTheme() {
return "/android_asset/forum/css/4pda_light_blue.css";
}
public String getThemeCssFileName() {
String themeStr = getCurrentTheme();
return getThemeCssFileName(themeStr);
}
public String getThemeCssFileName(String themeStr) {
if (themeStr.length() > 3)
return checkThemeFile(themeStr);
String path = "/android_asset/forum/css/";
String cssFile = "4pda_light_blue.css";
int theme = Integer.parseInt(themeStr);
if (theme == -1)
return themeStr;
String color = getPreferences().getString("mainAccentColor", "pink");
switch (theme) {
case THEME_LIGHT:
switch (color) {
case "pink":
cssFile = "4pda_light_blue.css";
break;
case "blue":
cssFile = "4pda_light_pink.css";
break;
case "gray":
cssFile = "4pda_light_gray.css";
break;
}
break;
case THEME_DARK:
switch (color) {
case "pink":
cssFile = "4pda_dark_blue.css";
break;
case "blue":
cssFile = "4pda_dark_pink.css";
break;
case "gray":
cssFile = "4pda_dark_gray.css";
break;
}
break;
case THEME_BLACK:
switch (color) {
case "pink":
cssFile = "4pda_black_blue.css";
break;
case "blue":
cssFile = "4pda_black_pink.css";
break;
case "gray":
cssFile = "4pda_black_gray.css";
break;
}
break;
case THEME_MATERIAL_LIGHT:
cssFile = "material_light.css";
break;
case THEME_MATERIAL_DARK:
cssFile = "material_dark.css";
break;
case THEME_MATERIAL_BLACK:
cssFile = "material_black.css";
break;
case THEME_LIGHT_OLD_HD:
cssFile = "standart_4PDA.css";
break;
/*case THEME_WHITE_HD:
cssFile = "white_hd.css";
break;
case THEME_BLACK_HD:
cssFile = "black_hd.css";
break;*/
case THEME_CUSTOM_CSS:
return "/mnt/sdcard/style.css";
}
return path + cssFile;
}
private static App INSTANCE = null;
public App() {
INSTANCE = this;
}
private MyActivityLifecycleCallbacks m_MyActivityLifecycleCallbacks;
private static boolean isNewYear = false;
@Override
public void onCreate() {
super.onCreate();
Configuration config = getResources().getConfiguration();
lang = getPreferences().getString("lang", "default");
if (lang.equals("default")) {
lang = config.locale.getLanguage();
}
locale = new Locale(lang);
Locale.setDefault(locale);
config.locale = locale;
getResources().updateConfiguration(config, null);
ACRA.init(this);
ACRA.getErrorReporter().putCustomData("USER_NICK", getPreferences().getString("Login", "empty"));
initImageLoader(this);
m_MyActivityLifecycleCallbacks = new MyActivityLifecycleCallbacks();
registerActivityLifecycleCallbacks(m_MyActivityLifecycleCallbacks);
setTheme(getThemeStyleResID());
try {
DbHelper.prepareBases(this);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("KEK", "CHANGE CONFIG " + locale.getCountry() + " : " + newConfig.locale.getCountry());
Configuration config = getResources().getConfiguration();
locale = new Locale(lang);
Locale.setDefault(locale);
config.locale = locale;
getResources().updateConfiguration(config, null);
}
public boolean isNewYear() {
return isNewYear;
}
public void exit() {
m_MyActivityLifecycleCallbacks.finishActivities();
}
private static Boolean m_QmsStarted = false;
private static Boolean m_FavoritesNotifierStarted = false;
public static App getInstance() {
if (INSTANCE == null) {
INSTANCE = new App();
}
if (!m_QmsStarted) {
reStartQmsService();
}
if (!m_FavoritesNotifierStarted) {
reStartFavoritesNotifierService();
}
return INSTANCE;
}
public static void resStartNotifierServices() {
reStartQmsService();
reStartFavoritesNotifierService();
}
public static void stopQmsService() {
try {
QmsNotifier.cancelAlarm(INSTANCE);
} catch (Throwable e) {
e.printStackTrace();
}
}
public static void reStartQmsService() {
reStartQmsService(false);
}
public static void reStartQmsService(Boolean adaptive) {
stopQmsService();
startQmsService(adaptive);
}
private static void startQmsService(Boolean adaptive) {
m_QmsStarted = true;
try {
if (!QmsNotifier.isUse(getContext()))
return;
Intent intent = new Intent(INSTANCE, MainService.class);
intent.putExtra("CookiesPath", PreferencesActivity.getCookieFilePath(INSTANCE));
float timeout = Math.max(ExtPreferences.parseFloat(App.getInstance().getPreferences(),
QmsNotifier.TIME_OUT_KEY, 5), 1);
intent.putExtra(QmsNotifier.TIME_OUT_KEY, timeout);
if (adaptive)
intent.putExtra(QmsNotifier.ADAPTIVE_TIME_OUT_KEY, 1.0f);
QmsNotifier.restartTask(INSTANCE, intent);
} catch (Throwable e) {
e.printStackTrace();
}
}
private static DisplayImageOptions.Builder options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.no_image)
.cacheInMemory(true)
.resetViewBeforeLoading(true)
.cacheOnDisc(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.handler(new Handler())
.displayer(new FadeInBitmapDisplayer(500, true, true, false));
public static DisplayImageOptions.Builder getDefaultOptionsUIL() {
return options;
}
public static void initImageLoader(Context context) {
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
//.imageDownloader(new HttpHelperForImage(context))
.imageDownloader(new BaseImageDownloader(context) {
@Override
public InputStream getStream(String imageUri, Object extra) throws IOException {
if (imageUri.substring(0, 2).equals("//"))
imageUri = "http:".concat(imageUri);
return super.getStream(imageUri, extra);
}
@Override
protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
HttpResponse httpResponse = new HttpHelper().getDownloadResponse(imageUri, 0);
return httpResponse.getEntity().getContent();
}
})
.threadPoolSize(5)
.threadPriority(Thread.MIN_PRIORITY)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedMemoryCache(5 * 1024 * 1024)) // 2 Mb
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.defaultDisplayImageOptions(options.build())
.build();
ImageLoader.getInstance().init(config);
}
private static void stopFavoritesNotifierService() {
try {
FavoritesNotifier.cancelAlarm(INSTANCE);
} catch (Throwable e) {
e.printStackTrace();
}
}
private static void reStartFavoritesNotifierService() {
stopFavoritesNotifierService();
startFavoritesNotifierService();
}
private static void startFavoritesNotifierService() {
m_FavoritesNotifierStarted = true;
try {
if (!FavoritesNotifier.isUse(getContext())) return;
Intent intent = new Intent(INSTANCE, MainService.class);
intent.putExtra("CookiesPath", PreferencesActivity.getCookieFilePath(INSTANCE));
intent.putExtra(FavoritesNotifier.TIME_OUT_KEY, Math.max(ExtPreferences.parseFloat(App.getInstance().getPreferences(),
FavoritesNotifier.TIME_OUT_KEY, 5), 1));
FavoritesNotifier.restartTask(INSTANCE, intent);
} catch (Throwable e) {
e.printStackTrace();
}
}
public static Context getContext() {
return getInstance();
}
public static SwipeRefreshLayout createSwipeRefreshLayout(Activity activity, View view,
final Runnable refreshAction) {
SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.ptr_layout);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshAction.run();
}
});
swipeRefreshLayout.setColorSchemeResources(App.getInstance().getMainAccentColor());
swipeRefreshLayout.setProgressBackgroundColorSchemeResource(App.getInstance().getSwipeRefreshBackground());
return swipeRefreshLayout;
}
private static final class MyActivityLifecycleCallbacks implements ActivityLifecycleCallbacks {
private HashMap<String, Activity> m_Activities = new HashMap<>();
public void onActivityCreated(Activity activity, Bundle bundle) {
m_Activities.put(activity.getLocalClassName(), activity);
}
public void onActivityDestroyed(Activity activity) {
if (m_Activities.containsKey(activity.getLocalClassName()))
m_Activities.remove(activity.getLocalClassName());
}
public void onActivityPaused(Activity activity) {
}
public void onActivityResumed(Activity activity) {
}
public void onActivitySaveInstanceState(Activity activity,
Bundle outState) {
}
public void onActivityStarted(Activity activity) {
}
public void onActivityStopped(Activity activity) {
}
public void finishActivities() {
for (Map.Entry<String, Activity> entry : m_Activities.entrySet()) {
try {
Activity activity = entry.getValue();
if (activity == null)
continue;
if (Build.VERSION.SDK_INT >= 17 && activity.isDestroyed())
continue;
if (activity.isFinishing())
continue;
entry.getValue().finish();
} catch (Throwable ex) {
Log.e("", "finishActivities:" + ex.toString());
}
}
}
}
}