No Description

RNFetchBlob.java 12KB

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