blob: a81319df3db31d73ca511849c147fff15add31ad (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
package cgeo.geocaching;
import cgeo.geocaching.sensors.DirectionProvider;
import cgeo.geocaching.sensors.GeoDataProvider;
import cgeo.geocaching.sensors.IGeoData;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.OOMDumpingUncaughtExceptionHandler;
import rx.Observable;
import rx.functions.Action1;
import rx.observables.ConnectableObservable;
import android.app.Application;
import android.view.ViewConfiguration;
import java.lang.reflect.Field;
public class CgeoApplication extends Application {
private boolean forceRelog = false; // c:geo needs to log into cache providers
public boolean showLoginToast = true; //login toast shown just once.
private boolean liveMapHintShownInThisSession = false; // livemap hint has been shown
private static CgeoApplication instance;
private Observable<IGeoData> geoDataObservable;
private Observable<Float> directionObservable;
private volatile IGeoData currentGeo = null;
private volatile float currentDirection = 0.0f;
public static void dumpOnOutOfMemory(final boolean enable) {
if (enable) {
if (!OOMDumpingUncaughtExceptionHandler.activateHandler()) {
Log.e("OOM dumping handler not activated (either a problem occured or it was already active)");
}
} else {
if (!OOMDumpingUncaughtExceptionHandler.resetToDefault()) {
Log.e("OOM dumping handler not resetted (either a problem occured or it was not active)");
}
}
}
public CgeoApplication() {
setInstance(this);
}
private static void setInstance(final CgeoApplication application) {
instance = application;
}
public static CgeoApplication getInstance() {
return instance;
}
@Override
public void onCreate() {
try {
final ViewConfiguration config = ViewConfiguration.get(this);
final Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
} catch (final IllegalArgumentException e) {
// ignore
} catch (final NoSuchFieldException e) {
// ignore
} catch (final IllegalAccessException e) {
// ignore
}
// Set language to English if the user decided so.
Settings.setLanguage(Settings.isUseEnglish());
// ensure initialization of lists
DataStore.getLists();
}
@Override
public void onLowMemory() {
Log.i("Cleaning applications cache.");
DataStore.removeAllFromCache();
}
public synchronized Observable<IGeoData> geoDataObservable() {
if (geoDataObservable == null) {
final ConnectableObservable<IGeoData> onDemand = GeoDataProvider.create(this).replay(1);
onDemand.subscribe(new Action1<IGeoData>() {
@Override
public void call(final IGeoData geoData) {
currentGeo = geoData;
}
});
geoDataObservable = onDemand.refCount();
}
return geoDataObservable;
}
public synchronized Observable<Float> directionObservable() {
if (directionObservable == null) {
final ConnectableObservable<Float> onDemand = DirectionProvider.create(this).replay(1);
onDemand.subscribe(new Action1<Float>() {
@Override
public void call(final Float direction) {
currentDirection = direction;
}
});
directionObservable = onDemand.refCount();
}
return directionObservable;
}
public IGeoData currentGeo() {
return currentGeo != null ? currentGeo : geoDataObservable().toBlocking().first();
}
public Float distanceNonBlocking(final ICoordinates target) {
if (currentGeo == null || target.getCoords() == null) {
return null;
}
return currentGeo.getCoords().distanceTo(target);
}
public float currentDirection() {
return currentDirection;
}
public boolean isLiveMapHintShownInThisSession() {
return liveMapHintShownInThisSession;
}
public void setLiveMapHintShownInThisSession() {
liveMapHintShownInThisSession = true;
}
/**
* Check if cgeo must relog even if already logged in.
*
* @return <code>true</code> if it is necessary to relog
*/
public boolean mustRelog() {
final boolean mustLogin = forceRelog;
forceRelog = false;
return mustLogin;
}
/**
* Force cgeo to relog when reaching the main activity.
*/
public void forceRelog() {
forceRelog = true;
}
}
|