/* * Copyright © 2013 – 2016 Ricki Hirner (bitfire web engineering). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html */ package at.bitfire.davdroid.syncadapter; import android.accounts.Account; import android.app.Notification; import android.app.PendingIntent; import android.app.Service; import android.content.AbstractThreadedSyncAdapter; import android.content.ContentProviderClient; import android.content.Context; import android.content.Intent; import android.content.SyncResult; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.IBinder; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; import java.util.logging.Level; import at.bitfire.davdroid.AccountSettings; import at.bitfire.davdroid.App; import at.bitfire.davdroid.Constants; import at.bitfire.davdroid.R; import at.bitfire.davdroid.ui.PermissionsActivity; //import com.android.vending.billing.IInAppBillingService; public abstract class SyncAdapterService extends Service { abstract protected AbstractThreadedSyncAdapter syncAdapter(); @Nullable @Override public IBinder onBind(Intent intent) { return syncAdapter().getSyncAdapterBinder(); } public static abstract class SyncAdapter extends AbstractThreadedSyncAdapter { public SyncAdapter(Context context) { super(context, false); } @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { App.log.info("Sync for " + authority + " has been initiated"); // required for dav4android (ServiceLoader) Thread.currentThread().setContextClassLoader(getContext().getClassLoader()); } @Override public void onSecurityException(Account account, Bundle extras, String authority, SyncResult syncResult) { App.log.log(Level.WARNING, "Security exception when opening content provider for " + authority); syncResult.databaseError = true; Intent intent = new Intent(getContext(), PermissionsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Notification notify = new NotificationCompat.Builder(getContext()) .setSmallIcon(R.drawable.ic_error_light) .setLargeIcon(App.getLauncherBitmap(getContext())) .setContentTitle(getContext().getString(R.string.sync_error_permissions)) .setContentText(getContext().getString(R.string.sync_error_permissions_text)) .setContentIntent(PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)) .setCategory(NotificationCompat.CATEGORY_ERROR) .build(); NotificationManagerCompat nm = NotificationManagerCompat.from(getContext()); nm.notify(Constants.NOTIFICATION_PERMISSIONS, notify); } protected boolean checkSyncConditions(@NonNull AccountSettings settings) { if (settings.getSyncWifiOnly()) { ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(CONNECTIVITY_SERVICE); NetworkInfo network = cm.getActiveNetworkInfo(); if (network == null) { App.log.info("No network available, stopping"); return false; } if (network.getType() != ConnectivityManager.TYPE_WIFI || !network.isConnected()) { App.log.info("Not on connected WiFi, stopping"); return false; } String onlySSID = settings.getSyncWifiOnlySSID(); if (onlySSID != null) { onlySSID = "\"" + onlySSID + "\""; WifiManager wifi = (WifiManager) getContext().getApplicationContext().getSystemService(WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); if (info == null || !onlySSID.equals(info.getSSID())) { App.log.info("Connected to wrong WiFi network (" + info.getSSID() + ", required: " + onlySSID + "), ignoring"); return false; } } } return true; } } }