PageRenderTime 29ms CodeModel.GetById 0ms RepoModel.GetById 1ms app.codeStats 0ms

/workspace/aMetro/src/org/ametro/app/ApplicationEx.java

http://ametro.googlecode.com/
Java | 325 lines | 263 code | 38 blank | 24 comment | 51 complexity | d04d2f870a530fd083aa7caf5213c517 MD5 | raw file
Possible License(s): GPL-3.0
  1. /*
  2. * http://code.google.com/p/ametro/
  3. * Transport map viewer for Android platform
  4. * Copyright (C) 2009-2010 contacts@ametro.org Roman Golovanov and other
  5. * respective project committers (see project home page)
  6. *
  7. * This program is free software: you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation, either version 3 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. *
  20. */
  21. package org.ametro.app;
  22. import static org.ametro.app.Constants.HTTP_CONNECTION_TIMEOUT;
  23. import static org.ametro.app.Constants.HTTP_SOCKET_TIMEOUT;
  24. import java.io.FileOutputStream;
  25. import org.ametro.catalog.storage.CatalogStorage;
  26. import org.ametro.directory.CityDirectory;
  27. import org.ametro.directory.CountryDirectory;
  28. import org.ametro.directory.ImportDirectory;
  29. import org.ametro.directory.ImportMapDirectory;
  30. import org.ametro.directory.ImportTransportDirectory;
  31. import org.ametro.directory.StationDirectory;
  32. import org.ametro.receiver.AlarmReceiver;
  33. import org.ametro.receiver.BootCompletedReceiver;
  34. import org.ametro.receiver.NetworkStateReceiver;
  35. import org.ametro.service.AutoUpdateService;
  36. import org.ametro.util.FileUtil;
  37. import org.apache.http.HttpVersion;
  38. import org.apache.http.client.HttpClient;
  39. import org.apache.http.conn.ClientConnectionManager;
  40. import org.apache.http.conn.scheme.PlainSocketFactory;
  41. import org.apache.http.conn.scheme.Scheme;
  42. import org.apache.http.conn.scheme.SchemeRegistry;
  43. import org.apache.http.conn.ssl.SSLSocketFactory;
  44. import org.apache.http.impl.client.DefaultHttpClient;
  45. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
  46. import org.apache.http.params.BasicHttpParams;
  47. import org.apache.http.params.HttpConnectionParams;
  48. import org.apache.http.params.HttpParams;
  49. import org.apache.http.params.HttpProtocolParams;
  50. import org.apache.http.protocol.HTTP;
  51. import android.app.AlarmManager;
  52. import android.app.Application;
  53. import android.app.PendingIntent;
  54. import android.content.ComponentName;
  55. import android.content.Context;
  56. import android.content.Intent;
  57. import android.content.pm.PackageManager;
  58. import android.net.ConnectivityManager;
  59. import android.net.NetworkInfo;
  60. import android.util.Log;
  61. public class ApplicationEx extends Application {
  62. public CountryDirectory getCountryDirectory() {
  63. if (mCountryDirectory == null) {
  64. synchronized (ApplicationEx.class) {
  65. if (mCountryDirectory == null) {
  66. mCountryDirectory = new CountryDirectory(this);
  67. }
  68. }
  69. }
  70. return mCountryDirectory;
  71. }
  72. public CityDirectory getCityDirectory() {
  73. if (mCityDirectory == null) {
  74. synchronized (ApplicationEx.class) {
  75. if (mCityDirectory == null) {
  76. mCityDirectory = new CityDirectory(this);
  77. }
  78. }
  79. }
  80. return mCityDirectory;
  81. }
  82. public ImportTransportDirectory getImportTransportDirectory() {
  83. if (mImportTransportDirectory == null) {
  84. synchronized (ApplicationEx.class) {
  85. if (mImportTransportDirectory == null) {
  86. mImportTransportDirectory = new ImportTransportDirectory(this);
  87. }
  88. }
  89. }
  90. return mImportTransportDirectory;
  91. }
  92. public ImportMapDirectory getImportMapDirectory() {
  93. if (mImportMapDirectory == null) {
  94. synchronized (ApplicationEx.class) {
  95. if (mImportMapDirectory == null) {
  96. mImportMapDirectory = new ImportMapDirectory(this);
  97. }
  98. }
  99. }
  100. return mImportMapDirectory;
  101. }
  102. public ImportDirectory getImportDirectory() {
  103. if (mImportDirectory == null) {
  104. synchronized (ApplicationEx.class) {
  105. if (mImportDirectory == null) {
  106. mImportDirectory = new ImportDirectory(this);
  107. }
  108. }
  109. }
  110. return mImportDirectory;
  111. }
  112. public StationDirectory getStationDirectory() {
  113. if (mStationDirectory == null) {
  114. synchronized (ApplicationEx.class) {
  115. if (mStationDirectory == null) {
  116. mStationDirectory = new StationDirectory(
  117. getApplicationContext());
  118. }
  119. }
  120. }
  121. return mStationDirectory;
  122. }
  123. public CatalogStorage getCatalogStorage() {
  124. if (mStorage == null) {
  125. synchronized (ApplicationEx.class) {
  126. if (mStorage == null) {
  127. mStorage = new CatalogStorage(this);
  128. // mStorage.requestCatalog(CatalogStorage.LOCAL, false);
  129. // mStorage.requestCatalog(CatalogStorage.ONLINE, false);
  130. // mStorage.requestCatalog(CatalogStorage.IMPORT, false);
  131. }
  132. }
  133. }
  134. return mStorage;
  135. }
  136. public static void extractEULA(Context context) {
  137. if(!Constants.EULA_FILE.exists()){
  138. try {
  139. FileUtil.writeToStream( context.getAssets().open("gpl.html") , new FileOutputStream(Constants.EULA_FILE), true);
  140. } catch (Exception e) {
  141. // do nothing!
  142. }
  143. }
  144. }
  145. public void onCreate() {
  146. if (Log.isLoggable(Constants.LOG_TAG_MAIN, Log.INFO)) {
  147. Log.i(Constants.LOG_TAG_MAIN, "aMetro application started");
  148. }
  149. mInstance = this;
  150. mConnectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
  151. FileUtil.touchDirectory(Constants.ROOT_PATH);
  152. FileUtil.touchDirectory(Constants.LOCAL_CATALOG_PATH);
  153. FileUtil.touchDirectory(Constants.IMPORT_CATALOG_PATH);
  154. FileUtil.touchDirectory(Constants.TEMP_CATALOG_PATH);
  155. FileUtil.touchDirectory(Constants.ICONS_PATH);
  156. FileUtil.touchFile(Constants.NO_MEDIA_FILE);
  157. extractEULA(this);
  158. super.onCreate();
  159. }
  160. public void onTerminate() {
  161. stopService(new Intent(this, AutoUpdateService.class));
  162. shutdownHttpClient();
  163. super.onTerminate();
  164. }
  165. public static ApplicationEx getInstance() {
  166. return mInstance;
  167. }
  168. public HttpClient getHttpClient() {
  169. if(mHttpClient==null){
  170. synchronized (ApplicationEx.class) {
  171. if(mHttpClient==null){
  172. mHttpClient = createHttpClient();
  173. }
  174. }
  175. }
  176. return mHttpClient;
  177. }
  178. public boolean isNetworkAvailable(){
  179. NetworkInfo[] infs = mConnectionManager.getAllNetworkInfo();
  180. if(infs!=null && infs.length>0){
  181. for(NetworkInfo inf : infs){
  182. if(inf.isConnected()){
  183. return true;
  184. }
  185. }
  186. }
  187. return false;
  188. }
  189. public boolean isAutoUpdateNetworkAvailable(){
  190. boolean isWifiConnected = mConnectionManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected();
  191. boolean isMobileConnected = mConnectionManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected();
  192. boolean isConnected = false;
  193. if(GlobalSettings.isUpdateOnlyByWifi(this)){
  194. isConnected = isWifiConnected;
  195. }else if(!GlobalSettings.isUpdateByAnyNetwork(this)){
  196. isConnected = isWifiConnected || isMobileConnected;
  197. }else{
  198. isConnected = isNetworkAvailable();
  199. }
  200. return isConnected;
  201. }
  202. public void invalidateAutoUpdate(){
  203. if(GlobalSettings.isAutoUpdateIndexEnabled(this)){
  204. changeBootCompletedReceiverState(true);
  205. changeAlarmReceiverState(true);
  206. }else{
  207. changeBootCompletedReceiverState(false);
  208. changeAlarmReceiverState(false);
  209. changeNetworkStateReceiverState(false);
  210. }
  211. }
  212. public void changeAlarmReceiverState(boolean enabled) {
  213. AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
  214. Intent intent = new Intent(this, AlarmReceiver.class);
  215. PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
  216. alarmManager.cancel(pendingIntent);
  217. if(enabled){
  218. long interval = (GlobalSettings.getUpdatePeriod(this) == 900) ? AlarmManager.INTERVAL_FIFTEEN_MINUTES : AlarmManager.INTERVAL_DAY;
  219. alarmManager.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis() + 1000*60*2 , interval, pendingIntent);
  220. }
  221. }
  222. public void changeNetworkStateReceiverState(boolean enabled){
  223. PackageManager manager = getPackageManager();
  224. ComponentName name = new ComponentName(this, NetworkStateReceiver.class);
  225. int state = enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
  226. manager.setComponentEnabledSetting(name, state, PackageManager.DONT_KILL_APP);
  227. }
  228. public void changeBootCompletedReceiverState(boolean enabled){
  229. PackageManager manager = getPackageManager();
  230. ComponentName name = new ComponentName(this, BootCompletedReceiver.class);
  231. int state = enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
  232. manager.setComponentEnabledSetting(name, state, PackageManager.DONT_KILL_APP);
  233. }
  234. public boolean checkAutoUpdate() {
  235. if(GlobalSettings.isAutoUpdateIndexEnabled(this)){
  236. long lastModified = GlobalSettings.getUpdateDate(this);
  237. long currentDate = System.currentTimeMillis();
  238. long updateTimeout = GlobalSettings.getUpdatePeriod(this);
  239. long timeout = (currentDate - lastModified)/1000;
  240. if(timeout > updateTimeout){
  241. if(isAutoUpdateNetworkAvailable() && mConnectionManager.getBackgroundDataSetting()){
  242. changeNetworkStateReceiverState(false);
  243. startService(new Intent(this, AutoUpdateService.class));
  244. return true;
  245. }else{
  246. changeNetworkStateReceiverState(mConnectionManager.getBackgroundDataSetting());
  247. }
  248. }
  249. }else{
  250. changeBootCompletedReceiverState(false);
  251. changeNetworkStateReceiverState(false);
  252. changeAlarmReceiverState(false);
  253. }
  254. return false;
  255. }
  256. private HttpClient createHttpClient() {
  257. if(Log.isLoggable(Constants.LOG_TAG_MAIN, Log.DEBUG)){
  258. Log.d(Constants.LOG_TAG_MAIN, "Create HTTP client");
  259. }
  260. HttpParams params = new BasicHttpParams();
  261. HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
  262. HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
  263. HttpProtocolParams.setUseExpectContinue(params, true);
  264. HttpConnectionParams.setConnectionTimeout(params, HTTP_CONNECTION_TIMEOUT);
  265. HttpConnectionParams.setSoTimeout(params, HTTP_SOCKET_TIMEOUT);
  266. SchemeRegistry schReg = new SchemeRegistry();
  267. schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
  268. schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
  269. ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
  270. return new DefaultHttpClient(conMgr, params);
  271. }
  272. private void shutdownHttpClient() {
  273. if (mHttpClient != null && mHttpClient.getConnectionManager() != null) {
  274. mHttpClient.getConnectionManager().shutdown();
  275. }
  276. }
  277. private HttpClient mHttpClient;
  278. private static ApplicationEx mInstance;
  279. private ConnectivityManager mConnectionManager;
  280. private StationDirectory mStationDirectory;
  281. private CatalogStorage mStorage;
  282. private ImportDirectory mImportDirectory;
  283. private ImportMapDirectory mImportMapDirectory;
  284. private ImportTransportDirectory mImportTransportDirectory;
  285. private CityDirectory mCityDirectory;
  286. private CountryDirectory mCountryDirectory;
  287. }