package de.danoeh.antennapodsp; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import de.danoeh.antennapodsp.feed.Feed; import de.danoeh.antennapodsp.service.download.DownloadRequest; import de.danoeh.antennapodsp.service.download.DownloadStatus; import de.danoeh.antennapodsp.service.download.HttpDownloader; import de.danoeh.antennapodsp.storage.*; import de.danoeh.antennapodsp.syndication.handler.FeedHandler; import de.danoeh.antennapodsp.syndication.handler.UnsupportedFeedtypeException; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.concurrent.ExecutionException; import static de.danoeh.antennapodsp.preferences.UserPreferences.*; /** * The AppInitializer processes the preferences that were specified in AppPreferences. */ public class AppInitializer { private static final String TAG = "AppInitializer"; private static final String PREFS_APP_INITIALIZER = "PrefAppInit"; private static final String PREF_IS_FIRST_LAUNCH = "prefIsFirstLaunch"; private static final String PREF_PREF_VERSION_NUMBER = "prefPrefVersionNumber"; public static void initializeApp(Context context) throws ExecutionException, InterruptedException, InitializerException { if (context == null) throw new IllegalArgumentException("context = null"); context = context.getApplicationContext(); if (context == null) throw new IllegalStateException("Could not get application context"); writeUserPreferences(context); final AppPreferences appPreferences = new AppPreferences(); // check if this is the first launch of the app SharedPreferences initPrefs = context.getSharedPreferences(PREFS_APP_INITIALIZER, Context.MODE_PRIVATE); final boolean isFirstLaunch = initPrefs.getBoolean(PREF_IS_FIRST_LAUNCH, true); final int currentVersionNumber = initPrefs.getInt(PREF_PREF_VERSION_NUMBER, 0); if (AppConfig.DEBUG) Log.d(TAG, String.format("First start: %s, Version number: %d", String.valueOf(isFirstLaunch), currentVersionNumber)); if (!isFirstLaunch && currentVersionNumber >= appPreferences.feedUrlsVersionNumber) { if (AppConfig.DEBUG) Log.d(TAG, "AppPreferences are up-to-date"); return; } if (!isFirstLaunch) Log.i(TAG, String.format("Upgrading from version %d to version %d", currentVersionNumber, appPreferences.feedUrlsVersionNumber)); // refresh feeds List<Feed> savedFeeds = DBReader.getFeedList(context); for (Feed f : savedFeeds) { DBWriter.deleteFeed(context, f.getId()).get(); } File destDir = context.getExternalFilesDir(DownloadRequester.FEED_DOWNLOADPATH); if (destDir == null) throw new InitializerException(context.getString(R.string.storage_access_failed)); for (int i = 0; i < appPreferences.feedUrls.length; i++) { String url = appPreferences.feedUrls[i]; if (AppConfig.DEBUG) Log.d(TAG, "Downloading feed: " + url); File destFile = new File(destDir, "feed " + i); destFile.delete(); downloadFeed(context, url, destFile.toString()); } if (isFirstLaunch) { appPreferences.setUpdateAlarm(); } // update init preferences SharedPreferences.Editor initPrefsEditor = initPrefs.edit(); initPrefsEditor.putBoolean(PREF_IS_FIRST_LAUNCH, false); initPrefsEditor.putInt(PREF_PREF_VERSION_NUMBER, appPreferences.feedUrlsVersionNumber); initPrefsEditor.commit(); } private static void downloadFeed(Context context, String downloadUrl, String fileUrl) throws InitializerException { Feed feed = new Feed(downloadUrl, new Date()); feed.setFile_url(fileUrl); HttpDownloader downloader = new HttpDownloader(new DownloadRequest(fileUrl, downloadUrl, "feed", 0, Feed.FEEDFILETYPE_FEED)); downloader.call(); DownloadStatus status = downloader.getResult(); if (!status.isSuccessful()) { throw new InitializerException(status.getReason().getErrorString(context)); } else { FeedHandler handler = new FeedHandler(); try { handler.parseFeed(feed); } catch (SAXException e) { e.printStackTrace(); throw new InitializerException(e); } catch (IOException e) { e.printStackTrace(); throw new InitializerException(e); } catch (ParserConfigurationException e) { e.printStackTrace(); throw new InitializerException(e); } catch (UnsupportedFeedtypeException e) { e.printStackTrace(); throw new InitializerException(e); } DBTasks.updateFeed(context, feed); if (feed.getImage() != null && feed.getImage().getDownload_url() != null) { try { DownloadRequester.getInstance().downloadImage(context, feed.getImage()); } catch (DownloadRequestException e) { e.printStackTrace(); } } } } /** Read preference values from AppPreferences and write them into the UserPreferences file. */ private static void writeUserPreferences(Context context) { if (AppConfig.DEBUG) Log.d(TAG, "Writing user preferences"); AppPreferences appPreferences = new AppPreferences(); SharedPreferences userPrefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor upe = userPrefs.edit(); upe.putBoolean(PREF_PAUSE_ON_HEADSET_DISCONNECT, appPreferences.pauseOnHeadsetDisconnect); upe.putBoolean(PREF_DOWNLOAD_MEDIA_ON_WIFI_ONLY, appPreferences.downloadMediaOnWifiOnly); upe.putBoolean(PREF_MOBILE_UPDATE, appPreferences.allowMobileUpdates); upe.putBoolean(PREF_ENABLE_AUTODL, appPreferences.enableAutodownload); upe.putString(PREF_EPISODE_CACHE_SIZE, String.valueOf(appPreferences.episodeCacheSize)); upe.putBoolean(PREF_PAUSE_PLAYBACK_FOR_FOCUS_LOSS, appPreferences.pauseForFocusLoss); upe.commit(); } public static class InitializerException extends Exception { public InitializerException(String detailMessage) { super(detailMessage); } public InitializerException(String detailMessage, Throwable throwable) { super(detailMessage, throwable); } public InitializerException(Throwable throwable) { super(throwable); } } }