package com.seafile.seadroid2.cameraupload;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.IBinder;
import android.provider.MediaStore;
import com.seafile.seadroid2.SettingsManager;
/**
* This service monitors the media provider content provider for new images/videos.
*
* If new content appears, this service will get notified and send a syncRequest to the MediaSyncProvider.
*
* This service is always running, even if camera upload is not active.
* However, it will only register it's ContentObservers if Camera Upload is enabled in Seadroid.
*/
public class MediaObserverService extends Service {
private static final String DEBUG_TAG = "MediaObserverService";
private MediaObserver mediaObserver = null;
private SettingsManager settingsManager = SettingsManager.instance();
private CameraUploadManager cameraManager;
/**
* If camera upload settings have changed, we might have to trigger a full resync.
* This listener takes care of that.
*/
private SharedPreferences.OnSharedPreferenceChangeListener settingsListener =
new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
boolean doFullResync = false;
// here we have to catch *all* the cases that might make a full resync to the repository
// necessary.
switch (key) {
// if video upload has been switched on, do a full sync, to upload
// any older videos already recorded.
case SettingsManager.CAMERA_UPLOAD_ALLOW_VIDEOS_SWITCH_KEY:
if (settingsManager.isVideosUploadAllowed())
doFullResync = true;
break;
// same goes for if the list of selected buckets has been changed
case SettingsManager.SHARED_PREF_CAMERA_UPLOAD_BUCKETS:
doFullResync = true;
break;
// the repo changed, also do a full resync
case SettingsManager.SHARED_PREF_CAMERA_UPLOAD_REPO_ID:
doFullResync = true;
break;
}
if (cameraManager.isCameraUploadEnabled() && doFullResync) {
// Log.i(DEBUG_TAG, "Doing a full resync of all media content.");
cameraManager.performFullSync();
}
}
};
@Override
public void onCreate() {
// Log.d(DEBUG_TAG, "onCreate");
settingsManager.registerSharedPreferencesListener(settingsListener);
cameraManager = new CameraUploadManager(getApplicationContext());
registerContentObservers();
if (cameraManager.isCameraUploadEnabled()) {
// do a sync in case we missed something while we weren't observing
cameraManager.performSync();
}
}
@Override
public void onDestroy() {
// Log.d(DEBUG_TAG, "onDestroy");
settingsManager.unregisterSharedPreferencesListener(settingsListener);
unregisterContentObservers();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void registerContentObservers() {
mediaObserver = new MediaObserver();
getApplicationContext().getContentResolver().registerContentObserver(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false, mediaObserver);
getApplicationContext().getContentResolver().registerContentObserver
(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, false, mediaObserver);
// Log.i(DEBUG_TAG, "Started watchting for new media content.");
}
private void unregisterContentObservers() {
this.getApplicationContext().getContentResolver()
.unregisterContentObserver(mediaObserver);
// Log.i(DEBUG_TAG, "Stopped watchting for new media content.");
}
private class MediaObserver extends ContentObserver {
public MediaObserver() {
super(null);
}
@Override
public void onChange(boolean selfChange) {
onChange(selfChange, null);
}
@Override
public void onChange(boolean selfChange, Uri changeUri) {
if (cameraManager.isCameraUploadEnabled()) {
// Log.d(DEBUG_TAG, "Noticed a change in the media provider, scheduling sync.");
cameraManager.performSync();
}
}
}
}