Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,58 @@
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;

import com.facebook.react.HeadlessJsTaskService;
import com.facebook.react.jstasks.HeadlessJsTaskConfig;

import java.util.ArrayList;
import java.util.List;

public class HeadlessService extends HeadlessJsTaskService {

private static final String TASK_ID = "TASK_SYNC_ADAPTER";

private final IBinder mBinder = new LocalBinder();
private List<Callback> mCallbacks = new ArrayList<>();

public class LocalBinder extends Binder {
HeadlessService getService() {
return HeadlessService.this;
}
}

public interface Callback {
void onTaskCompletion();
}

@Override
public @Nullable
IBinder onBind(Intent intent) {
return mBinder;
}

public void notifyOnTaskCompletion(Callback cb) {
mCallbacks.add(cb);
}

@Override
public void onHeadlessJsTaskFinish(int taskId) {
super.onHeadlessJsTaskFinish(taskId);
for (Callback cb : mCallbacks) {
cb.onTaskCompletion();
}
mCallbacks.clear();
}

public void startHeadlessTask(Intent intent) {
HeadlessJsTaskConfig taskConfig = getTaskConfig(intent);
if (taskConfig != null) {
startTask(taskConfig);
}
}
@Override
protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
boolean allowForeground = Boolean.valueOf(getString(R.string.rnsb_allow_foreground));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,62 @@
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.AbstractThreadedSyncAdapter;
import android.content.ComponentName;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SyncRequest;
import android.content.SyncResult;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;

class SyncAdapter extends AbstractThreadedSyncAdapter {
import java.util.concurrent.CountDownLatch;

class SyncAdapter extends AbstractThreadedSyncAdapter implements HeadlessService.Callback {

private CountDownLatch doneSignal = new CountDownLatch(1);
private Intent mIntent;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder binder) {
HeadlessService service = ((HeadlessService.LocalBinder)binder).getService();
service.notifyOnTaskCompletion(SyncAdapter.this);
service.startHeadlessTask(mIntent);
}

@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};

public SyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
}

@Override
public void onTaskCompletion() {
getContext().unbindService(mConnection);
doneSignal.countDown();
}

@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
Intent service = new Intent(getContext(), HeadlessService.class);
getContext().startService(service);
mIntent = new Intent(getContext(), HeadlessService.class);
Context context = getContext();

if (context.getString(R.string.rnsb_user_visible).equals("true")) {
context.bindService(mIntent, mConnection, Context.BIND_AUTO_CREATE);
try {
doneSignal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
context.startService(mIntent);
}
}

/**
Expand Down