private async Task <FileTransferResult> SendFile(object rs, IRomePackageManager packageManager, string deviceName, bool preserveFolderStructure) { string sendingText = ((SendDataTemporaryStorage.Files.Count == 1) && (SendDataTemporaryStorage.Files[0] is StorageFile)) ? "Sending file..." : "Sending files..."; string message = ""; FileTransferResult result = FileTransferResult.Successful; if (await DownloadNecessaryFiles() == false) { return(FileTransferResult.Cancelled); } sendingFile = true; ViewModel.SendStatus = "Preparing..."; using (FileSender2 fs = new FileSender2(rs, new QuickShare.UWP.WebServerGenerator(), packageManager, FindMyIPAddresses(), deviceName)) { ViewModel.ProgressMaximum = 1; fs.FileTransferProgress += async(ss, ee) => { if (ee.State == FileTransferState.Error) { result = FileTransferResult.FailedOnSend; message = result.ToString(); // TODO } else if (ee.State == FileTransferState.Reconnecting) { ViewModel.SendStatus = "Reconnecting..."; ViewModel.ProgressIsIndeterminate = true; } else if (ee.State == FileTransferState.Reconnected) { ViewModel.SendStatus = "Waiting for response..."; } else { await DispatcherEx.RunOnCoreDispatcherIfPossible(() => { ViewModel.SendStatus = sendingText; ViewModel.ProgressMaximum = 1.0; ViewModel.ProgressValue = ee.Progress; ViewModel.ProgressIsIndeterminate = false; if (ee.TotalTransferredBytes > 0) { ViewModel.ProgressCaption = StringFunctions.GetSizeString(ee.TotalTransferredBytes); } }, false); } }; if (SendDataTemporaryStorage.Files.Count == 0) { ViewModel.SendStatus = "No files."; ViewModel.ProgressIsIndeterminate = false; return(FileTransferResult.NoFiles); } await Task.Run(async() => { result = await fs.Send(preserveFolderStructure ? await GetFiles(SendDataTemporaryStorage.Files) : await GetFilesWithoutFolderStructure(SendDataTemporaryStorage.Files), sendFileCancellationTokenSource.Token); }); ViewModel.ProgressValue = ViewModel.ProgressMaximum; } sendingFile = false; if (result != FileTransferResult.Successful) { HideEverything(); if (result != FileTransferResult.Cancelled) { string title = "Send failed."; string text = message; if (result == FileTransferResult.FailedOnHandshake) { title = "Couldn't reach remote device."; text = "Make sure both devices are connected to the same Wi-Fi or LAN network."; } Frame.Navigate(typeof(MainSendFailed), JsonConvert.SerializeObject(new SendFailedViewModel { ErrorTitle = title, ErrorDescription = text, })); } } else { await SendFinishService(packageManager); ViewModel.SendStatus = "Done."; } return(result); }
private async Task SendFiles(string[] files) { if (TrialHelper.UserTrialStatus == QuickShare.Common.Service.UpgradeDetails.VersionStatus.TrialVersion) { double totalSize = 0; foreach (var item in files) { var info = new System.IO.FileInfo(item); totalSize += info.Length; } totalSize /= 1024.0 * 1024.0; if (totalSize > Constants.MaxSizeForTrialVersion) { var intent = new Intent(this, typeof(MessageShowActivity)); intent.PutExtra("message", "trialNotice"); StartActivity(intent); Finish(); return; } } sendStatus.Text = "Connecting..."; var result = await Common.PackageManager.Connect(Common.GetCurrentRemoteSystem(), false); if (result != QuickShare.Common.Rome.RomeAppServiceConnectionStatus.Success) { Analytics.TrackEvent("SendToWindows", "file", "Failed"); sendStatus.Text = $"Connect failed. ({result.ToString()})"; return; } //Fix Rome Android bug (receiver app service closes after 5 seconds in first connection) Common.PackageManager.CloseAppService(); result = await Common.PackageManager.Connect(Common.GetCurrentRemoteSystem(), false); if (result != QuickShare.Common.Rome.RomeAppServiceConnectionStatus.Success) { Analytics.TrackEvent("SendToWindows", "file", "Failed"); sendStatus.Text = $"Connect failed. ({result.ToString()})"; return; } string sendingText = (files.Length == 1) ? "Sending file..." : "Sending files..."; sendStatus.Text = "Preparing..."; string message = ""; FileTransferResult transferResult = FileTransferResult.Successful; using (FileSender fs = new FileSender(Common.GetCurrentRemoteSystem(), new WebServerComponent.WebServerGenerator(), Common.PackageManager, FindMyIPAddresses(), CrossDeviceInfo.Current.Model)) { sendProgress.Max = 1; fs.FileTransferProgress += (ss, ee) => { if (ee.State == FileTransferState.Error) { transferResult = FileTransferResult.FailedOnSend; message = ee.Message; } else { RunOnUiThread(() => { sendStatus.Text = sendingText; SetProgressBarValue((int)ee.CurrentPart, (int)ee.Total + 1); }); } }; if (files.Length == 0) { sendStatus.Text = "No files."; //ViewModel.ProgressIsIndeterminate = false; return; } else if (files.Length == 1) { await Task.Run(async() => { sendingFile = true; transferResult = await fs.SendFile(sendFileCancellationTokenSource.Token, new PCLStorage.FileSystemFile(files[0])); sendingFile = false; }); } else { await Task.Run(async() => { sendingFile = true; transferResult = await fs.SendFiles(sendFileCancellationTokenSource.Token, from x in files select new PCLStorage.FileSystemFile(x), DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + "\\"); sendingFile = false; }); } sendProgress.Progress = sendProgress.Max; } Dictionary <string, object> vs = new Dictionary <string, object> { { "Receiver", "System" }, { "FinishService", "FinishService" }, }; await Common.PackageManager.Send(vs); Common.PackageManager.CloseAppService(); SetProgressBarValueToMax(); if (transferResult != FileTransferResult.Successful) { Analytics.TrackEvent("SendToWindows", "file", transferResult.ToString()); if (transferResult != FileTransferResult.Cancelled) { sendStatus.Text = "Failed."; System.Diagnostics.Debug.WriteLine("Send failed.\r\n\r\n" + message); if (transferResult == FileTransferResult.FailedOnHandshake) { message = "Couldn't reach remote device.\r\n\r\n" + "Make sure both devices are connected to the same Wi-Fi or LAN network."; } AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.SetTitle(message); alert.SetPositiveButton("OK", (senderAlert, args) => { }); RunOnUiThread(() => { alert.Show(); }); } } else { sendStatus.Text = "Finished."; Analytics.TrackEvent("SendToWindows", "file", "Success"); } }
protected override async void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); #if !DEBUG App.Tracker.Send(HitBuilder.CreateScreenView("Send").Build()); #endif PersistentDisplay.ActivatePersistentDisplay(); if (Frame.BackStackDepth > 0) { if (Frame.BackStack[Frame.BackStackDepth - 1].SourcePageType == typeof(MainSend)) { Frame.BackStack.RemoveAt(Frame.BackStackDepth - 1); } } bool preserveFolderStructure = (Frame.BackStackDepth <= 0 || Frame.BackStack[Frame.BackStackDepth - 1].SourcePageType != typeof(PicturePicker)); var rs = MainPage.Current.GetSelectedSystem(); bool isDestinationAndroid; IRomePackageManager packageManager; if (rs is NormalizedRemoteSystem) { isDestinationAndroid = true; var nrs = rs as NormalizedRemoteSystem; if ((!string.IsNullOrEmpty(nrs.AppVersion)) && (Version.TryParse(nrs.AppVersion, out Version remoteAppVersion)) && (remoteAppVersion < new Version("2.1.4"))) { MainPage.Current.AndroidPackageManager.Mode = AndroidRomePackageManager.AndroidPackageManagerMode.MessageCarrier; } else { PackageManagerHelper.InitAndroidPackageManagerMode(); } } else { isDestinationAndroid = false; } string deviceName; var localDeviceInfo = NetworkInformation.GetHostNames().FirstOrDefault(name => name.DisplayName.EndsWith(".local")); if (localDeviceInfo != null) { deviceName = localDeviceInfo.DisplayName.Substring(0, localDeviceInfo.DisplayName.Length - ".local".Length); } else { deviceName = (new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation()).FriendlyName; } var mode = e.Parameter.ToString(); bool succeed = true; FileTransferResult fileTransferResult = FileTransferResult.Successful; try { if (mode == "launchUri") { await LaunchUri(rs); } else if (mode == "text") { string text = SendDataTemporaryStorage.Text; bool fastSendResult = await TrySendFastClipboard(text, rs, deviceName); if (fastSendResult) { SendTextFinished(""); } else { SendTextFinished("Send failed. Text is too long."); #if !DEBUG App.Tracker.Send(HitBuilder.CreateCustomEvent("SendTextFailed", "TooLong").Build()); #endif //ViewModel.ProgressPercentIndicatorVisibility = Visibility.Visible; //var result = await Connect(rs); //var connectResult = result.Item1; //packageManager = result.Item2; //if (connectResult != RomeAppServiceConnectionStatus.Success) //{ // HideEverything(); // succeed = false; // string errorMessage; // if ((connectResult == RomeAppServiceConnectionStatus.RemoteSystemUnavailable) && (packageManager is AndroidRomePackageManager)) // { // errorMessage = "Can't connect to device. Open Roamit on your Android device and then try again."; // } // else // { // errorMessage = connectResult.ToString(); // } // Frame.Navigate(typeof(MainSendFailed), JsonConvert.SerializeObject(new SendFailedViewModel // { // ErrorTitle = "Can't connect", // ErrorDescription = errorMessage, // })); // return; //} //ViewModel.UnlockNoticeVisibility = Visibility.Collapsed; //await SendText(packageManager, deviceName, text); } } else if (mode == "file") { ViewModel.ProgressPercentIndicatorVisibility = Visibility.Visible; var result = await Connect(rs, openReceiveFileDialogIfOverCloud : true); var connectResult = result.Item1; packageManager = result.Item2; if (connectResult != RomeAppServiceConnectionStatus.Success) { HideEverything(); succeed = false; string errorMessage; if ((connectResult == RomeAppServiceConnectionStatus.RemoteSystemUnavailable) && (packageManager is AndroidRomePackageManager)) { errorMessage = "Can't connect to device. Open Roamit on your Android device and then try again."; } else { errorMessage = connectResult.ToString(); } Frame.Navigate(typeof(MainSendFailed), JsonConvert.SerializeObject(new SendFailedViewModel { ErrorTitle = "Can't connect", ErrorDescription = errorMessage, })); return; } ViewModel.UnlockNoticeVisibility = Visibility.Collapsed; if (!isDestinationAndroid) { ViewModel.LeaveScreenOnNoticeVisibility = Visibility.Visible; } fileTransferResult = await SendFile(rs, packageManager, deviceName, preserveFolderStructure); if (fileTransferResult != FileTransferResult.Successful) { succeed = false; return; } if (!isDestinationAndroid) { ViewModel.LeaveScreenOnNoticeVisibility = Visibility.Collapsed; } } else { succeed = false; Frame.Navigate(typeof(MainSendFailed), JsonConvert.SerializeObject(new SendFailedViewModel { ErrorTitle = "Invalid parameter", ErrorDescription = "[MainSend]", })); return; } } finally { PersistentDisplay.ReleasePersistentDisplay(); #if !DEBUG if (rs is NormalizedRemoteSystem) { App.Tracker.Send(HitBuilder.CreateCustomEvent("SendToAndroid", mode, succeed ? "Success" : ((mode == "file") ? fileTransferResult.ToString() : "Failed")).Build()); } else { App.Tracker.Send(HitBuilder.CreateCustomEvent("SendToWindows", mode, succeed ? "Success" : ((mode == "file") ? fileTransferResult.ToString() : "Failed")).Build()); } #endif sendingFile = false; } if (SendDataTemporaryStorage.IsSharingTarget) { if (App.ShareOperation == null) { #if !DEBUG App.Tracker.Send(HitBuilder.CreateCustomEvent("Send", "UriTarget").Build()); #endif await Task.Delay(TimeSpan.FromSeconds(1.5)); App.Current.Exit(); } else { #if !DEBUG App.Tracker.Send(HitBuilder.CreateCustomEvent("Send", "ShareTarget").Build()); #endif await Task.Delay(TimeSpan.FromSeconds(1.5)); App.ShareOperation.ReportCompleted(); } SendDataTemporaryStorage.IsSharingTarget = false; App.ShareOperation = null; } else { ViewModel.GoBackButtonVisibility = Visibility.Visible; GoBackButtonShowStoryboard.Begin(); if (succeed) { await AskForReviewIfNecessary(); } #if !DEBUG App.Tracker.Send(HitBuilder.CreateCustomEvent("Send", "WithinApp").Build()); #endif } }
protected override async void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); #if !DEBUG App.Tracker.Send(HitBuilder.CreateScreenView("Send").Build()); #endif PersistentDisplay.ActivatePersistentDisplay(); if (Frame.BackStackDepth > 0) { if (Frame.BackStack[Frame.BackStackDepth - 1].SourcePageType == typeof(MainSend)) { Frame.BackStack.RemoveAt(Frame.BackStackDepth - 1); } } var rs = MainPage.Current.GetSelectedSystem(); bool isDestinationAndroid; IRomePackageManager packageManager; if (rs is NormalizedRemoteSystem) { isDestinationAndroid = true; packageManager = MainPage.Current.AndroidPackageManager; var nrs = rs as NormalizedRemoteSystem; if ((!string.IsNullOrEmpty(nrs.AppVersion)) && (Version.TryParse(nrs.AppVersion, out Version remoteAppVersion)) && (remoteAppVersion < new Version("2.1.4"))) { MainPage.Current.AndroidPackageManager.Mode = AndroidRomePackageManager.AndroidPackageManagerMode.MessageCarrier; } else { PackageManagerHelper.InitAndroidPackageManagerMode(); } } else { isDestinationAndroid = false; packageManager = MainPage.Current.PackageManager; } string deviceName = (new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation()).FriendlyName; var mode = e.Parameter.ToString(); if ((mode == "file") && (!(await IsAllowedToSendAsync()))) { ViewModel.SendStatus = ""; await TrialHelper.AskForUpgradeWhileSending(); if (!(await IsAllowedToSendAsync())) { #if !DEBUG App.Tracker.Send(HitBuilder.CreateCustomEvent("Send", "AskedToUpgrade", "Rejected").Build()); #endif PersistentDisplay.ReleasePersistentDisplay(); Frame.GoBack(); return; } #if !DEBUG App.Tracker.Send(HitBuilder.CreateCustomEvent("Send", "AskedToUpgrade", "Accepted").Build()); #endif ViewModel.SendStatus = "Connecting..."; } bool succeed = true; FileTransferResult fileTransferResult = FileTransferResult.Successful; try { if (mode == "launchUri") { await LaunchUri(rs); } else if (mode == "text") { string text = SendDataTemporaryStorage.Text; bool fastSendResult = await TrySendFastClipboard(text, rs, deviceName); if (fastSendResult) { SendTextFinished(""); } else { ViewModel.ProgressPercentIndicatorVisibility = Visibility.Visible; RomeAppServiceConnectionStatus result = await Connect(rs); if (result != RomeAppServiceConnectionStatus.Success) { HideEverything(); succeed = false; string errorMessage; if ((result == RomeAppServiceConnectionStatus.RemoteSystemUnavailable) && (packageManager is AndroidRomePackageManager)) { errorMessage = "Can't connect to device. Open Roamit on your Android device and then try again."; } else { errorMessage = result.ToString(); } await(new MessageDialog(errorMessage, "Can't connect")).ShowAsync(); Frame.GoBack(); return; } ViewModel.UnlockNoticeVisibility = Visibility.Collapsed; await SendText(packageManager, deviceName, text); } } else if (mode == "file") { ViewModel.ProgressPercentIndicatorVisibility = Visibility.Visible; RomeAppServiceConnectionStatus result = await Connect(rs); if (result != RomeAppServiceConnectionStatus.Success) { HideEverything(); succeed = false; string errorMessage; if ((result == RomeAppServiceConnectionStatus.RemoteSystemUnavailable) && (packageManager is AndroidRomePackageManager)) { errorMessage = "Can't connect to device. Open Roamit on your Android device and then try again."; } else { errorMessage = result.ToString(); } await(new MessageDialog(errorMessage, "Can't connect")).ShowAsync(); Frame.GoBack(); return; } ViewModel.UnlockNoticeVisibility = Visibility.Collapsed; if (!isDestinationAndroid) { ViewModel.LeaveScreenOnNoticeVisibility = Visibility.Visible; } fileTransferResult = await SendFile(rs, packageManager, deviceName); if (fileTransferResult != FileTransferResult.Successful) { HideEverything(); succeed = false; Frame.GoBack(); return; } if (!isDestinationAndroid) { ViewModel.LeaveScreenOnNoticeVisibility = Visibility.Collapsed; } } else { succeed = false; await(new MessageDialog("MainSend::Invalid parameter.")).ShowAsync(); Frame.GoBack(); return; } } finally { PersistentDisplay.ReleasePersistentDisplay(); #if !DEBUG if (rs is NormalizedRemoteSystem) { App.Tracker.Send(HitBuilder.CreateCustomEvent("SendToAndroid", mode, succeed ? "Success" : ((mode == "file") ? fileTransferResult.ToString() : "Failed")).Build()); } else { App.Tracker.Send(HitBuilder.CreateCustomEvent("SendToWindows", mode, succeed ? "Success" : ((mode == "file") ? fileTransferResult.ToString() : "Failed")).Build()); } #endif sendingFile = false; } if (SendDataTemporaryStorage.IsSharingTarget) { if (App.ShareOperation == null) { #if !DEBUG App.Tracker.Send(HitBuilder.CreateCustomEvent("Send", "UriTarget").Build()); #endif await Task.Delay(TimeSpan.FromSeconds(1.5)); App.Current.Exit(); } else { #if !DEBUG App.Tracker.Send(HitBuilder.CreateCustomEvent("Send", "ShareTarget").Build()); #endif await Task.Delay(TimeSpan.FromSeconds(1.5)); App.ShareOperation.ReportCompleted(); } SendDataTemporaryStorage.IsSharingTarget = false; App.ShareOperation = null; } else { ViewModel.GoBackButtonVisibility = Visibility.Visible; GoBackButtonShowStoryboard.Begin(); if (succeed) { await AskForReviewIfNecessary(); } #if !DEBUG App.Tracker.Send(HitBuilder.CreateCustomEvent("Send", "WithinApp").Build()); #endif } }