use of com.newsrob.jobs.Job in project newsrob by marianokamp.
the class SyncChangedArticlesStatusJob method doSync.
protected void doSync(final boolean uploadOnly, final boolean manualSync) {
final EntryManager entryManager = getEntryManager();
final EntriesRetriever grf = entryManager.getEntriesRetriever();
final IStorageAdapter fileContextAdapter = entryManager.getStorageAdapter();
if (entryManager.isModelCurrentlyUpdated())
return;
entryManager.lockModel("SSer.doSync");
PL.log("SynchronizationService. Used settings: " + SettingsRenderer.renderSettings(entryManager, new StringBuilder("\n")), SynchronizationService.this);
// entryManager.runningThread = new Thread(new Runnable() {
Throwable caughtThrowable = null;
// public void run() {
final Context ctx = getApplicationContext();
PL.log("SynchronizationService - start", SynchronizationService.this);
PL.log("Last successful login: " + entryManager.getLastSuccessfulLogin(), SynchronizationService.this);
// Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);
Timing t = new Timing("Synchronization Runnable", this);
long started = System.currentTimeMillis();
Log.i(TAG, "Synchronization started at " + new Date().toString() + ". started=" + started);
final SyncJobStatus syncJobStatus = new SyncJobStatus();
// last used
long lastUsed = entryManager.getLastUsed();
ModelUpdateResult result = null;
try {
PL.log("Run Mark - in Try", SynchronizationService.this);
if (!uploadOnly) {
try {
if (!Feed.restoreFeedsIfNeccesary(this))
Feed.saveFeedSettings(this);
} catch (Exception e) {
e.printStackTrace();
}
}
entryManager.fireModelUpdateStarted("Synchronization", uploadOnly, manualSync);
List<Job> jobList = new LinkedList<Job>();
Job deleteReadArticlesJob = new DeleteArticlesJob(SynchronizationService.this, entryManager, syncJobStatus);
Job reduceToCapacityJob = new ReduceToCapacityJob(SynchronizationService.this, entryManager, syncJobStatus);
if (!uploadOnly) {
if (entryManager.shouldReadItemsBeDeleted())
jobList.add(deleteReadArticlesJob);
jobList.add(reduceToCapacityJob);
}
jobList.add(new Job("Submitting annotated articles", entryManager) {
@Override
public void run() throws Exception {
if (entryManager.syncCurrentlyEnabled(manualSync))
entryManager.getEntriesRetriever().submitNotes(this);
}
});
jobList.add(new SyncChangedArticlesStatusJob(SynchronizationService.this, entryManager, syncJobStatus, manualSync));
if (!uploadOnly && entryManager.shouldReadItemsBeDeleted())
jobList.add(deleteReadArticlesJob);
Job removeDeletedNotes = new Job("Removing submitted notes", entryManager) {
@Override
public void run() throws Exception {
if (entryManager.syncCurrentlyEnabled(manualSync))
entryManager.getEntriesRetriever().removeDeletedNotes();
}
};
if (!uploadOnly) {
jobList.add(new Job("Unsubscribing from feeds", entryManager) {
@Override
public void run() throws Exception {
if (!entryManager.syncCurrentlyEnabled(manualSync))
return;
Cursor c = entryManager.getFeeds2UnsubscribeCursor();
try {
while (c.moveToNext()) {
String feedAtomId = c.getString(1);
PL.log("Unsubscribing: " + feedAtomId, SynchronizationService.this);
entryManager.getEntriesRetriever().unsubscribeFeed(feedAtomId);
}
} finally {
c.close();
}
}
});
}
if (!uploadOnly)
jobList.add(removeDeletedNotes);
if (!uploadOnly)
jobList.add(new FetchUnreadArticlesJob(SynchronizationService.this, entryManager, syncJobStatus, manualSync));
if (!uploadOnly)
jobList.add(new Job("Daily update of subscriptions (feed titles)", entryManager) {
@Override
public void run() throws IOException, ParserConfigurationException, SAXException, GRTokenExpiredException {
if (entryManager.syncCurrentlyEnabled(manualSync)) {
grf.updateSubscriptionList(entryManager, this);
entryManager.fireModelUpdated();
}
}
});
if (!uploadOnly)
jobList.add(reduceToCapacityJob);
if (!uploadOnly && entryManager.shouldReadItemsBeDeleted())
jobList.add(deleteReadArticlesJob);
if (!uploadOnly) {
// make sure that a manual sync moves the automatic sync
// forward,
// i.e. when pushing "Refresh" in the middle of a 24h sync,
// reset timer to 0, so that it will be another 24h from this
// point on
entryManager.getScheduler().resetBackgroundSchedule();
final float screenSizeFactor = getScreenSizeFactor(ctx);
final float previewScaleFactor = ctx.getResources().getDisplayMetrics().density;
jobList.add(new Job("Downloading articles", entryManager) {
private int currentArticle = 0;
private Collection<Long> entries2Download;
@Override
public void run() {
if (entryManager.getSharedPreferences().getString(EntryManager.SETTINGS_STORAGE_ASSET_DOWNLOAD, EntryManager.DOWNLOAD_YES).equals(EntryManager.DOWNLOAD_NO)) {
Log.d(TAG, "Downloading of assets is disabled in the settings. Therefore skipping downloading webpages.");
return;
}
Timing tSql = new Timing("SQL Query findAllToDownload", SynchronizationService.this);
entries2Download = entryManager.findAllArticleIds2Download();
tSql.stop();
Timing tOutter = new Timing("Downloading all " + entries2Download.size() + " pages or well, the ones that were downloaded", SynchronizationService.this);
for (Long articleId : entries2Download) {
// get the current data
// LATER use a real cursor and somehow find out when
// data became stale
Entry entry = entryManager.findArticleById(articleId);
if (entry == null)
continue;
if (!entryManager.downloadContentCurrentlyEnabled(manualSync))
return;
if (!fileContextAdapter.canWrite()) {
Log.d(TAG, "File context adapter (" + fileContextAdapter.getClass().getName() + ") cannot be written to at the moment. Mounted? Read Only? Not downloading web pages.");
return;
}
if (isCancelled())
break;
// System.out.println("----------------- " +
// entry.getTitle());
currentArticle++;
entryManager.fireStatusUpdated();
// ones
if (entry.getReadState() == ReadState.READ && !entry.isStarred() && !entry.isNote())
continue;
int resolvedDownloadPref = entry.getResolvedDownloadPref(entryManager);
if (resolvedDownloadPref == Feed.DOWNLOAD_HEADERS_ONLY) {
continue;
}
// check against the db, because in the
// meantime
// the
// read status might have changed
Timing tInner = new Timing("Downloading page " + entry.getAlternateHRef(), SynchronizationService.this);
try {
// check free space
float freeSpaceLeft = fileContextAdapter.megaBytesFree();
Log.d(TAG, String.format("Free space remaining for downloads: %.2f MB.", freeSpaceLeft));
if (freeSpaceLeft < 0) {
PL.log(TAG + ": Oh no, free space left is a negative value ;-( Ignoring it.", ctx);
} else if (freeSpaceLeft < fileContextAdapter.megaBytesThreshold()) {
PL.log(TAG + ": Not enough space left to download page.", ctx);
entryManager.getNewsRobNotificationManager().createSyncSpaceExceededProblemNotification(fileContextAdapter.megaBytesThreshold());
break;
}
boolean downloadTheWholePage = (resolvedDownloadPref == Feed.DOWNLOAD_PREF_FEED_AND_MOBILE_WEBPAGE || resolvedDownloadPref == Feed.DOWNLOAD_PREF_FEED_AND_WEBPAGE);
String summary = entry.getContent() != null ? entry.getContent() : UIHelper.linkize(entry.getAlternateHRef(), entry.getTitle());
WebPageDownloadDirector.downloadWebPage(entry.getShortAtomId(), new URL(entry.getBaseUrl(entryManager)), fileContextAdapter, this, summary, downloadTheWholePage, entryManager, manualSync);
if (true) {
File assetsDir = entry.getAssetsDir(entryManager);
System.out.println("generatePreview=" + new PreviewGenerator(ctx, assetsDir, (int) (100 * previewScaleFactor * screenSizeFactor), (int) (100 * previewScaleFactor * screenSizeFactor), (int) (6 * previewScaleFactor)).generatePreview());
}
// TODO
// only
// one
// instance
// TODO use display metrics?
// TODO use orientation? Larger thumbs for
// larger screens?
entry.setDownloaded(downloadTheWholePage ? Entry.STATE_DOWNLOADED_FULL_PAGE : Entry.STATE_DOWNLOADED_FEED_CONTENT);
entry.setError(null);
entryManager.fireModelUpdated();
} catch (Exception e) {
Log.e(TAG, "Problem dowloading page " + entry.getAlternateHRef() + ".", e);
Throwable cause = null;
if (e instanceof DownloadException) {
cause = ((DownloadException) e).getCause();
Log.d(TAG, "DownloadException cause=" + cause);
} else
Log.d(TAG, "Exception=" + e);
boolean downloadError = false;
if (e instanceof DownloadCancelledException || cause != null && (cause instanceof FileNotFoundException || cause instanceof SocketTimeoutException || cause instanceof SocketException || cause instanceof NoHttpResponseException || cause instanceof UnknownHostException || cause instanceof DownloadCancelledException || cause instanceof DownloadTimedOutException)) {
Log.d(TAG, "Caught a FNFE");
} else {
Log.d(TAG, "Marked download as error.");
downloadError = true;
}
StringBuilder renderedStackTrace = new StringBuilder();
U.renderStackTrace(e, renderedStackTrace);
entry.setError(cause != null ? "Cause: " + cause.getClass().getSimpleName() + ": " + cause.getMessage() : e.getClass().getSimpleName() + ": " + e.getMessage() + "\nStacktrace: " + renderedStackTrace);
entry.setDownloaded(downloadError ? Entry.STATE_DOWNLOAD_ERROR : Entry.STATE_NOT_DOWNLOADED);
}
entryManager.updatedDownloaded(entry);
tInner.stop();
}
tOutter.stop();
}
@Override
public boolean isProgressMeassurable() {
return true;
}
@Override
public int[] getProgress() {
return new int[] { currentArticle, entries2Download != null ? entries2Download.size() : 0 };
}
});
}
PL.log("Run Mark - Jobs added", this);
entryManager.runJobs(jobList);
Log.d(TAG, "NoOfEntriesUpdated=" + syncJobStatus.noOfEntriesUpdated);
Log.d(TAG, "NoOfEntriesFetched=" + syncJobStatus.noOfEntriesFetched);
PL.log("Run Mark - Mission accomplished. -> complete ", this);
result = new SynchronizeModelSucceeded(syncJobStatus.noOfEntriesUpdated);
} catch (Throwable throwable) {
result = new SynchronizeModelFailed(throwable);
Log.d(TAG, "Problem during synchronization.", throwable);
} finally {
PL.log("Run Mark - In Finally", this);
entryManager.unlockModel("SSer.doSync");
entryManager.clearCancelState();
entryManager.fireModelUpdateFinished(result);
entryManager.fireStatusUpdated();
Log.i(TAG, "Synchronization finished at " + new Date().toString() + ". started=" + started);
t.stop();
if (!uploadOnly)
entryManager.setLastSync(caughtThrowable == null);
int noOfNewArticles = entryManager.getNoOfNewArticlesSinceLastUsed(lastUsed);
entryManager.getNewsRobNotificationManager().notifyNewArticles(entryManager, lastUsed, noOfNewArticles);
PL.log("Run Mark - End of Finally", this);
resetLastStarted();
releaseWakeLock();
}
}
use of com.newsrob.jobs.Job in project newsrob by marianokamp.
the class WebPageDownloadTask method doSync.
protected synchronized void doSync(final boolean uploadOnly, final boolean manualSync) {
PL.log(this, "doSync invoked. (-1) wl=" + wl, null, getApplicationContext());
final Context ctx = getApplicationContext();
try {
PL.log(this, "doSync invoked. (0)", null, getApplicationContext());
// (WifiManager)
WifiManager wifiManager = null;
if (false) {
WifiLock wiFiLock = wifiManager.createWifiLock("NewsRobSync");
wiFiLock.acquire();
}
PL.log(this, "doSync invoked. (1)", null, getApplicationContext());
U.setLowPrio();
PL.log(this, "doSync invoked. (2)", null, getApplicationContext());
final EntryManager entryManager = getEntryManager();
final EntriesRetriever grf = entryManager.getEntriesRetriever();
final IStorageAdapter fileContextAdapter = entryManager.getStorageAdapter();
PL.log(this, "doSync invoked. (3)", null, getApplicationContext());
if (entryManager.isModelCurrentlyUpdated()) {
PL.log(this, "doSync invoked. (3.4)", null, getApplicationContext());
return;
}
PL.log(this, "doSync invoked. (3.5)", null, getApplicationContext());
entryManager.lockModel("SSer.doSync");
PL.log(this, "doSync invoked. (4)", null, getApplicationContext());
PL.log("SynchronizationService. Used settings: " + SettingsRenderer.renderSettings(entryManager, new StringBuilder("\n")), SynchronizationService.this);
Throwable caughtThrowable = null;
PL.log("SynchronizationService - start", SynchronizationService.this);
PL.log("Battery level=" + U.getBatteryChargedPercent(ctx) + "%.", ctx);
PL.log("Last successful login: " + entryManager.getLastSuccessfulLogin(), SynchronizationService.this);
Timing t = new Timing("Synchronization Runnable", this);
long started = System.currentTimeMillis();
Log.i(TAG, "Synchronization started at " + new Date().toString() + ". started=" + started);
final SyncJobStatus syncJobStatus = new SyncJobStatus();
// last used
long lastUsed = entryManager.getLastUsed();
final DownloadContext downloadContext = new DownloadContext();
PL.log(this, "doSync invoked. (5)", null, getApplicationContext());
ModelUpdateResult result = null;
try {
PL.log("Run Mark - in Try", SynchronizationService.this);
if (!uploadOnly) {
try {
if (!Feed.restoreFeedsIfNeccesary(this))
Feed.saveFeedSettings(this);
} catch (Exception e) {
e.printStackTrace();
}
}
entryManager.fireModelUpdateStarted("Synchronization", uploadOnly, manualSync);
List<Job> jobList = new LinkedList<Job>();
Job deleteReadArticlesJob = new DeleteArticlesJob(SynchronizationService.this, entryManager, syncJobStatus);
Job reduceToCapacityJob = new ReduceToCapacityJob(SynchronizationService.this, entryManager, syncJobStatus);
if (!uploadOnly) {
if (entryManager.shouldReadItemsBeDeleted())
jobList.add(deleteReadArticlesJob);
jobList.add(reduceToCapacityJob);
}
if (false)
jobList.add(new Job("Submitting annotated articles", entryManager) {
@Override
public void run() throws Exception {
if (entryManager.syncCurrentlyEnabled(manualSync))
entryManager.getEntriesRetriever().submitNotes(this);
}
});
jobList.add(new SyncChangedArticlesStatusJob(SynchronizationService.this, entryManager, syncJobStatus, manualSync));
if (!uploadOnly && entryManager.shouldReadItemsBeDeleted())
jobList.add(deleteReadArticlesJob);
if (!uploadOnly) {
jobList.add(new Job("Unsubscribing from feeds", entryManager) {
@Override
public void run() throws Exception {
if (!entryManager.syncCurrentlyEnabled(manualSync))
return;
Cursor c = entryManager.getFeeds2UnsubscribeCursor();
try {
while (c.moveToNext()) {
String feedAtomId = c.getString(1);
PL.log("Unsubscribing: " + feedAtomId, SynchronizationService.this);
entryManager.getEntriesRetriever().unsubscribeFeed(feedAtomId);
}
} finally {
c.close();
}
}
});
}
if (!uploadOnly)
jobList.add(new FetchUnreadArticlesJob(SynchronizationService.this, entryManager, syncJobStatus, manualSync));
if (!uploadOnly)
jobList.add(new Job("Daily update of subscriptions (feed titles)", entryManager) {
@Override
public void run() throws IOException, ParserConfigurationException, SAXException, GRTokenExpiredException {
if (entryManager.syncCurrentlyEnabled(manualSync)) {
grf.updateSubscriptionList(entryManager, this);
entryManager.fireModelUpdated();
}
}
});
if (!uploadOnly)
jobList.add(reduceToCapacityJob);
if (!uploadOnly && entryManager.shouldReadItemsBeDeleted())
jobList.add(deleteReadArticlesJob);
PL.log(this, "doSync invoked. (6)", null, getApplicationContext());
if (!uploadOnly) {
// make sure that a manual sync moves the automatic sync
// forward,
// i.e. when pushing "Refresh" in the middle of a 24h sync,
// reset timer to 0, so that it will be another 24h from
// this
// point on
entryManager.getScheduler().resetBackgroundSchedule();
final SyncJobStatus sjStatus = new SyncJobStatus();
jobList.add(new SyncJob(ctx, entryManager, sjStatus, "Downloading articles") {
private Collection<Long> entries2Download;
@Override
public int doRun() {
if (entryManager.getSharedPreferences().getString(EntryManager.SETTINGS_STORAGE_ASSET_DOWNLOAD, EntryManager.DOWNLOAD_YES).equals(EntryManager.DOWNLOAD_NO)) {
Log.d(TAG, "Downloading of assets is disabled in the settings. Therefore skipping downloading webpages.");
return actual;
}
Timing tSql = new Timing("SQL Query findAllToDownload", SynchronizationService.this);
entries2Download = entryManager.findAllArticleIds2Download();
target = entries2Download.size();
tSql.stop();
Timing tOutter = new Timing("Downloading all " + entries2Download.size() + " pages or well, the ones that were downloaded", SynchronizationService.this);
// shouldDownloadArticlesInParallel = true;
final int numberOfThreads = shouldDownloadArticlesInParallel && !U.isScreenOn(ctx) ? 3 : 1;
PL.log("Instantiating Download Articles ScheduledExecutorService for " + numberOfThreads + " threads.", ctx);
final ScheduledExecutorService pool = Executors.newScheduledThreadPool(numberOfThreads);
int count = 0;
try {
actual = 1;
entryManager.fireStatusUpdated();
for (Long articleId : entries2Download) {
// get the current data
// LATER use a real cursor and somehow find
// out
// when
// data became stale
Entry entry = entryManager.findArticleById(articleId);
if (entry == null)
continue;
if (!entryManager.downloadContentCurrentlyEnabled(manualSync))
return actual;
if (!fileContextAdapter.canWrite()) {
Log.d(TAG, "File context adapter (" + fileContextAdapter.getClass().getName() + ") cannot be written to at the moment. Mounted? Read Only? Not downloading web pages.");
return actual;
}
if (isCancelled())
break;
if (entry.getReadState() == ReadState.READ && !entry.isStarred())
continue;
int resolvedDownloadPref = entry.getResolvedDownloadPref(entryManager);
if (resolvedDownloadPref == Feed.DOWNLOAD_HEADERS_ONLY) {
continue;
}
// check against the db, because in the
// meantime
// the
// read status might have changed
boolean downloadTheWholePage = (resolvedDownloadPref == Feed.DOWNLOAD_PREF_FEED_AND_MOBILE_WEBPAGE || resolvedDownloadPref == Feed.DOWNLOAD_PREF_FEED_AND_WEBPAGE);
String summary = entry.getContent() != null ? entry.getContent() : UIHelper.linkize(entry.getAlternateHRef(), entry.getTitle());
WebPageDownloadTask task = new WebPageDownloadTask(entryManager, fileContextAdapter, this, entry, summary, downloadTheWholePage, manualSync, downloadContext);
if (true)
// pool.submit(task);
pool.schedule(task, count++ * 500, TimeUnit.MILLISECONDS);
else
try {
task.call();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} finally {
PL.log(this, "doSync invoked. (6.1 Pool Shutdown 1)", null, getApplicationContext());
pool.shutdown();
PL.log(this, "doSync invoked. (6.2 Pool Shutdown 2)", null, getApplicationContext());
try {
while (true) {
// wait and check if the pool is done.
boolean terminated = pool.awaitTermination(2, TimeUnit.SECONDS);
// done?
if (terminated)
break;
boolean terminate = false;
if (!entryManager.downloadContentCurrentlyEnabled(manualSync))
terminate = true;
if (!terminate && !fileContextAdapter.canWrite()) {
Log.d(TAG, "File context adapter (" + fileContextAdapter.getClass().getName() + ") cannot be written to at the moment. Mounted? Read Only? Not downloading web pages.");
terminate = true;
}
if (!terminate && isCancelled())
terminate = true;
if (terminate) {
PL.log("Terminating downloadpagetask pool", ctx);
pool.shutdownNow();
break;
}
// all good so far go back to the
// beginning
// and check those
}
} catch (InterruptedException e) {
// Ignore
e.printStackTrace();
PL.log(this, "Interrupted Exception", e, ctx);
} finally {
PL.log(this, "doSync invoked. (6.3 Pool ShutdownNow 1)", null, getApplicationContext());
pool.shutdownNow();
PL.log(this, "doSync invoked. (6.4 Pool ShutdownNow 2)", null, getApplicationContext());
}
}
tOutter.stop();
return actual;
}
});
jobList.add(new Job("Vacuuming database ... ", entryManager) {
@Override
public void run() throws Throwable {
entryManager.vacuumDb();
}
});
}
PL.log("Run Mark - Jobs added", this);
PL.log(this, "doSync invoked. (7)", null, getApplicationContext());
entryManager.runJobs(jobList);
PL.log(this, "doSync invoked. (7.1 After Run Jobs)", null, getApplicationContext());
Log.d(TAG, "NoOfEntriesUpdated=" + syncJobStatus.noOfEntriesUpdated);
Log.d(TAG, "NoOfEntriesFetched=" + syncJobStatus.noOfEntriesFetched);
PL.log("Run Mark - Mission accomplished. -> complete ", this);
result = new SynchronizeModelSucceeded(syncJobStatus.noOfEntriesUpdated);
} catch (Throwable throwable) {
result = new SynchronizeModelFailed(throwable);
Log.d(TAG, "Problem during synchronization.", throwable);
PL.log(this, "Problem during synchronization", throwable, ctx);
} finally {
PL.log("Run Mark - In Finally", this);
entryManager.unlockModel("SSer.doSync");
entryManager.clearCancelState();
entryManager.fireModelUpdateFinished(result);
entryManager.fireStatusUpdated();
Log.i(TAG, "Synchronization finished at " + new Date().toString() + ". started=" + started);
t.stop();
PL.log(this, "doSync invoked. (7.2)", null, getApplicationContext());
if (!uploadOnly)
entryManager.setLastSync(caughtThrowable == null);
int noOfNewArticles = entryManager.getNoOfNewArticlesSinceLastUsed(lastUsed);
entryManager.getNewsRobNotificationManager().notifyNewArticles(entryManager, lastUsed, noOfNewArticles);
PL.log("Run Mark - End of Finally", this);
PL.log("Battery level=" + U.getBatteryChargedPercent(ctx) + "%.", ctx);
resetLastStarted();
PL.log(this, "doSync invoked. (8)", null, getApplicationContext());
}
} finally {
PL.log(this, "doSync invoked. (9)", null, getApplicationContext());
releaseWakeLock(ctx);
PL.log(this, "doSync invoked. (9.1)", null, getApplicationContext());
// wiFiLock.release(); // TODO
}
PL.log(this, "doSync invoked. (10)", null, getApplicationContext());
PL.log("SynchronizationService. Used settings: " + SettingsRenderer.renderSettings(entryManager, new StringBuilder("\n")), SynchronizationService.this);
}
use of com.newsrob.jobs.Job in project newsrob by marianokamp.
the class EntriesRetrieverStub method testImport.
public void testImport() throws IOException, ParserConfigurationException, SAXException {
assertEquals(0, entryManager.getArticleCount());
Job job = new Job("SomeDescription", entryManager) {
@Override
public void run() throws Exception {
fail("Should not be called.");
}
};
InputStream is = getInstrumentation().getContext().getAssets().open("simple.xml");
EntriesRetriever.FetchContext fetchContext = new EntriesRetriever.FetchContext();
entriesRetriever.processInputStream(job, fetchContext, is);
is.close();
assertEquals(20, entryManager.getArticleCount());
}
use of com.newsrob.jobs.Job in project newsrob by marianokamp.
the class EntryManager method switchStorageProvider.
private void switchStorageProvider() {
Log.d(TAG, "Switch Storage Provider");
if (isModelCurrentlyUpdated())
return;
final String newPrefValue = getSharedPreferences().getString(SETTINGS_STORAGE_PROVIDER_KEY, null);
final String oldStorageProviderClass = fileContextAdapter.getClass().getName();
final String newStorageProviderClass = STORAGE_PROVIDER_SD_CARD.equals(newPrefValue) ? SdCardStorageAdapter.class.getName() : PhoneMemoryStorageAdapter.class.getName();
if (!oldStorageProviderClass.equals(newStorageProviderClass)) {
runningThread = new Thread(new Runnable() {
public void run() {
final PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
final PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
Log.i(TAG, "Wake lock acquired at " + new Date().toString() + ".");
wl.acquire();
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
final Timing t = new Timing("Storage Provider Switch", ctx);
ModelUpdateResult result = null;
if (isModelCurrentlyUpdated())
return;
try {
lockModel("EM.switchStorageProvider.run");
} catch (final IllegalStateException ise) {
return;
}
try {
Log.i(TAG, "Switching storage providers started at " + new Date().toString() + ".");
fireModelUpdateStarted("Switching storage providers", false, true);
Log.d(TAG, "Change of storage provider detected.");
final List<Job> jobList = new LinkedList<Job>();
final Job clearOldStorageProvider = new Job("Clearing Old Storage Provider", EntryManager.this) {
@Override
public void run() {
Log.d(TAG, "Clearing the old storage provider.");
doClearCache();
if (fileContextAdapter.canWrite())
WebPageDownloadDirector.removeAllAssets(fileContextAdapter, ctx);
}
};
jobList.add(clearOldStorageProvider);
final Job switchStorageProviders = new Job("Switching Storage Providers", EntryManager.this) {
@Override
public void run() throws Exception {
Log.d(TAG, "Establishing new storage provider: " + newStorageProviderClass);
fileContextAdapter = newStorageProviderClass.equals(SdCardStorageAdapter.class.getName()) ? new SdCardStorageAdapter(ctx) : new PhoneMemoryStorageAdapter(ctx);
Log.d(TAG, "New storage provider established.");
}
};
jobList.add(switchStorageProviders);
final Job clearNewStorageProvider = new Job("Clearing New Storage Provider", EntryManager.this) {
@Override
public void run() {
Log.d(TAG, "Clearing the new storage provider.");
doClearCache();
if (fileContextAdapter.canWrite())
WebPageDownloadDirector.removeAllAssets(fileContextAdapter, ctx);
}
};
jobList.add(clearNewStorageProvider);
runJobs(jobList);
result = new SwitchStorageProviderResult();
} catch (final Throwable throwable) {
result = new SwitchStorageProviderFailed(throwable);
Log.d(TAG, "Problem during switching storage providers.", throwable);
t.stop();
} finally {
unlockModel("EM.switchStorageProvider.run");
clearCancelState();
fireModelUpdateFinished(result);
fireStatusUpdated();
Log.i(TAG, "Switching storage providers finished at " + new Date().toString() + ".");
wl.release();
t.stop();
}
}
}, "Storage Provider Switch Worker");
runningThread.start();
}
}
use of com.newsrob.jobs.Job in project newsrob by marianokamp.
the class EntryManager method runJobs.
void runJobs(final List<Job> jobList) throws Throwable {
Throwable caughtThrowable = null;
for (final Job job : jobList) {
try {
if (isCancelRequested())
break;
Log.d(TAG, "Started job: " + job.getJobDescription());
EntryManager.this.currentRunningJob = job;
fireStatusUpdated();
if (NewsRob.isDebuggingEnabled(ctx))
PL.log("Existing Articles (before " + job.getJobDescription() + ")=" + EntryManager.this.getArticleCount(), ctx);
job.run();
if (NewsRob.isDebuggingEnabled(ctx))
PL.log("Existing Articles (after " + job.getJobDescription() + ")=" + EntryManager.this.getArticleCount(), ctx);
} catch (final Throwable throwable) {
Log.d(TAG, "Caught throwable.", throwable);
if (caughtThrowable != null) {
Log.d(TAG, "Rethrowing it!");
throw throwable;
} else {
caughtThrowable = throwable;
Log.d(TAG, "Stashing it.");
}
} finally {
Log.d(TAG, "Finished job: " + job.getJobDescription());
EntryManager.this.currentRunningJob = null;
fireStatusUpdated();
}
}
if (caughtThrowable != null)
throw caughtThrowable;
}
Aggregations