Ingen beskrivning

RNFetchBlob.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. package com.RNFetchBlob;
  2. import android.app.Activity;
  3. import android.app.DownloadManager;
  4. import android.content.Intent;
  5. import android.net.Uri;
  6. import com.facebook.react.bridge.ActivityEventListener;
  7. import com.facebook.react.bridge.Callback;
  8. import com.facebook.react.bridge.LifecycleEventListener;
  9. import com.facebook.react.bridge.Promise;
  10. import com.facebook.react.bridge.ReactApplicationContext;
  11. import com.facebook.react.bridge.ReactContextBaseJavaModule;
  12. import com.facebook.react.bridge.ReactMethod;
  13. import com.facebook.react.bridge.ReadableArray;
  14. import com.facebook.react.bridge.ReadableMap;
  15. // Cookies
  16. import com.facebook.react.bridge.WritableMap;
  17. import com.facebook.react.modules.network.ForwardingCookieHandler;
  18. import com.facebook.react.modules.network.CookieJarContainer;
  19. import com.facebook.react.modules.network.OkHttpClientProvider;
  20. import okhttp3.OkHttpClient;
  21. import okhttp3.JavaNetCookieJar;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. import java.util.concurrent.LinkedBlockingQueue;
  25. import java.util.concurrent.ThreadPoolExecutor;
  26. import java.util.concurrent.TimeUnit;
  27. import static android.app.Activity.RESULT_OK;
  28. import static com.RNFetchBlob.RNFetchBlobConst.GET_CONTENT_INTENT;
  29. public class RNFetchBlob extends ReactContextBaseJavaModule {
  30. // Cookies
  31. private final ForwardingCookieHandler mCookieHandler;
  32. private final CookieJarContainer mCookieJarContainer;
  33. private final OkHttpClient mClient;
  34. static ReactApplicationContext RCTContext;
  35. static LinkedBlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<>();
  36. static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 5000, TimeUnit.MILLISECONDS, taskQueue);
  37. static LinkedBlockingQueue<Runnable> fsTaskQueue = new LinkedBlockingQueue<>();
  38. static ThreadPoolExecutor fsThreadPool = new ThreadPoolExecutor(2, 10, 5000, TimeUnit.MILLISECONDS, taskQueue);
  39. static public boolean ActionViewVisible = false;
  40. static HashMap<Integer, Promise> promiseTable = new HashMap<>();
  41. public RNFetchBlob(ReactApplicationContext reactContext) {
  42. super(reactContext);
  43. mClient = OkHttpClientProvider.getOkHttpClient();
  44. mCookieHandler = new ForwardingCookieHandler(reactContext);
  45. mCookieJarContainer = (CookieJarContainer) mClient.cookieJar();
  46. mCookieJarContainer.setCookieJar(new JavaNetCookieJar(mCookieHandler));
  47. RCTContext = reactContext;
  48. reactContext.addActivityEventListener(new ActivityEventListener() {
  49. @Override
  50. public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
  51. if(requestCode == GET_CONTENT_INTENT && resultCode == RESULT_OK) {
  52. Uri d = data.getData();
  53. promiseTable.get(GET_CONTENT_INTENT).resolve(d.toString());
  54. promiseTable.remove(GET_CONTENT_INTENT);
  55. }
  56. }
  57. @Override
  58. public void onNewIntent(Intent intent) {
  59. }
  60. });
  61. }
  62. @Override
  63. public String getName() {
  64. return "RNFetchBlob";
  65. }
  66. @Override
  67. public Map<String, Object> getConstants() {
  68. return RNFetchBlobFS.getSystemfolders(this.getReactApplicationContext());
  69. }
  70. @ReactMethod
  71. public void createFile(final String path, final String content, final String encode, final Callback callback) {
  72. threadPool.execute(new Runnable() {
  73. @Override
  74. public void run() {
  75. RNFetchBlobFS.createFile(path, content, encode, callback);
  76. }
  77. });
  78. }
  79. @ReactMethod
  80. public void actionViewIntent(String path, String mime, final Promise promise) {
  81. try {
  82. Intent intent= new Intent(Intent.ACTION_VIEW)
  83. .setDataAndType(Uri.parse("file://" + path), mime);
  84. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  85. this.getReactApplicationContext().startActivity(intent);
  86. ActionViewVisible = true;
  87. final LifecycleEventListener listener = new LifecycleEventListener() {
  88. @Override
  89. public void onHostResume() {
  90. if(ActionViewVisible)
  91. promise.resolve(null);
  92. RCTContext.removeLifecycleEventListener(this);
  93. }
  94. @Override
  95. public void onHostPause() {
  96. }
  97. @Override
  98. public void onHostDestroy() {
  99. }
  100. };
  101. RCTContext.addLifecycleEventListener(listener);
  102. } catch(Exception ex) {
  103. promise.reject(ex.getLocalizedMessage());
  104. }
  105. }
  106. @ReactMethod
  107. public void createFileASCII(final String path, final ReadableArray dataArray, final Callback callback) {
  108. threadPool.execute(new Runnable() {
  109. @Override
  110. public void run() {
  111. RNFetchBlobFS.createFileASCII(path, dataArray, callback);
  112. }
  113. });
  114. }
  115. @ReactMethod
  116. public void writeArrayChunk(final String streamId, final ReadableArray dataArray, final Callback callback) {
  117. RNFetchBlobFS.writeArrayChunk(streamId, dataArray, callback);
  118. }
  119. @ReactMethod
  120. public void unlink(String path, Callback callback) {
  121. RNFetchBlobFS.unlink(path, callback);
  122. }
  123. @ReactMethod
  124. public void mkdir(String path, Callback callback) {
  125. RNFetchBlobFS.mkdir(path, callback);
  126. }
  127. @ReactMethod
  128. public void exists(String path, Callback callback) {
  129. RNFetchBlobFS.exists(path, callback);
  130. }
  131. @ReactMethod
  132. public void cp(final String path, final String dest, final Callback callback) {
  133. threadPool.execute(new Runnable() {
  134. @Override
  135. public void run() {
  136. RNFetchBlobFS.cp(path, dest, callback);
  137. }
  138. });
  139. }
  140. @ReactMethod
  141. public void mv(String path, String dest, Callback callback) {
  142. RNFetchBlobFS.mv(path, dest, callback);
  143. }
  144. @ReactMethod
  145. public void ls(String path, Callback callback) {
  146. RNFetchBlobFS.ls(path, callback);
  147. }
  148. @ReactMethod
  149. public void writeStream(String path, String encode, boolean append, Callback callback) {
  150. new RNFetchBlobFS(this.getReactApplicationContext()).writeStream(path, encode, append, callback);
  151. }
  152. @ReactMethod
  153. public void writeChunk(String streamId, String data, Callback callback) {
  154. RNFetchBlobFS.writeChunk(streamId, data, callback);
  155. }
  156. @ReactMethod
  157. public void closeStream(String streamId, Callback callback) {
  158. RNFetchBlobFS.closeStream(streamId, callback);
  159. }
  160. @ReactMethod
  161. public void removeSession(ReadableArray paths, Callback callback) {
  162. RNFetchBlobFS.removeSession(paths, callback);
  163. }
  164. @ReactMethod
  165. public void readFile(final String path, final String encoding, final Promise promise) {
  166. threadPool.execute(new Runnable() {
  167. @Override
  168. public void run() {
  169. RNFetchBlobFS.readFile(path, encoding, promise);
  170. }
  171. });
  172. }
  173. @ReactMethod
  174. public void writeFileArray(final String path, final ReadableArray data, final boolean append, final Promise promise) {
  175. threadPool.execute(new Runnable() {
  176. @Override
  177. public void run() {
  178. RNFetchBlobFS.writeFile(path, data, append, promise);
  179. }
  180. });
  181. }
  182. @ReactMethod
  183. public void writeFile(final String path, final String encoding, final String data, final boolean append, final Promise promise) {
  184. threadPool.execute(new Runnable() {
  185. @Override
  186. public void run() {
  187. RNFetchBlobFS.writeFile(path, encoding, data, append, promise);
  188. }
  189. });
  190. }
  191. @ReactMethod
  192. public void lstat(String path, Callback callback) {
  193. RNFetchBlobFS.lstat(path, callback);
  194. }
  195. @ReactMethod
  196. public void stat(String path, Callback callback) {
  197. RNFetchBlobFS.stat(path, callback);
  198. }
  199. @ReactMethod
  200. public void scanFile(final ReadableArray pairs, final Callback callback) {
  201. final ReactApplicationContext ctx = this.getReactApplicationContext();
  202. threadPool.execute(new Runnable() {
  203. @Override
  204. public void run() {
  205. int size = pairs.size();
  206. String [] p = new String[size];
  207. String [] m = new String[size];
  208. for(int i=0;i<size;i++) {
  209. ReadableMap pair = pairs.getMap(i);
  210. if(pair.hasKey("path")) {
  211. p[i] = pair.getString("path");
  212. if(pair.hasKey("mime"))
  213. m[i] = pair.getString("mime");
  214. else
  215. m[i] = null;
  216. }
  217. }
  218. new RNFetchBlobFS(ctx).scanFile(p, m, callback);
  219. }
  220. });
  221. }
  222. @ReactMethod
  223. public void hash(final String path, final String algorithm, final Promise promise) {
  224. threadPool.execute(new Runnable() {
  225. @Override
  226. public void run() {
  227. RNFetchBlobFS.hash(path, algorithm, promise);
  228. }
  229. });
  230. }
  231. /**
  232. * @param path Stream file path
  233. * @param encoding Stream encoding, should be one of `base64`, `ascii`, and `utf8`
  234. * @param bufferSize Stream buffer size, default to 4096 or 4095(base64).
  235. */
  236. @ReactMethod
  237. public void readStream(final String path, final String encoding, final int bufferSize, final int tick, final String streamId) {
  238. final ReactApplicationContext ctx = this.getReactApplicationContext();
  239. fsThreadPool.execute(new Runnable() {
  240. @Override
  241. public void run() {
  242. RNFetchBlobFS fs = new RNFetchBlobFS(ctx);
  243. fs.readStream(path, encoding, bufferSize, tick, streamId);
  244. }
  245. });
  246. }
  247. @ReactMethod
  248. public void cancelRequest(String taskId, Callback callback) {
  249. try {
  250. RNFetchBlobReq.cancelTask(taskId);
  251. callback.invoke(null, taskId);
  252. } catch (Exception ex) {
  253. callback.invoke(ex.getLocalizedMessage(), null);
  254. }
  255. }
  256. @ReactMethod
  257. public void slice(String src, String dest, int start, int end, Promise promise) {
  258. RNFetchBlobFS.slice(src, dest, start, end, "", promise);
  259. }
  260. @ReactMethod
  261. public void enableProgressReport(String taskId, int interval, int count) {
  262. RNFetchBlobProgressConfig config = new RNFetchBlobProgressConfig(true, interval, count, RNFetchBlobProgressConfig.ReportType.Download);
  263. RNFetchBlobReq.progressReport.put(taskId, config);
  264. }
  265. @ReactMethod
  266. public void df(final Callback callback) {
  267. fsThreadPool.execute(new Runnable() {
  268. @Override
  269. public void run() {
  270. RNFetchBlobFS.df(callback);
  271. }
  272. });
  273. }
  274. @ReactMethod
  275. public void enableUploadProgressReport(String taskId, int interval, int count) {
  276. RNFetchBlobProgressConfig config = new RNFetchBlobProgressConfig(true, interval, count, RNFetchBlobProgressConfig.ReportType.Upload);
  277. RNFetchBlobReq.uploadProgressReport.put(taskId, config);
  278. }
  279. @ReactMethod
  280. public void fetchBlob(ReadableMap options, String taskId, String method, String url, ReadableMap headers, String body, final Callback callback) {
  281. new RNFetchBlobReq(options, taskId, method, url, headers, body, null, mClient, callback).run();
  282. }
  283. @ReactMethod
  284. public void fetchBlobForm(ReadableMap options, String taskId, String method, String url, ReadableMap headers, ReadableArray body, final Callback callback) {
  285. new RNFetchBlobReq(options, taskId, method, url, headers, null, body, mClient, callback).run();
  286. }
  287. @ReactMethod
  288. public void getContentIntent(String mime, Promise promise) {
  289. Intent i = new Intent(Intent.ACTION_GET_CONTENT);
  290. if(mime != null)
  291. i.setType(mime);
  292. else
  293. i.setType("*/*");
  294. promiseTable.put(GET_CONTENT_INTENT, promise);
  295. this.getReactApplicationContext().startActivityForResult(i, GET_CONTENT_INTENT, null);
  296. }
  297. @ReactMethod
  298. public void addCompleteDownload (ReadableMap config, Promise promise) {
  299. DownloadManager dm = (DownloadManager) RNFetchBlob.RCTContext.getSystemService(RNFetchBlob.RCTContext.DOWNLOAD_SERVICE);
  300. String path = RNFetchBlobFS.normalizePath(config.getString("path"));
  301. if(path == null) {
  302. promise.reject("RNFetchblob.addCompleteDownload can not resolve URI:" + config.getString("path"), "RNFetchblob.addCompleteDownload can not resolve URI:" + path);
  303. return;
  304. }
  305. try {
  306. WritableMap stat = RNFetchBlobFS.statFile(path);
  307. dm.addCompletedDownload(
  308. config.hasKey("title") ? config.getString("title") : "",
  309. config.hasKey("description") ? config.getString("description") : "",
  310. true,
  311. config.hasKey("mime") ? config.getString("mime") : null,
  312. path,
  313. Long.valueOf(stat.getString("size")),
  314. config.hasKey("showNotification") && config.getBoolean("showNotification")
  315. );
  316. promise.resolve(null);
  317. }
  318. catch(Exception ex) {
  319. promise.reject("RNFetchblob.addCompleteDownload failed", ex.getStackTrace().toString());
  320. }
  321. }
  322. }