- 添加 SDK 配置管理、网络请求客户端和令牌存储功能 - 实现即时通讯 IM 模块,包括消息收发、群组管理和会话功能 - 集成推送服务和应用更新功能模块 - 创建示例应用演示 SDK 使用方法 - 配置项目依赖管理和构建设置
106 行
3.6 KiB
JavaScript
106 行
3.6 KiB
JavaScript
#!/usr/bin/env node
|
|
'use strict'
|
|
const fs = require('fs')
|
|
const path = require('path')
|
|
|
|
const pickerFile = path.join(
|
|
__dirname, '..', 'node_modules', 'react-native-document-picker',
|
|
'android', 'src', 'main', 'java', 'com', 'reactnativedocumentpicker',
|
|
'RNDocumentPickerModule.java',
|
|
)
|
|
|
|
if (!fs.existsSync(pickerFile)) {
|
|
console.log('[postinstall] react-native-document-picker not found, skipping patch')
|
|
process.exit(0)
|
|
}
|
|
|
|
let content = fs.readFileSync(pickerFile, 'utf8')
|
|
|
|
if (!content.includes('GuardedResultAsyncTask')) {
|
|
console.log('[postinstall] react-native-document-picker already patched')
|
|
process.exit(0)
|
|
}
|
|
|
|
content = content.replace(
|
|
'import com.facebook.react.bridge.GuardedResultAsyncTask;',
|
|
'import java.util.concurrent.Executors;',
|
|
)
|
|
content = content.replace(
|
|
' new ProcessDataTask(getReactApplicationContext(), uris, copyTo, promise).execute();',
|
|
` final ReactApplicationContext ctx = getReactApplicationContext();
|
|
final List<Uri> finalUris = uris;
|
|
final String finalCopyTo = copyTo;
|
|
Executors.newSingleThreadExecutor().execute(() -> {
|
|
WritableArray results = Arguments.createArray();
|
|
for (Uri u : finalUris) {
|
|
results.pushMap(ProcessDataTask.getMetadataStatic(u, ctx.getApplicationContext(), finalCopyTo));
|
|
}
|
|
promise.resolve(results);
|
|
});`,
|
|
)
|
|
content = content.replace(
|
|
'private static class ProcessDataTask extends GuardedResultAsyncTask<ReadableArray> {',
|
|
'private static class ProcessDataTask {',
|
|
)
|
|
content = content.replace(
|
|
` private final WeakReference<Context> weakContext;
|
|
private final List<Uri> uris;
|
|
private final String copyTo;
|
|
private final Promise promise;
|
|
|
|
protected ProcessDataTask(ReactContext reactContext, List<Uri> uris, String copyTo, Promise promise) {
|
|
super(reactContext.getExceptionHandler());
|
|
this.weakContext = new WeakReference<>(reactContext.getApplicationContext());
|
|
this.uris = uris;
|
|
this.copyTo = copyTo;
|
|
this.promise = promise;
|
|
}
|
|
|
|
@Override
|
|
protected ReadableArray doInBackgroundGuarded() {
|
|
WritableArray results = Arguments.createArray();
|
|
for (Uri uri : uris) {
|
|
results.pushMap(getMetadata(uri));
|
|
}
|
|
return results;
|
|
}
|
|
|
|
@Override
|
|
protected void onPostExecuteGuarded(ReadableArray readableArray) {
|
|
promise.resolve(readableArray);
|
|
}
|
|
|
|
private WritableMap getMetadata(Uri uri) {
|
|
Context context = weakContext.get();
|
|
if (context == null) {
|
|
return Arguments.createMap();
|
|
}`,
|
|
` static WritableMap getMetadataStatic(Uri uri, Context context, String copyTo) {
|
|
if (context == null) {
|
|
return Arguments.createMap();
|
|
}`,
|
|
)
|
|
content = content.replace(
|
|
' prepareFileUri(context, map, uri);',
|
|
' prepareFileUri(context, map, uri, copyTo);',
|
|
)
|
|
content = content.replace(
|
|
' private void prepareFileUri(Context context, WritableMap map, Uri uri) {',
|
|
' private static void prepareFileUri(Context context, WritableMap map, Uri uri, String copyTo) {',
|
|
)
|
|
content = content.replace(
|
|
' copyFileToLocalStorage(context, map, uri);',
|
|
' copyFileToLocalStorage(context, map, uri, copyTo);',
|
|
)
|
|
content = content.replace(
|
|
' private void copyFileToLocalStorage(Context context, WritableMap map, Uri uri) {',
|
|
' private static void copyFileToLocalStorage(Context context, WritableMap map, Uri uri, String copyTo) {',
|
|
)
|
|
content = content.replace(
|
|
' public File safeGetDestination(',
|
|
' public static File safeGetDestination(',
|
|
)
|
|
|
|
fs.writeFileSync(pickerFile, content, 'utf8')
|
|
console.log('[postinstall] react-native-document-picker patched successfully')
|