mirror of
https://github.com/ArcaneChat/android.git
synced 2026-07-03 14:05:24 +02:00
362 lines
14 KiB
Java
362 lines
14 KiB
Java
/*******************************************************************************
|
|
*
|
|
* Delta Chat Android
|
|
* (C) 2013-2016 Nikolai Kudashov
|
|
* (C) 2017 Björn Petersen
|
|
* Contact: r10s@b44t.com, http://b44t.com
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify it under
|
|
* the terms of the GNU General Public License as published by the Free Software
|
|
* Foundation, either version 3 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see http://www.gnu.org/licenses/ .
|
|
*
|
|
******************************************************************************/
|
|
|
|
|
|
package com.b44t.messenger;
|
|
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.LinkedList;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.Semaphore;
|
|
|
|
public class FileLoader {
|
|
|
|
public static final int MEDIA_DIR_IMAGE = 0;
|
|
public static final int MEDIA_DIR_AUDIO = 1;
|
|
public static final int MEDIA_DIR_VIDEO = 2;
|
|
public static final int MEDIA_DIR_DOCUMENT = 3;
|
|
public static final int MEDIA_DIR_CACHE = 4;
|
|
|
|
private HashMap<Integer, File> mediaDirs = null;
|
|
|
|
private static volatile FileLoader Instance = null;
|
|
|
|
public static FileLoader getInstance() {
|
|
FileLoader localInstance = Instance;
|
|
if (localInstance == null) {
|
|
synchronized (FileLoader.class) {
|
|
localInstance = Instance;
|
|
if (localInstance == null) {
|
|
Instance = localInstance = new FileLoader();
|
|
}
|
|
}
|
|
}
|
|
return localInstance;
|
|
}
|
|
|
|
public void setMediaDirs(HashMap<Integer, File> dirs) {
|
|
mediaDirs = dirs;
|
|
}
|
|
|
|
public File getDirectory(int type) { // always returns the cache directory as this is the only one set in mediaDirs[] - we do not use the other directories at the moment
|
|
File dir = mediaDirs.get(type);
|
|
if (dir == null && type != MEDIA_DIR_CACHE) {
|
|
dir = mediaDirs.get(MEDIA_DIR_CACHE);
|
|
}
|
|
try {
|
|
if (!dir.isDirectory()) {
|
|
dir.mkdirs();
|
|
}
|
|
} catch (Exception e) {
|
|
//don't promt
|
|
}
|
|
return dir;
|
|
}
|
|
|
|
public boolean isLoadingFile(final String fileName) {
|
|
return false;
|
|
}
|
|
|
|
public static String getMessageFileName(TLRPC.Message message) {
|
|
if (message == null) {
|
|
return "";
|
|
}
|
|
/*if (message instanceof TLRPC.TL_messageService) {
|
|
if (message.action.photo != null) {
|
|
ArrayList<TLRPC.PhotoSize> sizes = message.action.photo.sizes;
|
|
if (sizes.size() > 0) {
|
|
TLRPC.PhotoSize sizeFull = getClosestPhotoSizeWithSize(sizes, AndroidUtilities.getPhotoSize());
|
|
if (sizeFull != null) {
|
|
return getAttachFileName(sizeFull);
|
|
}
|
|
}
|
|
}
|
|
} else*/ {
|
|
if (message.media instanceof TLRPC.TL_messageMediaDocument) {
|
|
return getAttachFileName(message.media.document);
|
|
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
|
|
ArrayList<TLRPC.PhotoSize> sizes = message.media.photo.sizes;
|
|
if (sizes.size() > 0) {
|
|
TLRPC.PhotoSize sizeFull = getClosestPhotoSizeWithSize(sizes, AndroidUtilities.getPhotoSize());
|
|
if (sizeFull != null) {
|
|
return getAttachFileName(sizeFull);
|
|
}
|
|
}
|
|
} /*else if (message.media instanceof TLRPC.TL_messageMediaWebPage) {
|
|
if (message.media.webpage.photo != null) {
|
|
ArrayList<TLRPC.PhotoSize> sizes = message.media.webpage.photo.sizes;
|
|
if (sizes.size() > 0) {
|
|
TLRPC.PhotoSize sizeFull = getClosestPhotoSizeWithSize(sizes, AndroidUtilities.getPhotoSize());
|
|
if (sizeFull != null) {
|
|
return getAttachFileName(sizeFull);
|
|
}
|
|
}
|
|
} else if (message.media.webpage.document != null) {
|
|
return getAttachFileName(message.media.webpage.document);
|
|
}
|
|
}*/
|
|
}
|
|
return "";
|
|
}
|
|
|
|
public static File getPathToMessage(TLRPC.Message message) {
|
|
if (message == null) {
|
|
return new File("");
|
|
}
|
|
/*if (message instanceof TLRPC.TL_messageService) {
|
|
if (message.action.photo != null) {
|
|
ArrayList<TLRPC.PhotoSize> sizes = message.action.photo.sizes;
|
|
if (sizes.size() > 0) {
|
|
TLRPC.PhotoSize sizeFull = getClosestPhotoSizeWithSize(sizes, AndroidUtilities.getPhotoSize());
|
|
if (sizeFull != null) {
|
|
return getPathToAttach(sizeFull);
|
|
}
|
|
}
|
|
}
|
|
} else*/ {
|
|
if (message.media instanceof TLRPC.TL_messageMediaDocument) {
|
|
return getPathToAttach(message.media.document);
|
|
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto) {
|
|
ArrayList<TLRPC.PhotoSize> sizes = message.media.photo.sizes;
|
|
if (sizes.size() > 0) {
|
|
TLRPC.PhotoSize sizeFull = getClosestPhotoSizeWithSize(sizes, AndroidUtilities.getPhotoSize());
|
|
if (sizeFull != null) {
|
|
return getPathToAttach(sizeFull);
|
|
}
|
|
}
|
|
} /*else if (message.media instanceof TLRPC.TL_messageMediaWebPage) {
|
|
if (message.media.webpage.document != null) {
|
|
return getPathToAttach(message.media.webpage.document);
|
|
} else if (message.media.webpage.photo != null) {
|
|
ArrayList<TLRPC.PhotoSize> sizes = message.media.webpage.photo.sizes;
|
|
if (sizes.size() > 0) {
|
|
TLRPC.PhotoSize sizeFull = getClosestPhotoSizeWithSize(sizes, AndroidUtilities.getPhotoSize());
|
|
if (sizeFull != null) {
|
|
return getPathToAttach(sizeFull);
|
|
}
|
|
}
|
|
}
|
|
}*/
|
|
}
|
|
return new File("");
|
|
}
|
|
|
|
public static File getPathToAttach(TLObject attach) {
|
|
return getPathToAttach(attach, null, false);
|
|
}
|
|
|
|
public static File getPathToAttach(TLObject attach, boolean forceCache) {
|
|
return getPathToAttach(attach, null, forceCache);
|
|
}
|
|
|
|
public static File getPathToAttach(TLObject attach, String ext, boolean forceCache) {
|
|
File dir = null;
|
|
String mr_path = null;
|
|
if (forceCache) {
|
|
dir = getInstance().getDirectory(MEDIA_DIR_CACHE);
|
|
} else {
|
|
if (attach instanceof TLRPC.Document) {
|
|
TLRPC.Document document = (TLRPC.Document) attach;
|
|
if( document.mr_path!=null ) {
|
|
mr_path = document.mr_path;
|
|
}
|
|
else if (document.key != null) {
|
|
dir = getInstance().getDirectory(MEDIA_DIR_CACHE);
|
|
} else {
|
|
if (MessageObject.isVoiceDocument(document)) {
|
|
dir = getInstance().getDirectory(MEDIA_DIR_AUDIO);
|
|
} else if (MessageObject.isVideoDocument(document)) {
|
|
dir = getInstance().getDirectory(MEDIA_DIR_VIDEO);
|
|
} else {
|
|
dir = getInstance().getDirectory(MEDIA_DIR_DOCUMENT);
|
|
}
|
|
}
|
|
} else if (attach instanceof TLRPC.PhotoSize) {
|
|
TLRPC.PhotoSize photoSize = (TLRPC.PhotoSize) attach;
|
|
if( photoSize.location != null && photoSize.location.mr_path != null ) {
|
|
mr_path = photoSize.location.mr_path;
|
|
}
|
|
else if (photoSize.location == null || photoSize.location.key != null || photoSize.location.volume_id == Integer.MIN_VALUE && photoSize.location.local_id < 0 || photoSize.size < 0) {
|
|
dir = getInstance().getDirectory(MEDIA_DIR_CACHE);
|
|
} else {
|
|
dir = getInstance().getDirectory(MEDIA_DIR_IMAGE);
|
|
}
|
|
} else if (attach instanceof TLRPC.FileLocation) {
|
|
TLRPC.FileLocation fileLocation = (TLRPC.FileLocation) attach;
|
|
if (fileLocation.key != null || fileLocation.volume_id == Integer.MIN_VALUE && fileLocation.local_id < 0) {
|
|
dir = getInstance().getDirectory(MEDIA_DIR_CACHE);
|
|
} else {
|
|
dir = getInstance().getDirectory(MEDIA_DIR_IMAGE);
|
|
}
|
|
}
|
|
}
|
|
|
|
File f = null;
|
|
if( mr_path!=null ) {
|
|
try {
|
|
f = new File(mr_path);
|
|
}
|
|
catch (Exception e) {
|
|
|
|
}
|
|
}
|
|
else if (dir == null) {
|
|
f = new File("");
|
|
}
|
|
else {
|
|
f = new File(dir, getAttachFileName(attach, ext));
|
|
}
|
|
|
|
return f;
|
|
}
|
|
|
|
public static TLRPC.PhotoSize getClosestPhotoSizeWithSize(ArrayList<TLRPC.PhotoSize> sizes, int side) {
|
|
return getClosestPhotoSizeWithSize(sizes, side, false);
|
|
}
|
|
|
|
public static TLRPC.PhotoSize getClosestPhotoSizeWithSize(ArrayList<TLRPC.PhotoSize> sizes, int side, boolean byMinSide) {
|
|
if (sizes == null || sizes.isEmpty()) {
|
|
return null;
|
|
}
|
|
int lastSide = 0;
|
|
TLRPC.PhotoSize closestObject = null;
|
|
for (int a = 0; a < sizes.size(); a++) {
|
|
TLRPC.PhotoSize obj = sizes.get(a);
|
|
if (obj == null) {
|
|
continue;
|
|
}
|
|
if (byMinSide) {
|
|
int currentSide = obj.h >= obj.w ? obj.w : obj.h;
|
|
if (closestObject == null || side > 100 && closestObject.location != null && closestObject.location.dc_id == Integer.MIN_VALUE || obj instanceof TLRPC.TL_photoCachedSize || side > lastSide && lastSide < currentSide) {
|
|
closestObject = obj;
|
|
lastSide = currentSide;
|
|
}
|
|
} else {
|
|
int currentSide = obj.w >= obj.h ? obj.w : obj.h;
|
|
if (closestObject == null || side > 100 && closestObject.location != null && closestObject.location.dc_id == Integer.MIN_VALUE || obj instanceof TLRPC.TL_photoCachedSize || currentSide <= side && lastSide < currentSide) {
|
|
closestObject = obj;
|
|
lastSide = currentSide;
|
|
}
|
|
}
|
|
}
|
|
return closestObject;
|
|
}
|
|
|
|
public static String getFileExtension(File file) {
|
|
String name = file.getName();
|
|
try {
|
|
return name.substring(name.lastIndexOf('.') + 1);
|
|
} catch (Exception e) {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
public static String getDocumentFileName(TLRPC.Document document) {
|
|
if (document != null) {
|
|
if (document.file_name != null) {
|
|
return document.file_name;
|
|
}
|
|
for (int a = 0; a < document.attributes.size(); a++) {
|
|
TLRPC.DocumentAttribute documentAttribute = document.attributes.get(a);
|
|
if (documentAttribute instanceof TLRPC.TL_documentAttributeFilename) {
|
|
return documentAttribute.file_name;
|
|
}
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
public static String getDocumentExtension(TLRPC.Document document) {
|
|
String fileName = getDocumentFileName(document);
|
|
int idx = fileName.lastIndexOf('.');
|
|
String ext = null;
|
|
if (idx != -1) {
|
|
ext = fileName.substring(idx + 1);
|
|
}
|
|
if (ext == null || ext.length() == 0) {
|
|
ext = document.mime_type;
|
|
}
|
|
if (ext == null) {
|
|
ext = "";
|
|
}
|
|
ext = ext.toUpperCase();
|
|
return ext;
|
|
}
|
|
|
|
public static String getAttachFileName(TLObject attach) {
|
|
return getAttachFileName(attach, null);
|
|
}
|
|
|
|
public static String getAttachFileName(TLObject attach, String ext) {
|
|
if (attach instanceof TLRPC.Document) {
|
|
TLRPC.Document document = (TLRPC.Document) attach;
|
|
String docExt = null;
|
|
if (docExt == null) {
|
|
docExt = getDocumentFileName(document);
|
|
int idx;
|
|
if (docExt == null || (idx = docExt.lastIndexOf('.')) == -1) {
|
|
docExt = "";
|
|
} else {
|
|
docExt = docExt.substring(idx);
|
|
}
|
|
}
|
|
if (docExt.length() <= 1) {
|
|
if (document.mime_type != null) {
|
|
switch (document.mime_type) {
|
|
case "video/mp4":
|
|
docExt = ".mp4";
|
|
break;
|
|
case "audio/ogg":
|
|
docExt = ".ogg";
|
|
break;
|
|
default:
|
|
docExt = "";
|
|
break;
|
|
}
|
|
} else {
|
|
docExt = "";
|
|
}
|
|
}
|
|
if (docExt.length() > 1) {
|
|
return document.dc_id + "_" + document.id + docExt;
|
|
} else {
|
|
return document.dc_id + "_" + document.id;
|
|
}
|
|
} else if (attach instanceof TLRPC.PhotoSize) {
|
|
TLRPC.PhotoSize photo = (TLRPC.PhotoSize) attach;
|
|
if (photo.location == null || photo.location instanceof TLRPC.TL_fileLocationUnavailable) {
|
|
return "";
|
|
}
|
|
return photo.location.volume_id + "_" + photo.location.local_id + "." + (ext != null ? ext : "jpg");
|
|
} else if (attach instanceof TLRPC.FileLocation) {
|
|
if (attach instanceof TLRPC.TL_fileLocationUnavailable) {
|
|
return "";
|
|
}
|
|
TLRPC.FileLocation location = (TLRPC.FileLocation) attach;
|
|
return location.volume_id + "_" + location.local_id + "." + (ext != null ? ext : "jpg");
|
|
}
|
|
return "";
|
|
}
|
|
}
|