forked from Ivasoft/mattermost-mobile
* Refactor app database queries to not require the app database as argument * Android Share Extension and fix notifications prompt * feedback review
112 lines
4.1 KiB
Java
112 lines
4.1 KiB
Java
package com.mattermost.share;
|
|
|
|
import android.app.Activity;
|
|
import android.content.Context;
|
|
import android.graphics.Bitmap;
|
|
import android.graphics.BitmapFactory;
|
|
import android.media.MediaMetadataRetriever;
|
|
import android.net.Uri;
|
|
import android.webkit.URLUtil;
|
|
|
|
import com.facebook.react.bridge.Arguments;
|
|
import com.facebook.react.bridge.ReadableMap;
|
|
import com.facebook.react.bridge.WritableMap;
|
|
import com.mattermost.helpers.RealPathUtil;
|
|
|
|
import java.io.File;
|
|
import java.io.FileOutputStream;
|
|
import java.io.OutputStream;
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.net.URLDecoder;
|
|
import java.util.UUID;
|
|
|
|
public class ShareUtils {
|
|
public static ReadableMap getTextItem(String text) {
|
|
WritableMap map = Arguments.createMap();
|
|
map.putString("value", text);
|
|
map.putString("type", "");
|
|
map.putBoolean("isString", true);
|
|
return map;
|
|
}
|
|
|
|
public static ReadableMap getFileItem(Activity activity, Uri uri) {
|
|
WritableMap map = Arguments.createMap();
|
|
String filePath = RealPathUtil.getRealPathFromURI(activity, uri);
|
|
if (filePath == null) {
|
|
return null;
|
|
}
|
|
|
|
File file = new File(filePath);
|
|
String type = RealPathUtil.getMimeTypeFromUri(activity, uri);
|
|
if (type != null) {
|
|
if (type.startsWith("image/")) {
|
|
BitmapFactory.Options bitMapOption = ShareUtils.getImageDimensions(filePath);
|
|
map.putInt("height", bitMapOption.outHeight);
|
|
map.putInt("width", bitMapOption.outWidth);
|
|
|
|
} else if (type.startsWith("video/")) {
|
|
File cacheDir = new File(activity.getCacheDir(), RealPathUtil.CACHE_DIR_NAME);
|
|
addVideoThumbnailToMap(cacheDir, activity.getApplicationContext(), map, "file://" + filePath);
|
|
}
|
|
} else {
|
|
type = "application/octet-stream";
|
|
}
|
|
|
|
map.putString("value", "file://" + filePath);
|
|
map.putDouble("size", (double) file.length());
|
|
map.putString("filename", file.getName());
|
|
map.putString("type", type);
|
|
map.putString("extension", RealPathUtil.getExtension(filePath).replaceFirst(".", ""));
|
|
map.putBoolean("isString", false);
|
|
return map;
|
|
}
|
|
|
|
public static BitmapFactory.Options getImageDimensions(String filePath) {
|
|
BitmapFactory.Options bitMapOption = new BitmapFactory.Options();
|
|
bitMapOption.inJustDecodeBounds=true;
|
|
BitmapFactory.decodeFile(filePath, bitMapOption);
|
|
return bitMapOption;
|
|
}
|
|
|
|
private static void addVideoThumbnailToMap(File cacheDir, Context context, WritableMap map, String filePath) {
|
|
String fileName = ("thumb-" + UUID.randomUUID().toString()) + ".png";
|
|
OutputStream fOut = null;
|
|
|
|
try {
|
|
File file = new File(cacheDir, fileName);
|
|
Bitmap image = getBitmapAtTime(context, filePath, 1);
|
|
if (file.createNewFile()) {
|
|
fOut = new FileOutputStream(file);
|
|
image.compress(Bitmap.CompressFormat.PNG, 100, fOut);
|
|
fOut.flush();
|
|
fOut.close();
|
|
|
|
map.putString("videoThumb", "file://" + file.getAbsolutePath());
|
|
map.putInt("width", image.getWidth());
|
|
map.putInt("height", image.getHeight());
|
|
}
|
|
} catch (Exception ignored) {
|
|
}
|
|
}
|
|
|
|
private static Bitmap getBitmapAtTime(Context context, String filePath, int time) {
|
|
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
|
|
if (URLUtil.isFileUrl(filePath)) {
|
|
String decodedPath;
|
|
try {
|
|
decodedPath = URLDecoder.decode(filePath, "UTF-8");
|
|
} catch (UnsupportedEncodingException e) {
|
|
decodedPath = filePath;
|
|
}
|
|
|
|
retriever.setDataSource(decodedPath.replace("file://", ""));
|
|
} else if (filePath.contains("content://")) {
|
|
retriever.setDataSource(context, Uri.parse(filePath));
|
|
}
|
|
|
|
Bitmap image = retriever.getFrameAtTime(time * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
|
|
retriever.release();
|
|
return image;
|
|
}
|
|
}
|