blob: 265e7ebcc1124072a4367864d64614494e331cc2 (
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
|
package cgeo.geocaching;
import cgeo.geocaching.ui.dialog.Dialogs;
import cgeo.geocaching.utils.IObserver;
import cgeo.geocaching.utils.Log;
import android.app.Activity;
import android.app.Application;
import android.app.ProgressDialog;
import android.content.res.Resources;
import java.util.concurrent.atomic.AtomicBoolean;
public class CgeoApplication extends Application {
private volatile GeoDataProvider geo;
private volatile DirectionProvider dir;
private boolean forceRelog = false; // c:geo needs to log into cache providers
public boolean showLoginToast = true; //login toast shown just once.
private boolean liveMapHintShown = false; // livemap hint has been shown
private static CgeoApplication instance;
public CgeoApplication() {
setInstance(this);
}
private static void setInstance(final CgeoApplication application) {
instance = application;
}
public static CgeoApplication getInstance() {
return instance;
}
@Override
public void onLowMemory() {
Log.i("Cleaning applications cache.");
DataStore.removeAllFromCache();
}
/**
* Move the database to/from external cgdata in a new thread,
* showing a progress window
*
* @param fromActivity
*/
public void moveDatabase(final Activity fromActivity) {
final Resources res = this.getResources();
final ProgressDialog dialog = ProgressDialog.show(fromActivity, res.getString(R.string.init_dbmove_dbmove), res.getString(R.string.init_dbmove_running), true, false);
final AtomicBoolean atomic = new AtomicBoolean(false);
new Thread() {
@Override
public void run() {
atomic.set(DataStore.moveDatabase());
fromActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
dialog.dismiss();
boolean success = atomic.get();
String message = success ? res.getString(R.string.init_dbmove_success) : res.getString(R.string.init_dbmove_failed);
Dialogs.message(fromActivity, R.string.init_dbmove_dbmove, message);
}
});
}
}.start();
}
/**
* Register an observer to receive GeoData information.
* <br/>
* If there is a chance that no observers are registered before this
* method is called, it is necessary to call it from a task implementing
* a looper interface as the data provider will use listeners that
* require a looper thread to run.
*
* @param observer a geodata observer
*/
public void addGeoObserver(final IObserver<? super IGeoData> observer) {
currentGeoObject().addObserver(observer);
}
public void deleteGeoObserver(final IObserver<? super IGeoData> observer) {
currentGeoObject().deleteObserver(observer);
}
private GeoDataProvider currentGeoObject() {
if (geo == null) {
synchronized(this) {
if (geo == null) {
geo = new GeoDataProvider(this);
}
}
}
return geo;
}
public IGeoData currentGeo() {
return currentGeoObject().getMemory();
}
public void addDirectionObserver(final IObserver<? super Float> observer) {
currentDirObject().addObserver(observer);
}
public void deleteDirectionObserver(final IObserver<? super Float> observer) {
currentDirObject().deleteObserver(observer);
}
private DirectionProvider currentDirObject() {
if (dir == null) {
synchronized(this) {
if (dir == null) {
dir = new DirectionProvider(this);
}
}
}
return dir;
}
public Float currentDirection() {
return currentDirObject().getMemory();
}
public boolean isLiveMapHintShown() {
return liveMapHintShown;
}
public void setLiveMapHintShown() {
liveMapHintShown = 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;
}
}
|