Abit/app/src/main/java/ch/dissem/apps/abit/service/ServicePowEngine.java

62 lines
1.9 KiB
Java

package ch.dissem.apps.abit.service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import java.util.concurrent.Semaphore;
import ch.dissem.apps.abit.service.ProofOfWorkService.PowBinder;
import ch.dissem.bitmessage.ports.ProofOfWorkEngine;
import static android.content.Context.BIND_AUTO_CREATE;
/**
* Proof of Work engine that uses the Proof of Work service.
*/
public class ServicePowEngine implements ProofOfWorkEngine, ProofOfWorkEngine.Callback {
private final Semaphore semaphore = new Semaphore(1, true);
private final Context ctx;
private byte[] initialHash, targetValue;
private Callback callback;
public ServicePowEngine(Context ctx) {
this.ctx = ctx;
}
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
((PowBinder) service).getEngine().calculateNonce(initialHash, targetValue, ServicePowEngine.this);
}
@Override
public void onServiceDisconnected(ComponentName name) {
semaphore.release();
}
};
@Override
public void calculateNonce(byte[] initialHash, byte[] targetValue, Callback callback) {
try {
semaphore.acquire();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
this.initialHash = initialHash;
this.targetValue = targetValue;
this.callback = callback;
ctx.bindService(new Intent(ctx, ProofOfWorkService.class), connection, BIND_AUTO_CREATE);
}
@Override
public void onNonceCalculated(byte[] initialHash, byte[] bytes) {
callback.onNonceCalculated(initialHash, bytes);
ctx.unbindService(connection);
}
}