Commit 1f82cfb41fbc298f3fdac12701de9e8086121bfd

Authored by Thiago Filipe Soares da Rocha
1 parent 1cd22e49

Finish Handle Download

Assets/Scenes/Main.unity
... ... @@ -811,7 +811,7 @@ RectTransform:
811 811 m_AnchorMin: {x: 0, y: 1.7}
812 812 m_AnchorMax: {x: 0.97, y: 2.2}
813 813 m_AnchoredPosition: {x: 0, y: 0}
814   - m_SizeDelta: {x: 0, y: 0}
  814 + m_SizeDelta: {x: -239.8714, y: 0}
815 815 m_Pivot: {x: 1, y: 0}
816 816 --- !u!114 &160532053
817 817 MonoBehaviour:
... ... @@ -3963,7 +3963,7 @@ RectTransform:
3963 3963 m_AnchorMin: {x: 0, y: 1.7}
3964 3964 m_AnchorMax: {x: 0.97, y: 2.2}
3965 3965 m_AnchoredPosition: {x: 0, y: 0}
3966   - m_SizeDelta: {x: 0, y: 0}
  3966 + m_SizeDelta: {x: -239.8714, y: 0}
3967 3967 m_Pivot: {x: 1, y: 0}
3968 3968 --- !u!114 &581668678
3969 3969 MonoBehaviour:
... ... @@ -7238,13 +7238,12 @@ RectTransform:
7238 7238 m_AnchorMin: {x: 0, y: 1.7}
7239 7239 m_AnchorMax: {x: 0.97, y: 2.2}
7240 7240 m_AnchoredPosition: {x: 0, y: 0}
7241   - m_SizeDelta: {x: 0, y: 0}
  7241 + m_SizeDelta: {x: -239.8714, y: 0}
7242 7242 m_Pivot: {x: 1, y: 0}
7243 7243 --- !u!114 &1059619784
7244 7244 MonoBehaviour:
7245 7245 m_ObjectHideFlags: 0
7246   - m_PrefabParentObject: {fileID: 11431640, guid: 5ccb0ba277304a14b9bb8d4e34161675,
7247   - type: 2}
  7246 + m_PrefabParentObject: {fileID: 0}
7248 7247 m_PrefabInternal: {fileID: 0}
7249 7248 m_GameObject: {fileID: 1059619782}
7250 7249 m_Enabled: 1
... ... @@ -7253,7 +7252,7 @@ MonoBehaviour:
7253 7252 m_Name:
7254 7253 m_EditorClassIdentifier:
7255 7254 m_Navigation:
7256   - m_Mode: 0
  7255 + m_Mode: 3
