parent
0c1c1a6c79
commit
75c2ece016
3 changed files with 90 additions and 3 deletions
BIN
src/main/assets/blockchain/headers
Normal file
BIN
src/main/assets/blockchain/headers
Normal file
Binary file not shown.
|
@ -2,8 +2,22 @@ package io.lbry.browser;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.res.AssetFileDescriptor;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
public class ServiceHelper {
|
public class ServiceHelper {
|
||||||
|
|
||||||
|
private static final String TAG = "io.lbry.browser.ServiceHelper";
|
||||||
|
|
||||||
|
private static final String HEADERS_ASSET_KEY = "headersAssetInitialized";
|
||||||
|
|
||||||
public static Intent buildIntent(Context ctx, String pythonServiceArgument, Class serviceClass, String pythonName) {
|
public static Intent buildIntent(Context ctx, String pythonServiceArgument, Class serviceClass, String pythonName) {
|
||||||
Intent intent = new Intent(ctx, serviceClass);
|
Intent intent = new Intent(ctx, serviceClass);
|
||||||
String argument = ctx.getFilesDir().getAbsolutePath() + "/app";
|
String argument = ctx.getFilesDir().getAbsolutePath() + "/app";
|
||||||
|
@ -18,13 +32,83 @@ public class ServiceHelper {
|
||||||
return intent;
|
return intent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void start(Context ctx, String pythonServiceArgument, Class serviceClass, String pythonName) {
|
public static void start(final Context ctx, String pythonServiceArgument, Class serviceClass, String pythonName) {
|
||||||
Intent intent = buildIntent(ctx, pythonServiceArgument, serviceClass, pythonName);
|
// always check initial headers status before starting the service
|
||||||
ctx.startService(intent);
|
final SharedPreferences sp = ctx.getSharedPreferences(MainActivity.SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
|
||||||
|
boolean initHeaders = sp.getBoolean(HEADERS_ASSET_KEY, false);
|
||||||
|
if (initHeaders) {
|
||||||
|
// initial headers asset copy already done. simply start the service
|
||||||
|
Intent intent = buildIntent(ctx, pythonServiceArgument, serviceClass, pythonName);
|
||||||
|
ctx.startService(intent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
(new AsyncTask<Void, Void, Void>() {
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... params) {
|
||||||
|
String targetPath = String.format("%s/lbryum/lbc_mainnet", Utils.getAppInternalStorageDir(ctx));
|
||||||
|
File targetDir = new File(targetPath);
|
||||||
|
if (!targetDir.exists()) {
|
||||||
|
targetDir.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
String headersPath = String.format("%s/headers", targetPath);
|
||||||
|
android.util.Log.d(TAG, String.format("HeadersPath: %s", headersPath));
|
||||||
|
File targetHeadersFile = new File(headersPath);
|
||||||
|
InputStream in = null;
|
||||||
|
FileOutputStream out = null;
|
||||||
|
|
||||||
|
long sourceLen = 0;
|
||||||
|
long targetLen = 0;
|
||||||
|
try {
|
||||||
|
android.util.Log.d(TAG, "Opening asset: blockchain/headers");
|
||||||
|
in = ctx.getAssets().open("blockchain/headers");
|
||||||
|
out = new FileOutputStream(targetHeadersFile);
|
||||||
|
byte[] b = new byte[1120]; // 10 headers at a time?
|
||||||
|
int len;
|
||||||
|
while ((len = in.read(b, 0, 1120)) > 0) {
|
||||||
|
sourceLen += len;
|
||||||
|
out.write(b, 0, len);
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
// failed to copy the headers. sdk will perform the download instead.
|
||||||
|
android.util.Log.e(TAG, "failed to copy headers asset", ex);
|
||||||
|
} finally {
|
||||||
|
closeStream(in);
|
||||||
|
closeStream(out);
|
||||||
|
|
||||||
|
// only mark the copy as successful if the file sizes are the same
|
||||||
|
targetLen = targetHeadersFile.exists() ? targetHeadersFile.length() : 0;
|
||||||
|
android.util.Log.d(TAG, String.format("SourceLength=%d; TargetLength=%d", sourceLen, targetLen));
|
||||||
|
if (targetLen > 0 && targetLen == sourceLen) {
|
||||||
|
SharedPreferences.Editor editor = sp.edit();
|
||||||
|
editor.putBoolean(HEADERS_ASSET_KEY, true);
|
||||||
|
editor.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onPostExecute(Void result) {
|
||||||
|
Intent intent = buildIntent(ctx, pythonServiceArgument, serviceClass, pythonName);
|
||||||
|
ctx.startService(intent);
|
||||||
|
}
|
||||||
|
}).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void stop(Context ctx, Class serviceClass) {
|
public static void stop(Context ctx, Class serviceClass) {
|
||||||
Intent intent = new Intent(ctx, serviceClass);
|
Intent intent = new Intent(ctx, serviceClass);
|
||||||
ctx.stopService(intent);
|
ctx.stopService(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void closeStream(Closeable closeable) {
|
||||||
|
try {
|
||||||
|
if (closeable != null) {
|
||||||
|
closeable.close();
|
||||||
|
}
|
||||||
|
} catch (IOException ex) {
|
||||||
|
// pass
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -30,6 +30,9 @@ import com.facebook.react.common.MapBuilder;
|
||||||
import com.squareup.picasso.Picasso;
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
Loading…
Reference in a new issue