nativeapihelper
java
a month ago
29 kB
1
Indexable
Never
package com.sync.mobileapp; import android.content.Context; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.os.StatFs; import android.util.Log; import com.sync.mobileapp.callbacks.DummyNativeCallback; import com.sync.mobileapp.interfaces.NativeCallback; import com.sync.mobileapp.models.CachedPathItems; import com.sync.mobileapp.models.UserConf; import com.sync.mobileapp.utils.FileUtils; import com.sync.mobileapp.utils.Retry; import com.sync.mobileapp.utils.Thumbnail; import com.sync.mobileapp.utils.UploadUtils; import java.io.File; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Hashtable; import java.util.concurrent.atomic.AtomicInteger; import org.json.JSONException; import org.json.JSONObject; /* loaded from: /tmp/jadx-8747705718779973796.dex */ public class NativeApiHelper { protected static Context APP_CONTEXT = null; protected static NativeCallback BG_AUTOUPLOAD_CB = null; protected static boolean BG_AUTOUPLOAD_PAUSED = false; protected static Thread BG_AUTOUPLOAD_THREAD = null; protected static NativeCallback BG_DOWNLOAD_CB = null; protected static Thread BG_DOWNLOAD_THREAD = null; protected static NativeCallback BG_UPLOAD_CB = null; protected static Thread BG_UPLOAD_THREAD = null; protected static Thread BG_WATCHER_THREAD = null; protected static DummyNativeCallback DEFAULT_DUMMY_CB = null; protected static boolean IS_INIT = false; protected static Hashtable<String, CachedPathItems> PATH_ITEMS_CACHE = null; protected static AtomicInteger SCROLLING_IN_PROGRESS_COUNTER = null; protected static int SCROLLING_IN_PROGRESS_COUNTER_MAX = 5; protected static int SCROLLING_IN_PROGRESS_SLEEP_MS = 125; protected static int THUMB1_MAX_DOWNLOAD_BYTES = 512000; protected static int THUMB2_MAX_DOWNLOAD_BYTES = 1024000; protected static long WATCHED_NUM_ABOVE; protected static long WATCHED_NUM_BELOW; protected static long WATCHED_ORDERFLAGS; protected static long WATCHED_PID; protected static long WATCHED_THUMBTYPE; protected static long WATCHED_WHEREFLAGS; protected static NativeCallback WATCHER_CB; private static int counter; static Retry retry = new Retry(3, 2000); private static native String callNative(String str, NativeCallback nativeCallback); protected static JSONObject error(int i) throws JSONException { return new JSONObject().put("errcode", i); } public static void log(String str, Exception exc) { StringWriter stringWriter = new StringWriter(); exc.printStackTrace(new PrintWriter(stringWriter)); Log.d("Sync.com", str + ":" + exc.getMessage() + "\n" + stringWriter.toString()); } public static void log(String str) { StackTraceElement stackTraceElement = new Exception().getStackTrace()[1]; Log.d("Sync.com", "(" + stackTraceElement.getClassName() + ", " + stackTraceElement.getLineNumber() + ") " + str); } public static void log(JSONObject jSONObject) { StackTraceElement stackTraceElement = new Exception().getStackTrace()[1]; Log.d("Sync.com", "(" + stackTraceElement.getClassName() + ", " + stackTraceElement.getLineNumber() + ") " + jSONObject.toString()); } /* JADX WARN: Removed duplicated region for block: B:60:0x009a A[EXC_TOP_SPLITTER, SYNTHETIC] */ /* JADX WARN: Removed duplicated region for block: B:64:0x00a4 A[EXC_TOP_SPLITTER, SYNTHETIC] */ /* JADX WARN: Unsupported multi-entry loop pattern (BACK_EDGE: B:41:0x0092 -> B:68:0x0095). Please submit an issue!!! */ /* Code decompiled incorrectly, please refer to instructions dump. To view partially-correct add '--show-bad-code' argument */ protected static boolean copyAssetToDir(java.lang.String r6, android.content.res.AssetManager r7, java.io.File r8) { /* java.lang.String r0 = "could not close output" java.lang.String r1 = "could not close input" r2 = 0 r3 = 0 java.io.InputStream r7 = r7.open(r6) // Catch: java.lang.Throwable -> L67 java.io.IOException -> L6b java.io.FileOutputStream r4 = new java.io.FileOutputStream // Catch: java.lang.Throwable -> L60 java.io.IOException -> L63 java.io.File r5 = new java.io.File // Catch: java.lang.Throwable -> L60 java.io.IOException -> L63 r5.<init>(r8, r6) // Catch: java.lang.Throwable -> L60 java.io.IOException -> L63 r4.<init>(r5) // Catch: java.lang.Throwable -> L60 java.io.IOException -> L63 java.lang.StringBuilder r2 = new java.lang.StringBuilder // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e r2.<init>() // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e java.lang.String r5 = "copy " r2.append(r5) // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e r2.append(r6) // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e java.lang.String r5 = " to " r2.append(r5) // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e java.io.File r5 = new java.io.File // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e r5.<init>(r8, r6) // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e java.lang.String r8 = r5.toString() // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e r2.append(r8) // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e java.lang.String r8 = r2.toString() // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e log(r8) // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e r8 = 1024(0x400, float:1.435E-42) byte[] r8 = new byte[r8] // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e L3d: int r2 = r7.read(r8) // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e if (r2 <= 0) goto L47 r4.write(r8, r3, r2) // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e goto L3d L47: r4.flush() // Catch: java.lang.Throwable -> L5c java.io.IOException -> L5e if (r7 == 0) goto L56 r7.close() // Catch: java.lang.Exception -> L50 goto L56 L50: r6 = move-exception log(r1, r6) r6 = 0 goto L57 L56: r6 = 1 L57: r4.close() // Catch: java.lang.Exception -> L91 r3 = r6 goto L95 L5c: r6 = move-exception goto L98 L5e: r8 = move-exception goto L65 L60: r6 = move-exception r4 = r2 goto L98 L63: r8 = move-exception r4 = r2 L65: r2 = r7 goto L6d L67: r6 = move-exception r7 = r2 r4 = r7 goto L98 L6b: r8 = move-exception r4 = r2 L6d: java.lang.StringBuilder r7 = new java.lang.StringBuilder // Catch: java.lang.Throwable -> L96 r7.<init>() // Catch: java.lang.Throwable -> L96 java.lang.String r5 = "could not copy asset " r7.append(r5) // Catch: java.lang.Throwable -> L96 r7.append(r6) // Catch: java.lang.Throwable -> L96 java.lang.String r6 = r7.toString() // Catch: java.lang.Throwable -> L96 log(r6, r8) // Catch: java.lang.Throwable -> L96 if (r2 == 0) goto L8b r2.close() // Catch: java.lang.Exception -> L87 goto L8b L87: r6 = move-exception log(r1, r6) L8b: if (r4 == 0) goto L95 r4.close() // Catch: java.lang.Exception -> L91 goto L95 L91: r6 = move-exception log(r0, r6) L95: return r3 L96: r6 = move-exception r7 = r2 L98: if (r7 == 0) goto La2 r7.close() // Catch: java.lang.Exception -> L9e goto La2 L9e: r7 = move-exception log(r1, r7) La2: if (r4 == 0) goto Lac r4.close() // Catch: java.lang.Exception -> La8 goto Lac La8: r7 = move-exception log(r0, r7) Lac: goto Lae Lad: throw r6 Lae: goto Lad */ throw new UnsupportedOperationException("Method not decompiled: com.sync.mobileapp.NativeApiHelper.copyAssetToDir(java.lang.String, android.content.res.AssetManager, java.io.File):boolean"); } protected static JSONObject call(JSONObject jSONObject, NativeCallback nativeCallback) throws JSONException { if (nativeCallback == null) { if (DEFAULT_DUMMY_CB == null) { DEFAULT_DUMMY_CB = new DummyNativeCallback(); } nativeCallback = DEFAULT_DUMMY_CB; } long nanoTime = System.nanoTime(); String callNative = callNative(jSONObject.toString(), nativeCallback); long nanoTime2 = System.nanoTime(); JSONObject jSONObject2 = new JSONObject(callNative); long nanoTime3 = System.nanoTime(); double d = nanoTime2 - nanoTime; Double.isNaN(d); jSONObject2.put("native_call_milli", d / 1000000.0d); double d2 = nanoTime3 - nanoTime2; Double.isNaN(d2); jSONObject2.put("json_processing_milli", d2 / 1000000.0d); return jSONObject2; } protected static JSONObject call(JSONObject jSONObject) throws JSONException { long nanoTime = System.nanoTime(); String callNative = callNative(jSONObject.toString(), null); long nanoTime2 = System.nanoTime(); JSONObject jSONObject2 = new JSONObject(callNative); long nanoTime3 = System.nanoTime(); double d = nanoTime2 - nanoTime; Double.isNaN(d); jSONObject2.put("native_call_milli", d / 1000000.0d); double d2 = nanoTime3 - nanoTime2; Double.isNaN(d2); jSONObject2.put("json_processing_milli", d2 / 1000000.0d); return jSONObject2; } protected static JSONObject call(String str, NativeCallback nativeCallback) throws JSONException { return call(new JSONObject().put("action", str), nativeCallback); } protected static void throwExceptionIfHasError(JSONObject jSONObject) throws Exception { int i = jSONObject.getInt("errcode"); if (i <= 0) { return; } throw new NativeApiHelperException(i, "got error code " + i); } protected static synchronized void refreshPathsLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static synchronized void refreshConfLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static boolean updateView(boolean z) { try { if (WATCHED_PID == 0 || WATCHER_CB == null) { return false; } if (z) { log("skipping call to refreshPath is iscontinued is true"); } else { refreshPathsLocked(new JSONObject().put("action", "refreshPaths").put("maxiter", 1).put("pid", WATCHED_PID).put("onlyifolderthan", 0), null); } String str = WATCHED_PID + ":" + WATCHED_WHEREFLAGS + ":" + WATCHED_ORDERFLAGS; CachedPathItems cachedPathItems = PATH_ITEMS_CACHE.get(str); int i = cachedPathItems != null ? cachedPathItems.curidx : 0; log("calling updateview on pid-where-order:" + str + " idx:" + i + " before:" + String.valueOf(WATCHED_NUM_ABOVE) + " after:" + String.valueOf(WATCHED_NUM_BELOW)); int i2 = THUMB1_MAX_DOWNLOAD_BYTES; if (WATCHED_THUMBTYPE == 8) { i2 = THUMB2_MAX_DOWNLOAD_BYTES; } long j = i; JSONObject call = call(new JSONObject().put("action", "updateView").put("mode", -1).put("pid", WATCHED_PID).put("thumbtype", WATCHED_THUMBTYPE).put("whereflags", WATCHED_WHEREFLAGS).put("orderflags", WATCHED_ORDERFLAGS).put("maxdownload", i2).put("firstidx", (j - WATCHED_NUM_ABOVE) - 1).put("uptoidx", j + WATCHED_NUM_BELOW + 1), (NativeCallback) null); if (call.isNull("numchanges") || WATCHER_CB == null) { return false; } WATCHER_CB.progress(call.toString()); return call.getInt("callagain") == 1; } catch (Exception e) { Log.d("Sync.com", "updateView had error", e); return false; } } public static long availSpaceOnExtStorage() { long availableBlocks; long blockSize; StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getPath()); if (Build.VERSION.SDK_INT >= 18) { availableBlocks = statFs.getAvailableBlocksLong(); blockSize = statFs.getBlockSizeLong(); } else { availableBlocks = statFs.getAvailableBlocks(); blockSize = statFs.getBlockSize(); } return availableBlocks * blockSize; } protected static synchronized void downloadNowLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static void runBackgroundDownloadLoop() { 1BgDlWrapCb r2 = new 1BgDlWrapCb(); while (true) { try { call("downloadProcessQueue", (NativeCallback) r2); } catch (Exception e) { Log.e("Sync.com", "downloadProcessQueue", e); } try { Thread.sleep(6000); } catch (InterruptedException unused) { Log.d("Sync.com", "bgdownload thread woken up"); } } } protected static synchronized void uploadNowLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { JSONObject call = call("getThumbParams", (NativeCallback) null); String string = jSONObject.getString("path"); String make = Thumbnail.make(string, call.getInt("thumb1size"), call.getInt("thumb1size"), true, call.getInt("thumb1quality")); String make2 = Thumbnail.make(string, call.getInt("thumb2size"), call.getInt("thumb2size"), false, call.getInt("thumb2quality")); jSONObject.put("thumb1", make); jSONObject.put("thumb2", make2); throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static void runBackgroundUploadLoop() { 1BgUpWrapCb r2 = new 1BgUpWrapCb(); while (true) { try { call("uploadProcessQueue", (NativeCallback) r2); } catch (Exception e) { Log.e("Sync.com", "uploadProcessQueue", e); } try { Thread.sleep(6000); } catch (InterruptedException unused) { Log.d("Sync.com", "runBackgroundupload thread woken up"); } } } protected static void runBackgroundAutoUploadLoop() { 1BgAutoUpWrapCb r0 = new 1BgAutoUpWrapCb(); while (!BG_AUTOUPLOAD_PAUSED) { if (!UploadUtils.canProceed(APP_CONTEXT)) { log("autoupload not allowed to proceed, sleep 20 minutes"); } else { log("Camera upload is going to process the queue"); try { call("autoUploadProcessQueue", (NativeCallback) r0); } catch (Exception e) { Log.e("Sync.com", "autoAploadProcessQueue", e); } } try { Thread.sleep(300000); } catch (InterruptedException unused) { Log.d("Sync.com", "runBackgroundAutoUpload thread woken up"); } } log("Camera upload is not running: Paused"); BG_AUTOUPLOAD_THREAD = null; } public static void processCameraUploadQueue(NativeCallback nativeCallback) { BG_AUTOUPLOAD_CB = nativeCallback; 2BgAutoUpWrapCb r4 = new 2BgAutoUpWrapCb(); if (BG_AUTOUPLOAD_PAUSED) { SyncApplication.logwrite("Sync.com", "Camera upload is not running: Paused"); SyncApplication.log("Sync.com", "Camera upload is not running: Paused"); return; } SyncApplication.logwrite("Sync.com", "Camera upload is going to process the queue"); SyncApplication.log("Sync.com", "Camera upload is going to process the queue"); try { call("autoUploadProcessQueue", (NativeCallback) r4); } catch (Exception e) { SyncApplication.logwrite("Sync.com", "autoAploadProcessQueue failed " + e.getLocalizedMessage()); SyncApplication.log("Sync.com", "autoAploadProcessQueue failed " + e.getLocalizedMessage()); } } protected static synchronized void provisionLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static synchronized void upstreamAPILocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static synchronized void createPublinkLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static synchronized void decryptLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } public static synchronized void mkdirLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } public static synchronized void batchDeleteLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } public static synchronized void deleteLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static synchronized void sendLogsLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static synchronized void renameLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static synchronized void geteventsLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static synchronized void shareLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { call(jSONObject, nativeCallback); } } protected static synchronized void publinkLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { call(jSONObject, nativeCallback); } } protected static synchronized void shareFileLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { call(jSONObject, nativeCallback); } } protected static synchronized void copytoLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } protected static synchronized void eventsThumbsLocked(JSONObject jSONObject, NativeCallback nativeCallback) throws Exception { synchronized (NativeApiHelper.class) { throwExceptionIfHasError(call(jSONObject, nativeCallback)); } } private static String getDeviceName() { String str = Build.MANUFACTURER; String str2 = Build.MODEL; if (str2.startsWith(str)) { return capitalize(str2); } return capitalize(str) + " " + str2; } private static String capitalize(String str) { if (str == null || str.length() == 0) { return ""; } char charAt = str.charAt(0); if (Character.isUpperCase(charAt)) { return str; } return Character.toUpperCase(charAt) + str.substring(1); } public static synchronized JSONObject provision(String str, String str2, String str3, String str4, boolean z, String str5, NativeCallback nativeCallback) throws JSONException { JSONObject spawnThread; synchronized (NativeApiHelper.class) { spawnThread = spawnThread(ThreadedNativeCall.PROVISION, new JSONObject().put("action", "provision").put("username", str).put("firstname", str2).put("lastname", str3).put("password", str4).put("devicename", getDeviceName()).put("twofa", str5).put("newuser", z ? 1 : 0), nativeCallback); } return spawnThread; } public static synchronized JSONObject provision(String str, String str2, String str3, String str4, boolean z, boolean z2, NativeCallback nativeCallback) throws JSONException { JSONObject spawnThread; synchronized (NativeApiHelper.class) { ThreadedNativeCall threadedNativeCall = ThreadedNativeCall.PROVISION; JSONObject put = new JSONObject().put("action", "provision").put("username", str).put("firstname", str2).put("lastname", str3).put("password", str4); int i = 1; JSONObject put2 = put.put("passreset", z2 ? 1 : 0).put("devicename", getDeviceName()); if (!z) { i = 0; } spawnThread = spawnThread(threadedNativeCall, put2.put("newuser", i), nativeCallback); } return spawnThread; } /* JADX INFO: Access modifiers changed from: private */ public static void sendErrorToCallback(JSONObject jSONObject, NativeCallback nativeCallback, NativeApiHelperException nativeApiHelperException) { if (nativeCallback == null) { Log.e("Sync.com", "cannot send exception to null callback", nativeApiHelperException); return; } try { nativeCallback.progress(new JSONObject().put("status", "error").put("errcode", nativeApiHelperException.getErrCode()).put("exception", nativeApiHelperException.toString()).toString()); } catch (Exception e) { Log.e("Sync.com", "unexpected exception while sending error to callback", e); } } protected static void wakeWatcher() { Thread thread = BG_WATCHER_THREAD; if (thread != null) { thread.interrupt(); } } public static void wakeAutoUpload() { Thread thread = BG_AUTOUPLOAD_THREAD; if (thread != null) { thread.interrupt(); } } protected static String processWormhole(String str) throws JSONException { char c; String uploadContentByID; File file; int i; int i2; int i3; int i4; JSONObject jSONObject = new JSONObject(str); String string = jSONObject.getString("action"); int hashCode = string.hashCode(); if (hashCode != -585905298) { if (hashCode == 11517756 && string.equals("autoUploadResolve")) { c = 0; } c = 65535; } else { if (string.equals("autoUploadCanProceed")) { c = 1; } c = 65535; } if (c != 0) { if (c == 1) { return new JSONObject().put("errcode", 0).put("continue", UploadUtils.canProceed(APP_CONTEXT) ? 1 : 0).toString(); } JSONObject put = new JSONObject().put("errcode", 1124073474); return put.put("errdesc", "unknow action '" + string + "'").toString(); } String string2 = jSONObject.getString("fileid"); String path = FileUtils.getPath(APP_CONTEXT, Uri.parse(string2)); if (path != null) { log("NativeApiHelper: fileid is old version:" + string2); SyncApplication.logwrite("NativeApiHelper", "autoUploadResolve " + string2 + " got path: " + path); if (path.isEmpty()) { SyncApplication.logwrite("NativeApiHelper", "autoUploadResolve could not return path from FileUtils"); JSONObject put2 = new JSONObject().put("errcode", 2); return put2.put("errdesc", "could not resolve uri: " + string2).toString(); } file = new File(path); if (file.length() >= 2000000000) { SyncApplication.logwrite("NativeApiHelper", "autoUploadResolve file size is too large > 2GB"); JSONObject put3 = new JSONObject().put("errcode", 2); return put3.put("errdesc", "File size is too large " + string2).toString(); } else if (!file.canRead() || !file.isFile()) { SyncApplication.logwrite("NativeApiHelper", "autoUploadResolve cannot read file at " + file.getAbsolutePath()); JSONObject put4 = new JSONObject().put("errcode", 2); return put4.put("errdesc", path + " does not exist").toString(); } else { uploadContentByID = path; } } else { SyncApplication.logwrite("NativeApiHelper", "NativeApiHelper: fileid is new version: " + string2); uploadContentByID = UploadUtils.getUploadContentByID(APP_CONTEXT, string2); if (uploadContentByID == null) { SyncApplication.logwrite("NativeApiHelper", "autoUploadResolve cannot read file at " + uploadContentByID); JSONObject put5 = new JSONObject().put("errcode", 2); return put5.put("errdesc", path + " does not exist").toString(); } file = new File(uploadContentByID); } SyncApplication.logwrite("NativeApiHelper", "resolve autoupload content got " + file.getAbsolutePath()); UserConf latestInstance = UserConf.getLatestInstance(); if (latestInstance != null) { i = latestInstance.getThumb1Size(); i2 = latestInstance.getThumb2Size(); i3 = latestInstance.getThumb1Quality(); i4 = latestInstance.getThumb2Quality(); } else { JSONObject thumbParams = NativeApi.getThumbParams(); i = thumbParams.getInt("thumb1size"); i2 = thumbParams.getInt("thumb2size"); i3 = thumbParams.getInt("thumb1quality"); i4 = thumbParams.getInt("thumb2quality"); } String make = Thumbnail.make(uploadContentByID, i, i, true, i3); return new JSONObject().put("errcode", 0).put("label", file.getName()).put("path", uploadContentByID).put("thumb1", make).put("thumb2", Thumbnail.make(uploadContentByID, i2, i2, false, i4)).toString(); } protected static JSONObject spawnThread(ThreadedNativeCall threadedNativeCall, JSONObject jSONObject, NativeCallback nativeCallback) throws JSONException { new Thread((Runnable) new 1(threadedNativeCall, jSONObject, nativeCallback == null ? new DummyNativeCallback() : nativeCallback, nativeCallback)).start(); return new JSONObject().put("errcode", 0); } }