7257 7256 m_SelectOnUp: {fileID: 0}
7258 7257 m_SelectOnDown: {fileID: 0}
7259 7258 m_SelectOnLeft: {fileID: 0}
... ...
Assets/Scripts/Export Video/ExportLayers.cs
... ... @@ -11,6 +11,7 @@ public class ExportLayers{
11 11 Share_Layer,
12 12 Progress_Download_Layer,
13 13 OnLockExport,
  14 + OnLockShare,
14 15 All
15 16 }
16 17  
... ... @@ -19,6 +20,7 @@ public class ExportLayers{
19 20 INTERNET_CONNECTION_FAILURE,
20 21 DOWNLOAD_CONNECTION_FAILURE,
21 22 CONNECTION_TIMEOUT_FAILURE,
22   - ERROR_CONNECTION_FAILURE
  23 + ERROR_CONNECTION_FAILURE,
  24 + DEFAULT
23 25 }
24 26 }
... ...
Assets/Scripts/Export Video/ExportVideo.cs
... ... @@ -34,14 +34,9 @@ public class ExportVideo : MonoBehaviour {
34 34  
35 35 private const string SERVER_URL = "http://150.165.205.57/video/";
36 36  
37   - /*Strings to Compare glosses*/
38   - private static string gloss = "Gloss";
39   - private string currentGloss = "CurrentGloss";
40   -
41   - /* Sharing Current Time - Video Name*/
42   - private string currentTime = "";
43   -
44 37  
  38 + private static string gloss = "Gloss";
  39 +
45 40  
46 41 /* Strings related to the Android Dialog*/
47 42 private string title = "Download";
... ... @@ -101,15 +96,12 @@ public class ExportVideo : MonoBehaviour {
101 96  
102 97 public void onDownloadClick()
103 98 {
104   - MobileNativeDialog nativeDialog;
105   -
106   -
  99 + MobileNativeDialog nativeDialog;
107 100  
108 101 nativeDialog = new MobileNativeDialog(title, message + ((videoSize/1024f)/1024f).ToString("0.00") + " MB.", yesOp, noOp);
109 102 nativeDialog.OnComplete = OnComplete;
110 103  
111   - }
112   -
  104 + }
113 105  
114 106 /** Delegate function which waits for YES or NO from the MobileDialog
115 107 * and attach a action to each option**/
... ... @@ -165,33 +157,19 @@ public class ExportVideo : MonoBehaviour {
165 157  
166 158 public void OnShareVideo()
167 159 {
168   - PlayerLogger.Log("ExportVideo", "OnShareVideo", "Sharing Video...");
169   -
170   - if (gloss == currentGloss) //Checking if user is trying to share the same animation
171   - {
172   - Share();
173   - }
174   - else
175   - {
176   - currentGloss = gloss;
177   - currentTime = System.DateTime.Now.ToString("dd_MM_yyyy_HH_mm_ss");
178   - Share();
179   - }
180   - }
181   -
182   - private void Share()
183   - {
184 160  
185 161 try
186 162 {
187 163 if (videoContent != null)
188 164 {
  165 + Action errorAction = () => { screenManager.changeExportStates(ExportLayers.ExportLayer.All, true);
  166 + new AndroidToast().showToast("Erro ao compartilhar mídia."); };
189 167  
190   - MediaShareAndroid.ShareActivity(videoContent, bytes, currentTime);
  168 + StartCoroutine(MediaShareAndroid.ShareIntent(errorAction));
191 169 }
192 170 else
193 171 {
194   - new AndroidToast().showToast("Erro ao compartilhar vídeo");
  172 + new AndroidToast().showToast("Erro ao compartilhar mídia.");
195 173 screenManager.changeExportStates(ExportLayers.ExportLayer.All, true);
196 174 }
197 175 }
... ... @@ -235,24 +213,25 @@ public class ExportVideo : MonoBehaviour {
235 213 }
236 214 else if (videoInfoRequest.responseHeaders.Count == 0)
237 215 {
  216 + screenManager.changeExportStates(ExportLayers.ExportLayer.All, true);
238 217 PlayerLogger.Log("ExportVideo", "requestVideoInfo", "(WWW) Unsucessful Answer");
239 218 GetConnectionStatusError(ExportLayers.ConnectionStatusError.ERROR_CONNECTION_FAILURE);
240   - screenManager.changeExportStates(ExportLayers.ExportLayer.All, true);
  219 +
241 220  
242 221 }
243 222 else if (!videoInfoRequest.responseHeaders["STATUS"].Contains("200"))
244 223 {
245   -
  224 + screenManager.changeExportStates(ExportLayers.ExportLayer.All, true);
246 225 PlayerLogger.Log("ExportVideo", "requestVideoInfo", "Unsuccessful answer (" + videoInfoRequest.responseHeaders["STATUS"] + ").");
247 226 GetConnectionStatusError(ExportLayers.ConnectionStatusError.ERROR_CONNECTION_FAILURE);
248   - screenManager.changeExportStates(ExportLayers.ExportLayer.All, true);
  227 +
249 228  
250 229 }
251 230 else if (String.IsNullOrEmpty(videoInfoRequest.text))
252 231 {
253 232  
254 233 screenManager.changeExportStates(ExportLayers.ExportLayer.All, true);
255   - GetConnectionStatusError(ExportLayers.ConnectionStatusError.ERROR_CONNECTION_FAILURE);
  234 + GetConnectionStatusError(ExportLayers.ConnectionStatusError.DEFAULT);
256 235 PlayerLogger.Log("ExportVideo", "requestVideoInfo", "Empty answer.");
257 236 }
258 237 else
... ... @@ -285,24 +264,49 @@ public class ExportVideo : MonoBehaviour {
285 264 {
286 265 videoDownloadRunning = true;
287 266 WWW DownloadVideo = new WWW(SERVER_URL + videoId);
288   - // WWW DownloadVideo = new WWW("http://caiomcg.com/rural.mp4");
  267 +
289 268 while (!DownloadVideo.isDone)
290 269 {
291 270 screenManager.updateProgressDownloadSprite(DownloadVideo.progress);
  271 +
292 272 yield return null;
293 273 }
294 274  
295 275 try
296 276 {
297   - if (DownloadVideo.bytesDownloaded > 0 && DownloadVideo.bytesDownloaded<=videoSize)
  277 +
  278 + if(DownloadVideo.error != null)
  279 + {
  280 + GetConnectionStatusError(ExportLayers.ConnectionStatusError.INTERNET_CONNECTION_FAILURE);
  281 + ErrorDownloading();
  282 +
  283 + }
  284 + else if(DownloadVideo.responseHeaders.Count == 0)
  285 + {
  286 + GetConnectionStatusError(ExportLayers.ConnectionStatusError.ERROR_CONNECTION_FAILURE);
  287 + ErrorDownloading();
  288 +
  289 + }
  290 + else if (!DownloadVideo.responseHeaders["STATUS"].Contains("200"))
  291 + {
  292 + GetConnectionStatusError(ExportLayers.ConnectionStatusError.ERROR_CONNECTION_FAILURE);
  293 + ErrorDownloading();
  294 +
  295 + }
  296 + else if ( DownloadVideo.bytesDownloaded == videoSize)
298 297 {
299 298 bytes = DownloadVideo.bytesDownloaded;
300 299 videoContent = DownloadVideo.bytes;
301   - OnDownloadFinished();
  300 + Action callBack = () => { OnDownloadFinished(); new AndroidToast().showToast("Vídeo salvo na Galeria."); };
  301 + Action errorWriting = () => { screenManager.changeExportStates(ExportLayers.ExportLayer.All, true); };
  302 + videoDownloadRunning = false;
  303 + StartCoroutine(MediaShareAndroid.WriteOnAndroid(videoContent, bytes, System.DateTime.Now.ToString("dd_MM_yyyy_HH_mm_ss"),callBack,errorWriting));
  304 +
302 305 }
303 306 else
304 307 {
305 308 GetConnectionStatusError(ExportLayers.ConnectionStatusError.DOWNLOAD_CONNECTION_FAILURE);
  309 + ErrorDownloading();
306 310 }
307 311  
308 312  
... ... @@ -313,6 +317,16 @@ public class ExportVideo : MonoBehaviour {
313 317 }
314 318 }
315 319  
  320 + /* In case of error during the video download, the user gets a new chance to download the file, but
  321 + * is also able to start a new fresh animation and export it */
  322 + private void ErrorDownloading()
  323 + {
  324 + screenManager.changeExportStates(ExportLayers.ExportLayer.Progress_Download_Layer, false);
  325 + screenManager.changeExportStates(ExportLayers.ExportLayer.Download_Layer, true);
  326 + screenManager.changeExportStates(ExportLayers.ExportLayer.OnLockExport, false);
  327 + screenManager.changeExportStates(ExportLayers.ExportLayer.OnLockShare, false);
  328 + }
  329 +
316 330 public IEnumerator WaitForResponse(WWW www, Events.RequestSuccess success, Events.RequestError error)
317 331 {
318 332 yield return Methods.WaitForResponse(www, 60*5f, success, error);
... ... @@ -324,6 +338,7 @@ public class ExportVideo : MonoBehaviour {
324 338 yield return WaitForResponse(www, null, null);
325 339 }
326 340  
  341 + /* Error states to show a Toast to user*/
327 342 private static void GetConnectionStatusError(ExportLayers.ConnectionStatusError error)
328 343 {
329 344 switch (error)
... ...
Assets/Scripts/Export Video/MediaShareAndroid.cs
... ... @@ -18,6 +18,7 @@ using UnityEngine;
18 18 using System.Collections;
19 19 using System.IO;
20 20 using System;
  21 +using LAViD.Unity.Utils;
21 22  
22 23  
23 24  
... ... @@ -30,9 +31,10 @@ public class MediaShareAndroid : MonoBehaviour
30 31  
31 32 private string AndroidPath;
32 33  
33   - private string destination = "";
  34 + private static string destination = "";
34 35 private string Vlibras = "DCIM/VLibras";
35   - private string File = "VLibrasVideo_";
  36 + private string Filen = "VLibrasVideo_";
  37 + private static string FilePath = "";
36 38  
37 39 private byte[] videoContent;
38 40 private int bytes;
... ... @@ -45,25 +47,12 @@ public class MediaShareAndroid : MonoBehaviour
45 47  
46 48 /*Makes sure that Vlibras Folder gets created and write the video bytes in it.*/
47 49  
48   - /* Creates the sharing activity and shows the chooser to the user*/
49   -
50   - public void ShareActivity(byte[] videoContent,int bytes, string CurrentTime)
  50 + public IEnumerator WriteOnAndroid(byte[] videoContent, int bytes,string CurrentTime, Action finishWriting, Action errorWriting)
51 51 {
52   -
53 52 #if UNITY_ANDROID
54   -
55   - this.videoContent = videoContent;
56   - this.bytes = bytes;
57   -
58   -
59   - StartCoroutine(WriteOnAndroid(File + CurrentTime + ".mp4"));
60   -
61   -#endif
62   - }
63   -
64   - private IEnumerator WriteOnAndroid(string FileName)
65   - {
  53 + FilePath = Filen + CurrentTime + ".mp4";
66 54 destination = Path.Combine(AndroidPath, Vlibras);
  55 +
67 56  
68 57 /* Checking if folder Vlibras exists*/
69 58  
... ... @@ -72,72 +61,98 @@ public class MediaShareAndroid : MonoBehaviour
72 61 {
73 62 dir.Create();
74 63 }
75   -
76   - /*Checking if there's a file with same name - If so, means user's trying
77   - * to share the same video*/
78   -
79   - dir = new DirectoryInfo(Path.Combine(destination, FileName));
80   - if (!dir.Exists)
  64 +
  65 + try
  66 + {
  67 + FileStream SourceStream = new FileStream(Path.Combine(destination, FilePath), FileMode.OpenOrCreate);
  68 + if (SourceStream.CanWrite)
  69 + {
  70 + SourceStream.Write(videoContent, 0, bytes);
  71 + SourceStream.Close();
  72 +
  73 + Refresh(FilePath);
  74 + finishWriting();
  75 + yield break;
  76 +
  77 + }
  78 + else
  79 + {
  80 + new AndroidToast().showToast("Erro ao salvar vídeo.");
  81 + errorWriting();
  82 + }
  83 +
  84 +
  85 + }
  86 + catch (Exception e)
81 87 {
82   - FileStream SourceStream = new FileStream(Path.Combine(destination, FileName), FileMode.OpenOrCreate);
83   - if (SourceStream.CanWrite)
84   - {
85   - SourceStream.Write(videoContent, 0, bytes);
86   - SourceStream.Close();
87   -
88   - }
89   - else
90   - {
91   - new AndroidToast().showToast("Erro ao compartilhar arquivo.");
92   - }
93   -
  88 + PlayerLogger.Log("MediaShareAndroid", "WriteOnAndroid","Message: " + e.Message);
  89 + PlayerLogger.Log("MediaShareAndroid", "WriteOnAndroid", "Message: " + e.StackTrace);
  90 + new AndroidToast().showToast("Você precisa dá permissão ao aplicativo");
  91 + errorWriting();
94 92 }
95 93  
96   - yield return null;
97   - Refresh(FileName);
98 94  
  95 +
  96 +#endif
  97 +
99 98  
100 99  
101 100  
102 101 }
103 102  
104   - private void Refresh(string FileName)
105   - {
  103 + /* Calling Android Services to refresh the video path, making available to show in gallery*/
106 104  
  105 + private void Refresh(string FilePath)
  106 + {
  107 +
107 108 AndroidJavaClass jcUnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
108 109 AndroidJavaObject joActivity = jcUnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
109 110 AndroidJavaObject joContext = joActivity.Call<AndroidJavaObject>("getApplicationContext");
110 111 AndroidJavaClass jcMediaScannerConnection = new AndroidJavaClass("android.media.MediaScannerConnection");
111   - //AndroidJavaClass jcEnvironment = new AndroidJavaClass("android.os.Environment");
112   - // AndroidJavaObject joExDir = jcEnvironment.CallStatic<AndroidJavaObject>("getExternalStorageDirectory");
113   - string path = Path.Combine(destination,FileName);
114   - jcMediaScannerConnection.CallStatic("scanFile", joContext, new string[] { path }, null, null);
115   - StartCoroutine(ShareIntent(FileName));
  112 + //AndroidJavaClass jcEnvironment = new AndroidJavaClass("android.os.Environment");
  113 + // AndroidJavaObject joExDir = jcEnvironment.CallStatic<AndroidJavaObject>("getExternalStorageDirectory");
  114 + string path = destination;
  115 + jcMediaScannerConnection.CallStatic("scanFile", joContext, new string[] { path }, new string[] { "video/mp4" },null );
  116 +
  117 +
116 118  
117 119 }
118 120  
119   - private IEnumerator ShareIntent(string FileName) {
120 121  
121   - // block to open the file and share it ------------START
122   - AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
123   - AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");
124   - intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
  122 + /* Calling Android Services to create Share Intent*/
125 123  
126   - AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
127   - AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("parse", "file://" + Path.Combine(destination,FileName));
128   -
129   - intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uriObject);
130   - intentObject.Call<AndroidJavaObject>("setType", MediaType);
  124 + public IEnumerator ShareIntent(Action errorAction) {
  125 +
  126 +
  127 + if(File.Exists(Path.Combine(destination, FilePath)))
  128 + {
131 129  
132   - //add data to be passed to the other activity i.e., the data to be sent
133   - intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), "VLibras");
134   - intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), SubtitleMessage);
135   - intentObject.Call<AndroidJavaObject>("setType", "video/*");
136   - AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
137   - AndroidJavaObject jChooser = intentClass.CallStatic<AndroidJavaObject>("createChooser", intentObject, "Compartilhar via");
138   - AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
139   - currentActivity.Call("startActivity", jChooser);
140   - yield break;
  130 + // block to open the file and share it ------------START
  131 + AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
  132 + AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");
  133 + intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
  134 +
  135 + AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
  136 + AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("parse", "file://" + Path.Combine(destination, FilePath));
  137 +
  138 + intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uriObject);
  139 + intentObject.Call<AndroidJavaObject>("setType", MediaType);
  140 +
  141 + //add data to be passed to the other activity i.e., the data to be sent
  142 + intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), "VLibras");
  143 + intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), SubtitleMessage);
  144 + intentObject.Call<AndroidJavaObject>("setType", "video/*");
  145 + AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  146 + AndroidJavaObject jChooser = intentClass.CallStatic<AndroidJavaObject>("createChooser", intentObject, "Compartilhar via");
  147 + AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
  148 + currentActivity.Call("startActivity", jChooser);
  149 + yield break;
  150 + }else
  151 + {
  152 + errorAction();
  153 +
  154 + yield break;
  155 + }
141 156  
142 157  
143 158 }
... ...
Assets/Scripts/UI/ScreenManager.cs
... ... @@ -317,6 +317,8 @@ public class ScreenManager : MonoBehaviour {
317 317 this.shareLayer.SetActive(active);
318 318 }
319 319  
  320 +
  321 +
320 322 public void setTranslateButtonActive(bool active)
321 323 {
322 324 this.textButton.SetActive(active);
... ... @@ -379,6 +381,9 @@ public class ScreenManager : MonoBehaviour {
379 381 case ExportLayers.ExportLayer.OnLockExport:
380 382 onLockExport = show_Layer;
381 383 break;
  384 + case ExportLayers.ExportLayer.OnLockShare:
  385 + onLockShare = show_Layer;
  386 + break;
382 387 default:
383 388 onLockShare = false;
384 389 onLockExport = false;
... ...