/**
* 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 .
*
*/
package de.luhmer.owncloudnewsreader.services;
import android.app.ActivityManager;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
import de.luhmer.owncloudnewsreader.Constants;
import de.luhmer.owncloudnewsreader.Constants.SYNC_TYPES;
import de.luhmer.owncloudnewsreader.R;
import de.luhmer.owncloudnewsreader.SettingsActivity;
import de.luhmer.owncloudnewsreader.helper.AidlException;
import de.luhmer.owncloudnewsreader.helper.NotificationManagerNewsReader;
import de.luhmer.owncloudnewsreader.reader.FeedItemTags.TAGS;
import de.luhmer.owncloudnewsreader.reader.IReader;
import de.luhmer.owncloudnewsreader.reader.OnAsyncTaskCompletedListener;
import de.luhmer.owncloudnewsreader.reader.owncloud.API;
import de.luhmer.owncloudnewsreader.reader.owncloud.OwnCloud_Reader;
import de.luhmer.owncloudnewsreader.reader.owncloud.apiv2.APIv2;
import de.luhmer.owncloudnewsreader.reader.owncloud.apiv2.AsyncTask_TriggerOcUpdate;
import de.luhmer.owncloudnewsreader.services.IOwnCloudSyncService.Stub;
import de.luhmer.owncloudnewsreader.widget.WidgetProvider;
public class OwnCloudSyncService extends Service {
protected static final String TAG = "OwnCloudSyncService";
private RemoteCallbackList callbacks = new RemoteCallbackList();
private Stub mBinder = new IOwnCloudSyncService.Stub() {
public void registerCallback(IOwnCloudSyncServiceCallback callback) {
callbacks.register(callback);
}
public void unregisterCallback(IOwnCloudSyncServiceCallback callback) {
callbacks.unregister(callback);
}
@Override
public void startSync() throws RemoteException {
if(!isSyncRunning()) {
startedSync(SYNC_TYPES.SYNC_TYPE__GET_API);
OwnCloud_Reader ocReader = (OwnCloud_Reader) _Reader;
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(OwnCloudSyncService.this);
String username = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, "");
String password = mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, "");
ocReader.Start_AsyncTask_GetVersion(Constants.TaskID_GetVersion, OwnCloudSyncService.this, onAsyncTask_GetVersionFinished, username, password);
}
}
@Override
public boolean isSyncRunning() throws RemoteException {
return _Reader.isSyncRunning();
}
};
static IReader _Reader;
@Override
public void onCreate() {
super.onCreate();
if(_Reader == null)
_Reader = new OwnCloud_Reader();
Log.d(TAG, "onCreate() called");
}
OnAsyncTaskCompletedListener onAsyncTask_GetVersionFinished = new OnAsyncTaskCompletedListener() {
@Override
public void onAsyncTaskCompleted(int task_id, Object task_result) {
finishedSync(SYNC_TYPES.SYNC_TYPE__GET_API);
if(!(task_result instanceof Exception))
{
String appVersion = task_result.toString();
API api = API.GetRightApiForVersion(appVersion, OwnCloudSyncService.this);
((OwnCloud_Reader) _Reader).setApi(api);
_Reader.Start_AsyncTask_PerformItemStateChange(Constants.TaskID_PerformStateChange, OwnCloudSyncService.this, onAsyncTask_PerformTagExecute);
startedSync(SYNC_TYPES.SYNC_TYPE__ITEM_STATES);
}
else
ThrowException((Exception) task_result);
}
};
//Sync state of items e.g. read/unread/starred/unstarred
OnAsyncTaskCompletedListener onAsyncTask_PerformTagExecute = new OnAsyncTaskCompletedListener() {
@Override
public void onAsyncTaskCompleted(int task_id, Object task_result) {
finishedSync(SYNC_TYPES.SYNC_TYPE__ITEM_STATES);
if(task_result != null)//task result is null if there was an error
{
if((Boolean) task_result)
{
if(task_id == Constants.TaskID_PerformStateChange) {
_Reader.Start_AsyncTask_GetFolder(Constants.TaskID_GetFolder, OwnCloudSyncService.this, onAsyncTask_GetFolder);
startedSync(SYNC_TYPES.SYNC_TYPE__FOLDER);
}
else
_Reader.setSyncRunning(true);
}
}
}
};
OnAsyncTaskCompletedListener onAsyncTask_GetFolder = new OnAsyncTaskCompletedListener() {
@Override
public void onAsyncTaskCompleted(int task_id, Object task_result) {
finishedSync(SYNC_TYPES.SYNC_TYPE__FOLDER);
if(task_result != null)
ThrowException((Exception) task_result);
else {
_Reader.Start_AsyncTask_GetFeeds(Constants.TaskID_GetFeeds, OwnCloudSyncService.this, onAsyncTask_GetFeed);
startedSync(SYNC_TYPES.SYNC_TYPE__FEEDS);
}
Log.d(TAG, "onAsyncTask_GetFolder Finished");
}
};
OnAsyncTaskCompletedListener onAsyncTask_GetFeed = new OnAsyncTaskCompletedListener() {
@Override
public void onAsyncTaskCompleted(int task_id, Object task_result) {
finishedSync(SYNC_TYPES.SYNC_TYPE__FEEDS);
if(task_result != null)
ThrowException((Exception) task_result);
else {
_Reader.Start_AsyncTask_GetItems(Constants.TaskID_GetItems, OwnCloudSyncService.this, onAsyncTask_GetItems, TAGS.ALL);//Recieve all unread Items
startedSync(SYNC_TYPES.SYNC_TYPE__ITEMS);
}
Log.d(TAG, "onAsyncTask_GetFeed Finished");
}
};
OnAsyncTaskCompletedListener onAsyncTask_GetItems = new OnAsyncTaskCompletedListener() {
@Override
public void onAsyncTaskCompleted(int task_id, Object task_result) {
finishedSync(SYNC_TYPES.SYNC_TYPE__ITEMS);
if(task_result != null)
ThrowException((Exception) task_result);
else
{
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(OwnCloudSyncService.this);
int newItemsCount = mPrefs.getInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, 0);
if(newItemsCount > 0) {
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List runningTaskInfo = am.getRunningTasks(1);
ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
if(!componentInfo.getPackageName().equals("de.luhmer.owncloudnewsreader")) {
String tickerText = getString(R.string.notification_new_items_ticker).replace("X", String.valueOf(newItemsCount));
String contentText = getString(R.string.notification_new_items_text).replace("X", String.valueOf(newItemsCount));
String title = getString(R.string.app_name);
if(mPrefs.getBoolean(SettingsActivity.CB_SHOW_NOTIFICATION_NEW_ARTICLES_STRING, true))//Default is true
NotificationManagerNewsReader.getInstance(OwnCloudSyncService.this).ShowMessage(title, tickerText, contentText);
}
UpdateWidget();
}
if(_Reader instanceof OwnCloud_Reader) {
API api = ((OwnCloud_Reader)_Reader).getApi();
if(api instanceof APIv2) {
new AsyncTask_TriggerOcUpdate(0,
OwnCloudSyncService.this,
api.getUsername(),
api.getPassword(),
new OnAsyncTaskCompletedListener[] { onAsyncTask_UpdateOcFeeds })
.execute((Void) null);
}
}
}
Log.d(TAG, "onAsyncTask_GetItems Finished");
//fireUpdateFinishedClicked();
}
};
OnAsyncTaskCompletedListener onAsyncTask_UpdateOcFeeds = new OnAsyncTaskCompletedListener() {
@Override
public void onAsyncTaskCompleted(int task_id, Object task_result) {
}
};
private void UpdateWidget()
{
Intent intent = new Intent(this, WidgetProvider.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
// Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID,
// since it seems the onUpdate() is only fired on that:
int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), WidgetProvider.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,ids);
sendBroadcast(intent);
}
private void ThrowException(Exception ex) {
List callbackList = getCallBackItemsAndBeginBroadcast();
for (IOwnCloudSyncServiceCallback icb : callbackList) {
try {
icb.throwException(new AidlException(ex));
} catch (RemoteException e) {
e.printStackTrace();
}
}
callbacks.finishBroadcast();
}
private void startedSync(SYNC_TYPES sync_type) {
List callbackList = getCallBackItemsAndBeginBroadcast();
for(IOwnCloudSyncServiceCallback icb : callbackList) {
try {
icb.startedSync(sync_type.toString());
//icb.finishedSyncOfItems();
} catch (RemoteException e) {
e.printStackTrace();
}
}
callbacks.finishBroadcast();
}
private void finishedSync(SYNC_TYPES sync_type) {
List callbackList = getCallBackItemsAndBeginBroadcast();
for(IOwnCloudSyncServiceCallback icb : callbackList) {
try {
icb.finishedSync(sync_type.toString());
//icb.finishedSyncOfItems();
} catch (RemoteException e) {
e.printStackTrace();
}
}
callbacks.finishBroadcast();
}
private List getCallBackItemsAndBeginBroadcast() {
// Broadcast to all clients the new value.
List callbackList = new ArrayList();
final int N = callbacks.beginBroadcast();
for (int i=0; i < N; i++) {
callbackList.add((IOwnCloudSyncServiceCallback) callbacks.getBroadcastItem(i));
}
return callbackList;
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}