/*
* Copyright (c) 2010 Jan Berkel <jan.berkel@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.zegoggles.smssync.service;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.IBinder;
import android.os.PowerManager;
import android.support.v4.app.NotificationCompat;
import android.text.format.DateFormat;
import android.util.Log;
import com.fsck.k9.mail.MessagingException;
import com.zegoggles.smssync.App;
import com.zegoggles.smssync.R;
import com.zegoggles.smssync.activity.MainActivity;
import com.zegoggles.smssync.mail.BackupImapStore;
import com.zegoggles.smssync.preferences.AuthPreferences;
import com.zegoggles.smssync.preferences.Preferences;
import com.zegoggles.smssync.service.state.State;
import com.zegoggles.smssync.utils.AppLog;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Locale;
import static com.zegoggles.smssync.App.LOCAL_LOGV;
import static com.zegoggles.smssync.App.TAG;
public abstract class ServiceBase extends Service {
@Nullable private PowerManager.WakeLock mWakeLock;
@Nullable private WifiManager.WifiLock mWifiLock;
private AppLog appLog;
@Nullable protected Notification notification;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
if (new Preferences(this).isAppLogEnabled()) {
char[] format;
try {
format = DateFormat.getDateFormatOrder(this);
} catch (IllegalArgumentException e) {
format = new char[] { 'd' };
}
this.appLog = new AppLog(format);
}
App.bus.register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
if (appLog != null) appLog.close();
App.bus.unregister(this);
notification = null;
}
// Android api level < 5
@Override
public void onStart(final Intent intent, int startId) {
handleIntent(intent);
}
// Android api level >= 5
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
handleIntent(intent);
return START_NOT_STICKY;
}
public abstract @NotNull State getState();
public boolean isWorking() {
return getState().isRunning();
}
protected BackupImapStore getBackupImapStore() throws MessagingException {
final String uri = getAuthPreferences().getStoreUri();
if (!BackupImapStore.isValidUri(uri)) {
throw new MessagingException("No valid IMAP URI: "+uri);
}
return new BackupImapStore(getApplicationContext(), uri);
}
protected AuthPreferences getAuthPreferences() {
return new AuthPreferences(this);
}
protected Preferences getPreferences() {
return new Preferences(this);
}
protected synchronized void acquireLocks() {
if (mWakeLock == null) {
PowerManager pMgr = (PowerManager) getSystemService(POWER_SERVICE);
mWakeLock = pMgr.newWakeLock(wakeLockType(), TAG);
}
mWakeLock.acquire();
if (isConnectedViaWifi()) {
// we have Wifi, lock it
WifiManager wMgr = getWifiManager();
if (mWifiLock == null) {
mWifiLock = wMgr.createWifiLock(getWifiLockType(), TAG);
}
mWifiLock.acquire();
}
}
protected int wakeLockType() {
return PowerManager.PARTIAL_WAKE_LOCK;
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
private int getWifiLockType() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1 ?
WifiManager.WIFI_MODE_FULL_HIGH_PERF : WifiManager.WIFI_MODE_FULL;
}
protected synchronized void releaseLocks() {
if (mWakeLock != null && mWakeLock.isHeld()) {
mWakeLock.release();
mWakeLock = null;
}
if (mWifiLock != null && mWifiLock.isHeld()) {
mWifiLock.release();
mWifiLock = null;
}
}
protected boolean isBackgroundTask() {
return false;
}
protected abstract void handleIntent(final Intent intent);
protected void appLog(int id, Object... args) {
final String msg = getString(id, args);
if (appLog != null) {
appLog.append(msg);
} else if (LOCAL_LOGV) {
Log.d(App.TAG, "AppLog: "+msg);
}
}
protected void appLogDebug(String message, Object... args) {
if (getPreferences().isAppLogDebug() && appLog != null) {
String formatted = String.format(Locale.ENGLISH, message, args);
appLog.append(formatted);
}
}
protected NotificationManager getNotifier() {
return (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
}
protected ConnectivityManager getConnectivityManager() {
return (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
}
protected WifiManager getWifiManager() {
return (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
}
protected @NotNull NotificationCompat.Builder createNotification(int resId) {
return new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notification)
.setTicker(getString(resId))
.setWhen(System.currentTimeMillis())
.setOngoing(true);
}
protected PendingIntent getPendingIntent() {
return PendingIntent.getActivity(this, 0,
new Intent(this, MainActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT);
}
protected boolean isConnectedViaWifi() {
WifiManager wifiManager = getWifiManager();
return (wifiManager != null &&
wifiManager.isWifiEnabled() &&
getConnectivityManager().getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null &&
getConnectivityManager().getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected());
}
}