/** * Android ownCloud News * * @author David Luhmer * @copyright 2013 David Luhmer david-dev@live.de * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ package de.luhmer.owncloudnewsreader.reader.owncloud; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; import android.widget.Toast; import de.luhmer.owncloudnewsreader.Constants; import de.luhmer.owncloudnewsreader.DownloadImagesActivity; import de.luhmer.owncloudnewsreader.R; import de.luhmer.owncloudnewsreader.SettingsActivity; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.helper.NetworkConnection; import de.luhmer.owncloudnewsreader.reader.AsyncTask_Reader; import de.luhmer.owncloudnewsreader.reader.FeedItemTags; import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener; import de.luhmer.owncloudnewsreader.services.DownloadImagesService; public class AsyncTask_GetItems extends AsyncTask_Reader { @SuppressWarnings("unused") private static final String TAG = "AsyncTask_GetItems"; private long highestItemIdBeforeSync; int totalCount; public AsyncTask_GetItems(final Context context, final OnAsyncTaskCompletedListener... listener) { super(context, listener); totalCount = 0; } @Override protected void onProgressUpdate(Void... values) { Toast.makeText(context, context.getResources().getQuantityString(R.plurals.fetched_items_so_far,totalCount,totalCount), Toast.LENGTH_SHORT).show(); super.onProgressUpdate(values); } @Override protected Exception doInBackground(Object... params) { DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(context); try { dbConn.clearDatabaseOverSize(); //String authKey = AuthenticationManager.getGoogleAuthKey(username, password); //SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context); //int maxItemsInDatabase = Integer.parseInt(mPrefs.getString(SettingsActivity.SP_MAX_ITEMS_SYNC, "200")); long lastModified = dbConn.getLastModified(); //dbConn.clearDatabaseOverSize(); //List<RssFile> files; long offset = dbConn.getLowestItemId(false); int requestCount; int maxSyncSize = Integer.parseInt(OwnCloudReaderMethods.maxSizePerSync); highestItemIdBeforeSync = dbConn.getHighestItemId(); SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context); if(lastModified == 0)//Only on first sync { int maxItemsInDatabase = Constants.maxItemsCount; do { requestCount = apiFuture.get().GetItems(FeedItemTags.ALL, context, String.valueOf(offset), false, 0, "3"); if(requestCount > 0) offset = dbConn.getLowestItemId(false); totalCount += requestCount; publishProgress((Void) null); } while(requestCount == maxSyncSize); mPrefs.edit().putInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, totalCount).commit(); do { offset = dbConn.getLowestItemId(true); requestCount = apiFuture.get().GetItems(FeedItemTags.ALL_STARRED, context, String.valueOf(offset), true, 0, "2"); //if(requestCount > 0) // offset = dbConn.getLowestItemId(true); totalCount += requestCount; } while(requestCount == maxSyncSize && totalCount < maxItemsInDatabase); } else { //First reset the count of last updated items mPrefs.edit().putInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, 0).commit(); //Get all updated items int[] result = apiFuture.get().GetUpdatedItems(FeedItemTags.ALL, context, lastModified + 1); //If no exception occurs, set the number of updated items mPrefs.edit().putInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, result[1]).commit(); } } catch (Exception ex) { ex.printStackTrace(); return ex; } return null; } @Override protected void onPostExecute(Exception ex) { for (OnAsyncTaskCompletedListener listenerInstance : listener) { if(listenerInstance != null) listenerInstance.onAsyncTaskCompleted(ex); } if(ex == null && NetworkConnection.isNetworkAvailable(context)) { SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context); int syncStrategy = Integer.parseInt(mPrefs.getString(SettingsActivity.LV_CACHE_IMAGES_OFFLINE_STRING, "0")); boolean downloadImages = false; switch(syncStrategy) { case 0: break; case 1://Download via WiFi only if (NetworkConnection.isWLANConnected(context)) downloadImages = true; break; case 2: //Download via WiFi and Mobile downloadImages = true; break; case 3://Download via WiFi and ask for mobile if (!NetworkConnection.isWLANConnected(context)) ShowDownloadImageWithoutWifiQuestion(); else downloadImages = true; break; } if(downloadImages) { //If images should be cached Intent service = new Intent(context, DownloadImagesService.class); service.putExtra(DownloadImagesService.LAST_ITEM_ID, highestItemIdBeforeSync); service.putExtra(DownloadImagesService.DOWNLOAD_MODE_STRING, DownloadImagesService.DownloadMode.PICTURES_ONLY); //Pictures only, Favions are getting cached by the @AsyncTask_GetFeeds class context.startService(service); } } detach(); } private void ShowDownloadImageWithoutWifiQuestion() { Bitmap bm = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher); Intent intent = new Intent(context, DownloadImagesActivity.class); intent.putExtra("highestItemIdBeforeSync", highestItemIdBeforeSync); PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0); Notification notification = new NotificationCompat.Builder(context) .setContentTitle(context.getString(R.string.no_wifi_available)) .setContentText(context.getString(R.string.do_you_want_to_download_without_wifi)) .setSmallIcon(R.drawable.ic_notification) .setLargeIcon(bm) .setContentIntent(pIntent) .setAutoCancel(true) .build(); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // hide the notification after its selected notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(0, notification); } }