Skip to content

Instantly share code, notes, and snippets.

@melikeeroglu
Created December 29, 2020 08:03
Show Gist options
  • Save melikeeroglu/c616f0efef041ad5090441b6e9027f3e to your computer and use it in GitHub Desktop.
Save melikeeroglu/c616f0efef041ad5090441b6e9027f3e to your computer and use it in GitHub Desktop.
DriveManager
using HuaweiMobileServices.Drive;
using HuaweiMobileServices.Id;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Android;
using UnityEngine.UI;
public class DriveManager : MonoBehaviour, DriveCredential.AccessMethod
{
public string accessToken;
public DriveCredential mCredential;
public HuaweiMobileServices.Drive.File fileUploaded;
InputField downloadFileName;
public String unionId;
DriveManager Drive;
private static readonly int DIRECT_DOWNLOAD_MAX_SIZE = 20 * 1024 * 1024;
private static Dictionary<String, String> MIME_TYPE_MAP = new Dictionary<String, String>();
GameObject dialog = null;
// Start is called before the first frame update
void Start()
{
initMimeType();
Drive = new DriveManager();
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken;
Debug.Log("Token" + HuaweiIdAuthManager.AuthResult.IdToken);
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken;
unionId = HuaweiIdAuthManager.AuthResult.UnionId;
int returnCode = Init(unionId, accessToken, () => HuaweiIdAuthManager.AuthResult.AccessToken);
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
{
Permission.RequestUserPermission(Permission.ExternalStorageWrite);
dialog = new GameObject();
}
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead))
{
Permission.RequestUserPermission(Permission.ExternalStorageRead);
dialog = new GameObject();
}
}
public void UploadFile()
{
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken;
unionId = HuaweiIdAuthManager.AuthResult.UnionId;
DriveCredential.Builder builder = new DriveCredential.Builder(unionId, refreshToken);
mCredential = builder.Build().SetAccessToken(accessToken);
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("getImageInputStreamFromGallery", new DriveListener(this));
}
// Update is called once per frame
void Update()
{
}
public void CreateDir()
{
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken;
unionId = HuaweiIdAuthManager.AuthResult.UnionId;
DriveCredential.Builder builder = new DriveCredential.Builder(unionId, refreshToken);
mCredential = builder.Build().SetAccessToken(accessToken);
CreateDirectory();
}
public void DownloadFile()
{
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken;
unionId = HuaweiIdAuthManager.AuthResult.UnionId;
DriveCredential.Builder builder = new DriveCredential.Builder(unionId, refreshToken);
mCredential = builder.Build().SetAccessToken(accessToken);
downloadFileName = GameObject.Find("downloadFileName").GetComponent<InputField>();
DownLoadFile(downloadFileName.text);
}
//private static readonly int DIRECT_UPLOAD_MAX_SIZE = 20 * 1024 * 1024;
//nonresumable
public void CreateFile(AndroidJavaObject javaObject,String mimeType, int inputStreamLength)
{
try
{
InputStreamContent streamContent = new InputStreamContent(mimeType, javaObject);
AndroidJavaClass a = new AndroidJavaClass("java.util.Collections");
AndroidJavaObject parentFolder = new AndroidJavaObject("java.lang.String","");
String time = DateTime.Now.ToString("yyyyMMddHHmmss");
String fileName = time + MimeType(mimeType);
Debug.Log("datetime" + fileName);
streamContent.SetLength(inputStreamLength);
HuaweiMobileServices.Drive.File content = new HuaweiMobileServices.Drive.File()
.SetFileName(fileName)
.SetParentFolder(a.CallStatic<AndroidJavaObject>("singletonList", parentFolder));
Drive drive = BuildDrive();
Drive.Files.Create request = drive.files().create(content, streamContent);
MediaHttpUploader uploader = request.GetMediaHttpUploader();
uploader.SetDirectUploadEnabled(true);
content = request.Execute();
ShowTips("File Uploaded Successfully");
}
catch (Exception e)
{
Debug.Log("createFile exception: " + e.ToString());
ShowTips("File Upload Failed");
}
}
private HuaweiMobileServices.Drive.File fileSearched;
private void DownLoadFile(String searchFileName)
{
try
{
if (searchFileName == null)
{
Debug.Log("DriveDownload"+ "executeFilesGet error, need to create file.");
return;
}
String imagePath = "/storage/emulated/0/DCIM/Camera/";
Drive drive = BuildDrive();
String containers = "";
String queryFile = "fileName = '" + searchFileName + "' and mimeType != 'application/vnd.huawei-apps.folder'";
FileList files;
Drive.Files.List request1 = drive.files().list();
while (true)
{
files = request1
.SetQueryParam(queryFile)
//.SetPageSize(10)
.SetOrderBy("fileName")
.SetFields("category,nextCursor,files(id,fileName,size)")
.SetContainers(containers)
.Execute();
if (files == null || files.GetFiles().Count() > 0)
{
break;
}
if (!IsNullOrEmpty(files.GetNextCursor()))
{
request1.SetCursor(files.GetNextCursor());
}
else
{
break;
}
}
String text = "";
if (files != null && files.GetFiles().Count > 0)
{
fileSearched = files.GetFiles()[0];
text = searchFileName;
}
else
{
text = "empty";
}
// Obtain file metadata.
Drive.Files.Get request = drive.files().get(fileSearched.GetId());
request.SetFields("id,size");
HuaweiMobileServices.Drive.File res = request.Execute();
// Download a file.
AndroidJavaObject javaObject = res.GetSize();
long size = javaObject.Call<long>("longValue");
Drive.Files.Get get = drive.files().get(fileSearched.GetId());
get.SetForm("media");
MediaHttpDownloader downloader = get.GetMediaHttpDownloader();
bool isDirectDownload = false;
if (size < DIRECT_DOWNLOAD_MAX_SIZE)
{
isDirectDownload = true;
}
downloader.SetContentRange(0, size - 1).SetDirectDownloadEnabled(isDirectDownload);
// String time = DateTime.Now.ToString("yyyyMMddHHmmss");
String fileName = /*time+".jpg"*/searchFileName;
AndroidJavaObject f = new AndroidJavaObject("java.io.File", imagePath + fileName);
AndroidJavaObject fileOutputStream = new AndroidJavaObject("java.io.FileOutputStream", f);
get.ExecuteContentAndDownloadTo(fileOutputStream);
ShowTips("File Downloaded Successfully");
} catch (Exception e) {
Debug.Log("executeFilesGet exception: " + e.ToString());
ShowTips("File Download Failed");
}
}
private HuaweiMobileServices.Drive.File CreateDirectory()
{
HuaweiMobileServices.Drive.File directory = null;
try
{
Drive drive = BuildDrive();
Dictionary<String, String> appProperties = new Dictionary<String,String>();
appProperties.Add("appProperties", "property");
String dirName = DateTime.Now.ToString("yyyyMMdd");
HuaweiMobileServices.Drive.File file = new HuaweiMobileServices.Drive.File();
file.SetFileName(dirName)
.SetMimeType("application/vnd.huawei-apps.folder");
HuaweiMobileServices.Drive.Drive.Files.Create c = drive.files().create(file);
directory = c.Execute();
ShowTips("Directory Created");
}
catch (Exception e)
{
Debug.Log( "createDirectory error: " + e.ToString());
ShowTips("Directory can not created");
}
return directory;
}
private void ShowTips(string toastText)
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject unityActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
if (unityActivity != null)
{
AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
unityActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
{
AndroidJavaObject toastObject = toastClass.CallStatic<AndroidJavaObject>("makeText", unityActivity, toastText, 0);
toastObject.Call("show");
}));
}
}
private Drive BuildDrive()
{
Drive.Builder builder = new Drive.Builder(mCredential);
Drive service = builder.Build();
return service;
}
//TODO: create DriveCode class
public int Init(String unionID, String at, Func<String> refreshToken )
{
if (IsNullOrEmpty(unionID) || IsNullOrEmpty(at))
{
return /*DriveCode.ERROR*/900150001;
}
Debug.Log("unionID" + unionID);
DriveCredential.Builder builder = new DriveCredential.Builder(unionID, refreshToken);
mCredential = builder.Build().SetAccessToken(at);
return /*DriveCode.SUCCESS*/0;
}
private String MimeType(String fileSuffix)
{
if (MIME_TYPE_MAP.ContainsKey(fileSuffix))
{
Debug.Log("filenullor123" + MIME_TYPE_MAP[fileSuffix]);
return MIME_TYPE_MAP[fileSuffix];
}
else
return "*/*";
}
public static bool IsNullOrEmpty(String var0)
{
return var0 == null || var0.Length == 0;
}
public string refreshToken()
{
return accessToken;
}
public void initMimeType()
{
MIME_TYPE_MAP.Add(".3gp", "video/3gpp");
MIME_TYPE_MAP.Add(".apk", "application/vnd.android.package-archive");
MIME_TYPE_MAP.Add(".asf", "video/x-ms-asf");
MIME_TYPE_MAP.Add(".avi", "video/x-msvideo");
MIME_TYPE_MAP.Add(".bin", "application/octet-stream");
MIME_TYPE_MAP.Add(".bmp", "image/bmp");
MIME_TYPE_MAP.Add(".c", "text/plain");
MIME_TYPE_MAP.Add(".class", "application/octet-stream");
MIME_TYPE_MAP.Add(".conf", "text/plain");
MIME_TYPE_MAP.Add(".cpp", "text/plain");
MIME_TYPE_MAP.Add(".doc", "application/msword");
MIME_TYPE_MAP.Add(".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
MIME_TYPE_MAP.Add(".xls", "application/vnd.ms-excel");
MIME_TYPE_MAP.Add(".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
MIME_TYPE_MAP.Add(".exe", "application/octet-stream");
MIME_TYPE_MAP.Add(".gif", "image/gif");
MIME_TYPE_MAP.Add(".gtar", "application/x-gtar");
MIME_TYPE_MAP.Add(".gz", "application/x-gzip");
MIME_TYPE_MAP.Add(".h", "text/plain");
MIME_TYPE_MAP.Add(".htm", "text/html");
MIME_TYPE_MAP.Add(".html", "text/html");
MIME_TYPE_MAP.Add(".jar", "application/java-archive");
MIME_TYPE_MAP.Add(".java", "text/plain");
MIME_TYPE_MAP.Add(".jpeg", "image/jpeg");
MIME_TYPE_MAP.Add("image/jpeg", ".jpg");
MIME_TYPE_MAP.Add(".js", "application/x-javascript");
MIME_TYPE_MAP.Add(".log", "text/plain");
MIME_TYPE_MAP.Add(".m3u", "audio/x-mpegurl");
MIME_TYPE_MAP.Add(".m4a", "audio/mp4a-latm");
MIME_TYPE_MAP.Add(".m4b", "audio/mp4a-latm");
MIME_TYPE_MAP.Add(".m4p", "audio/mp4a-latm");
MIME_TYPE_MAP.Add(".m4u", "video/vnd.mpegurl");
MIME_TYPE_MAP.Add(".m4v", "video/x-m4v");
MIME_TYPE_MAP.Add(".mov", "video/quicktime");
MIME_TYPE_MAP.Add(".mp2", "audio/x-mpeg");
MIME_TYPE_MAP.Add(".mp3", "audio/x-mpeg");
MIME_TYPE_MAP.Add(".mp4", "video/mp4");
MIME_TYPE_MAP.Add(".mpc", "application/vnd.mpohun.certificate");
MIME_TYPE_MAP.Add(".mpe", "video/mpeg");
MIME_TYPE_MAP.Add(".mpeg", "video/mpeg");
MIME_TYPE_MAP.Add(".mpg", "video/mpeg");
MIME_TYPE_MAP.Add(".mpg4", "video/mp4");
MIME_TYPE_MAP.Add(".mpga", "audio/mpeg");
MIME_TYPE_MAP.Add(".msg", "application/vnd.ms-outlook");
MIME_TYPE_MAP.Add(".ogg", "audio/ogg");
MIME_TYPE_MAP.Add(".pdf", "application/pdf");
MIME_TYPE_MAP.Add(".png", "image/png");
MIME_TYPE_MAP.Add(".pps", "application/vnd.ms-powerpoint");
MIME_TYPE_MAP.Add(".ppt", "application/vnd.ms-powerpoint");
MIME_TYPE_MAP.Add(".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
MIME_TYPE_MAP.Add(".prop", "text/plain");
MIME_TYPE_MAP.Add(".rc", "text/plain");
MIME_TYPE_MAP.Add(".rmvb", "audio/x-pn-realaudio");
MIME_TYPE_MAP.Add(".rtf", "application/rtf");
MIME_TYPE_MAP.Add(".sh", "text/plain");
MIME_TYPE_MAP.Add(".tar", "application/x-tar");
MIME_TYPE_MAP.Add(".tgz", "application/x-compressed");
MIME_TYPE_MAP.Add(".txt", "text/plain");
MIME_TYPE_MAP.Add(".wav", "audio/x-wav");
MIME_TYPE_MAP.Add(".wma", "audio/x-ms-wma");
MIME_TYPE_MAP.Add(".wmv", "audio/x-ms-wmv");
MIME_TYPE_MAP.Add(".wps", "application/vnd.ms-works");
MIME_TYPE_MAP.Add(".xml", "text/plain");
MIME_TYPE_MAP.Add(".z", "application/x-compress");
MIME_TYPE_MAP.Add(".zip", "application/x-zip-compressed");
}
public class DriveListener : AndroidJavaProxy
{
DriveManager d;
public DriveListener(DriveManager driveManager) : base("com.melike.drive.huawei.HmsDriveActivity$GalleryListener") {
d = driveManager;
}
public void getGalleryUri(AndroidJavaObject javaObject, String mimeType, int size)
{
AndroidJavaObject thread = new AndroidJavaObject("java.lang.Thread", new DriveBackTask(d, javaObject, mimeType,size));
thread.Call("start");
}
}
public class DriveBackTask : AndroidJavaProxy
{
DriveManager driveListener;
AndroidJavaObject javaObject1;
String mimeType;
int size;
public DriveBackTask (DriveManager listener, AndroidJavaObject javaObject, String mimeType, int size) : base("java.lang.Runnable") {
driveListener = listener;
javaObject1 = javaObject;
this.mimeType = mimeType;
this.size = size;
}
public void run()
{
driveListener.CreateFile(javaObject1, mimeType, size);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment