// Copyright 2016 Google, Inc.
//
// 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.firebase.jobdispatcher.testapp;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;
import com.firebase.jobdispatcher.Driver;
import com.firebase.jobdispatcher.FirebaseJobDispatcher;
import com.firebase.jobdispatcher.GooglePlayDriver;
import com.firebase.jobdispatcher.Job;
import com.firebase.jobdispatcher.JobParameters;
import com.firebase.jobdispatcher.JobValidator;
import java.util.Iterator;
public final class CentralContainer {
private static JobStore sStore;
private static boolean sInitialized = false;
private final static Object sLock = new Object();
private static FirebaseJobDispatcher sDispatcher;
public static void init(Context ctx) {
if (!sInitialized) {
synchronized (sLock) {
if (!sInitialized) {
initLocked(ctx);
}
}
}
}
private static void initLocked(Context ctx) {
sStore = new JobStore();
sDispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(ctx));
sInitialized = true;
}
public static JobStore getStore(Context ctx) {
init(ctx);
return sStore;
}
public static FirebaseJobDispatcher getDispatcher(Context ctx) {
init(ctx);
return sDispatcher;
}
private static class TrackingBackend implements Driver {
private final Driver mDriver;
private final JobStore mStore;
public TrackingBackend(Driver backend, JobStore store) {
mDriver = backend;
mStore = store;
}
@Override
public int schedule(@NonNull Job job) {
Log.i("TrackingBackend", "beginning schedule loop");
synchronized (mStore) {
final Iterator<JobHistory> it = mStore.iterator();
while (it.hasNext()) {
JobParameters j = it.next().job;
if (j.getTag().equals(job.getTag()) && j.getService().equals(job.getService())) {
it.remove();
}
}
mStore.add(new JobHistory(job));
}
Log.i("TrackingBackend", "ending schedule loop");
return mDriver.schedule(job);
}
@Override
public int cancel(@NonNull String tag) {
synchronized (mStore) {
final Iterator<JobHistory> it = mStore.iterator();
while (it.hasNext()) {
JobParameters j = it.next().job;
if (tag == null || tag.equals(j.getTag())) {
it.remove();
break;
}
}
return mDriver.cancel(tag);
}
}
@Override
public int cancelAll() {
return mDriver.cancelAll();
}
@NonNull
@Override
public JobValidator getValidator() {
return mDriver.getValidator();
}
@Override
public boolean isAvailable() {
return mDriver.isAvailable();
}
}
}