2021-02-11 01:50:10 +01:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
2021-03-31 16:19:05 +02:00
|
|
|
using System.Threading.Tasks;
|
|
|
|
using Bit.App.Models;
|
2021-02-11 01:50:10 +01:00
|
|
|
using Bit.App.Resources;
|
2021-07-12 16:58:17 +02:00
|
|
|
using Bit.App.Utilities;
|
2021-02-11 01:50:10 +01:00
|
|
|
using Bit.Core.Abstractions;
|
|
|
|
using Bit.Core.Enums;
|
|
|
|
using Bit.Core.Utilities;
|
|
|
|
using Xamarin.Forms;
|
|
|
|
using Xamarin.Forms.PlatformConfiguration;
|
|
|
|
using Xamarin.Forms.PlatformConfiguration.iOSSpecific;
|
|
|
|
using Entry = Xamarin.Forms.Entry;
|
|
|
|
|
|
|
|
namespace Bit.App.Pages
|
|
|
|
{
|
|
|
|
public partial class SendAddEditPage : BaseContentPage
|
|
|
|
{
|
|
|
|
private readonly IBroadcasterService _broadcasterService;
|
2021-07-09 17:48:03 +02:00
|
|
|
private readonly IVaultTimeoutService _vaultTimeoutService;
|
2022-03-02 18:15:16 +01:00
|
|
|
private readonly LazyResolve<ILogger> _logger = new LazyResolve<ILogger>("logger");
|
2021-02-11 01:50:10 +01:00
|
|
|
|
2021-03-31 16:19:05 +02:00
|
|
|
private AppOptions _appOptions;
|
2021-02-11 01:50:10 +01:00
|
|
|
private SendAddEditPageViewModel _vm;
|
|
|
|
|
2022-01-25 21:41:56 +01:00
|
|
|
public Action OnClose { get; set; }
|
|
|
|
public Action AfterSubmit { get; set; }
|
|
|
|
|
2021-02-11 01:50:10 +01:00
|
|
|
public SendAddEditPage(
|
2021-03-31 16:19:05 +02:00
|
|
|
AppOptions appOptions = null,
|
2021-02-11 01:50:10 +01:00
|
|
|
string sendId = null,
|
|
|
|
SendType? type = null)
|
|
|
|
{
|
|
|
|
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
2021-07-09 17:48:03 +02:00
|
|
|
_vaultTimeoutService = ServiceContainer.Resolve<IVaultTimeoutService>("vaultTimeoutService");
|
2021-03-31 16:19:05 +02:00
|
|
|
_appOptions = appOptions;
|
2021-02-11 01:50:10 +01:00
|
|
|
InitializeComponent();
|
|
|
|
_vm = BindingContext as SendAddEditPageViewModel;
|
|
|
|
_vm.Page = this;
|
|
|
|
_vm.SendId = sendId;
|
2021-03-31 16:19:05 +02:00
|
|
|
_vm.Type = appOptions?.CreateSend?.Item1 ?? type;
|
2021-02-11 20:38:30 +01:00
|
|
|
SetActivityIndicator();
|
2021-02-11 01:50:10 +01:00
|
|
|
if (Device.RuntimePlatform == Device.Android)
|
|
|
|
{
|
|
|
|
if (_vm.EditMode)
|
|
|
|
{
|
|
|
|
ToolbarItems.Add(_removePassword);
|
|
|
|
ToolbarItems.Add(_copyLink);
|
|
|
|
ToolbarItems.Add(_shareLink);
|
|
|
|
ToolbarItems.Add(_deleteItem);
|
|
|
|
}
|
2021-02-11 20:38:30 +01:00
|
|
|
_vm.SegmentedButtonHeight = 36;
|
|
|
|
_vm.SegmentedButtonFontSize = 13;
|
|
|
|
_vm.SegmentedButtonMargins = new Thickness(0, 10, 0, 0);
|
2021-02-11 01:50:10 +01:00
|
|
|
_vm.EditorMargins = new Thickness(0, 5, 0, 0);
|
2022-04-22 03:29:47 +02:00
|
|
|
_btnOptions.WidthRequest = 70;
|
|
|
|
_btnOptionsDown.WidthRequest = 30;
|
|
|
|
_btnOptionsUp.WidthRequest = 30;
|
2021-02-11 01:50:10 +01:00
|
|
|
}
|
|
|
|
else if (Device.RuntimePlatform == Device.iOS)
|
|
|
|
{
|
|
|
|
ToolbarItems.Add(_closeItem);
|
|
|
|
if (_vm.EditMode)
|
|
|
|
{
|
|
|
|
ToolbarItems.Add(_moreItem);
|
|
|
|
}
|
2021-02-11 20:38:30 +01:00
|
|
|
_vm.SegmentedButtonHeight = 30;
|
|
|
|
_vm.SegmentedButtonFontSize = 15;
|
|
|
|
_vm.SegmentedButtonMargins = new Thickness(0, 5, 0, 0);
|
2021-02-11 01:50:10 +01:00
|
|
|
_vm.ShowEditorSeparators = true;
|
|
|
|
_vm.EditorMargins = new Thickness(0, 10, 0, 5);
|
|
|
|
_deletionDateTypePicker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
|
|
|
|
_expirationDateTypePicker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
|
|
|
|
}
|
|
|
|
|
|
|
|
_deletionDateTypePicker.ItemDisplayBinding = new Binding("Key");
|
|
|
|
_expirationDateTypePicker.ItemDisplayBinding = new Binding("Key");
|
|
|
|
|
|
|
|
if (_vm.IsText)
|
|
|
|
{
|
|
|
|
_nameEntry.ReturnType = ReturnType.Next;
|
|
|
|
_nameEntry.ReturnCommand = new Command(() => _textEditor.Focus());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected override async void OnAppearing()
|
|
|
|
{
|
|
|
|
base.OnAppearing();
|
2022-01-25 21:41:56 +01:00
|
|
|
|
|
|
|
try
|
2021-11-19 21:00:54 +01:00
|
|
|
{
|
2022-01-25 21:41:56 +01:00
|
|
|
if (!await AppHelpers.IsVaultTimeoutImmediateAsync())
|
2021-02-11 01:50:10 +01:00
|
|
|
{
|
2022-01-25 21:41:56 +01:00
|
|
|
await _vaultTimeoutService.CheckVaultTimeoutAsync();
|
2021-02-11 01:50:10 +01:00
|
|
|
}
|
2022-01-25 21:41:56 +01:00
|
|
|
if (await _vaultTimeoutService.IsLockedAsync())
|
2021-02-11 01:50:10 +01:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2022-01-25 21:41:56 +01:00
|
|
|
await _vm.InitAsync();
|
|
|
|
_broadcasterService.Subscribe(nameof(SendAddEditPage), message =>
|
2021-11-19 19:05:00 +01:00
|
|
|
{
|
2022-01-25 21:41:56 +01:00
|
|
|
if (message.Command == "selectFileResult")
|
|
|
|
{
|
|
|
|
Device.BeginInvokeOnMainThread(() =>
|
|
|
|
{
|
|
|
|
var data = message.Data as Tuple<byte[], string>;
|
|
|
|
_vm.FileData = data.Item1;
|
|
|
|
_vm.FileName = data.Item2;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
await LoadOnAppearedAsync(_scrollView, true, async () =>
|
|
|
|
{
|
|
|
|
var success = await _vm.LoadAsync();
|
|
|
|
if (!success)
|
|
|
|
{
|
|
|
|
await CloseAsync();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
await HandleCreateRequest();
|
|
|
|
if (!_vm.EditMode && string.IsNullOrWhiteSpace(_vm.Send?.Name))
|
|
|
|
{
|
|
|
|
RequestFocus(_nameEntry);
|
|
|
|
}
|
|
|
|
AdjustToolbar();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
catch (Exception ex)
|
|
|
|
{
|
2022-03-02 18:15:16 +01:00
|
|
|
_logger.Value.Exception(ex);
|
2022-01-25 21:41:56 +01:00
|
|
|
await CloseAsync();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async Task CloseAsync()
|
|
|
|
{
|
|
|
|
if (OnClose is null)
|
|
|
|
{
|
|
|
|
await Navigation.PopModalAsync();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
OnClose();
|
|
|
|
}
|
2021-02-11 01:50:10 +01:00
|
|
|
}
|
|
|
|
|
2021-07-09 17:48:03 +02:00
|
|
|
protected override bool OnBackButtonPressed()
|
|
|
|
{
|
|
|
|
if (_vm.IsAddFromShare && Device.RuntimePlatform == Device.Android)
|
|
|
|
{
|
|
|
|
_appOptions.CreateSend = null;
|
|
|
|
}
|
|
|
|
return base.OnBackButtonPressed();
|
|
|
|
}
|
|
|
|
|
2021-02-11 01:50:10 +01:00
|
|
|
protected override void OnDisappearing()
|
|
|
|
{
|
|
|
|
base.OnDisappearing();
|
|
|
|
if (Device.RuntimePlatform != Device.iOS)
|
|
|
|
{
|
|
|
|
_broadcasterService.Unsubscribe(nameof(SendAddEditPage));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-18 22:58:20 +01:00
|
|
|
private async void TextType_Clicked(object sender, EventArgs eventArgs)
|
2021-02-11 20:38:30 +01:00
|
|
|
{
|
2021-02-18 22:58:20 +01:00
|
|
|
await _vm.TypeChangedAsync(SendType.Text);
|
2021-02-12 20:20:07 +01:00
|
|
|
_nameEntry.ReturnType = ReturnType.Next;
|
|
|
|
_nameEntry.ReturnCommand = new Command(() => _textEditor.Focus());
|
|
|
|
if (string.IsNullOrWhiteSpace(_vm.Send.Name))
|
|
|
|
{
|
|
|
|
RequestFocus(_nameEntry);
|
|
|
|
}
|
2021-02-11 20:38:30 +01:00
|
|
|
}
|
2021-02-17 16:46:04 +01:00
|
|
|
|
2021-02-18 22:58:20 +01:00
|
|
|
private async void FileType_Clicked(object sender, EventArgs eventArgs)
|
2021-02-11 20:38:30 +01:00
|
|
|
{
|
2021-02-18 22:58:20 +01:00
|
|
|
await _vm.TypeChangedAsync(SendType.File);
|
2021-02-12 20:20:07 +01:00
|
|
|
_nameEntry.ReturnType = ReturnType.Done;
|
|
|
|
_nameEntry.ReturnCommand = null;
|
|
|
|
if (string.IsNullOrWhiteSpace(_vm.Send.Name))
|
|
|
|
{
|
|
|
|
RequestFocus(_nameEntry);
|
|
|
|
}
|
2021-02-11 20:38:30 +01:00
|
|
|
}
|
|
|
|
|
2021-02-11 01:50:10 +01:00
|
|
|
private void OnMaxAccessCountTextChanged(object sender, TextChangedEventArgs e)
|
|
|
|
{
|
|
|
|
if (string.IsNullOrWhiteSpace(e.NewTextValue))
|
|
|
|
{
|
|
|
|
_vm.MaxAccessCount = null;
|
|
|
|
_maxAccessCountStepper.Value = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// accept only digits
|
|
|
|
if (!int.TryParse(e.NewTextValue, out int _))
|
|
|
|
{
|
|
|
|
((Entry)sender).Text = e.OldTextValue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async void ChooseFile_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
if (DoOnce())
|
|
|
|
{
|
|
|
|
await _vm.ChooseFileAsync();
|
|
|
|
}
|
|
|
|
}
|
2021-02-17 16:46:04 +01:00
|
|
|
|
2021-02-16 21:24:51 +01:00
|
|
|
private void ToggleOptions_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
_vm.ToggleOptions();
|
|
|
|
}
|
2021-02-11 01:50:10 +01:00
|
|
|
|
|
|
|
private void ClearExpirationDate_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
if (DoOnce())
|
|
|
|
{
|
|
|
|
_vm.ClearExpirationDate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async void Save_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
if (DoOnce())
|
|
|
|
{
|
2022-01-25 21:41:56 +01:00
|
|
|
var submitted = await _vm.SubmitAsync();
|
|
|
|
if (submitted)
|
|
|
|
{
|
|
|
|
AfterSubmit?.Invoke();
|
|
|
|
}
|
2021-02-11 01:50:10 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async void RemovePassword_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
if (DoOnce())
|
|
|
|
{
|
|
|
|
await _vm.RemovePasswordAsync();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async void CopyLink_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
if (DoOnce())
|
|
|
|
{
|
|
|
|
await _vm.CopyLinkAsync();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async void ShareLink_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
if (DoOnce())
|
|
|
|
{
|
|
|
|
await _vm.ShareLinkAsync();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async void Delete_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
if (DoOnce())
|
|
|
|
{
|
|
|
|
if (await _vm.DeleteAsync())
|
|
|
|
{
|
2022-01-25 21:41:56 +01:00
|
|
|
await CloseAsync();
|
2021-02-11 01:50:10 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async void More_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
if (!DoOnce())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var options = new List<string>();
|
2021-02-18 22:58:20 +01:00
|
|
|
if (_vm.SendEnabled && _vm.EditMode)
|
2021-02-11 01:50:10 +01:00
|
|
|
{
|
2021-02-18 22:58:20 +01:00
|
|
|
if (_vm.Send.HasPassword)
|
|
|
|
{
|
|
|
|
options.Add(AppResources.RemovePassword);
|
|
|
|
}
|
2021-02-11 01:50:10 +01:00
|
|
|
options.Add(AppResources.CopyLink);
|
|
|
|
options.Add(AppResources.ShareLink);
|
|
|
|
}
|
|
|
|
|
|
|
|
var selection = await DisplayActionSheet(AppResources.Options, AppResources.Cancel,
|
|
|
|
_vm.EditMode ? AppResources.Delete : null, options.ToArray());
|
|
|
|
if (selection == AppResources.RemovePassword)
|
|
|
|
{
|
|
|
|
await _vm.RemovePasswordAsync();
|
|
|
|
}
|
|
|
|
else if (selection == AppResources.CopyLink)
|
|
|
|
{
|
|
|
|
await _vm.CopyLinkAsync();
|
|
|
|
}
|
|
|
|
else if (selection == AppResources.ShareLink)
|
|
|
|
{
|
|
|
|
await _vm.ShareLinkAsync();
|
|
|
|
}
|
|
|
|
else if (selection == AppResources.Delete)
|
|
|
|
{
|
|
|
|
if (await _vm.DeleteAsync())
|
|
|
|
{
|
2022-01-25 21:41:56 +01:00
|
|
|
await CloseAsync();
|
2021-02-11 01:50:10 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async void Close_Clicked(object sender, EventArgs e)
|
|
|
|
{
|
|
|
|
if (DoOnce())
|
|
|
|
{
|
2022-01-25 21:41:56 +01:00
|
|
|
await CloseAsync();
|
2021-02-11 01:50:10 +01:00
|
|
|
}
|
|
|
|
}
|
2021-02-18 22:58:20 +01:00
|
|
|
|
|
|
|
private void AdjustToolbar()
|
|
|
|
{
|
|
|
|
_saveItem.IsEnabled = _vm.SendEnabled;
|
|
|
|
if (!_vm.SendEnabled && _vm.EditMode && Device.RuntimePlatform == Device.Android)
|
|
|
|
{
|
|
|
|
ToolbarItems.Remove(_removePassword);
|
|
|
|
ToolbarItems.Remove(_copyLink);
|
|
|
|
ToolbarItems.Remove(_shareLink);
|
|
|
|
}
|
|
|
|
}
|
2021-03-31 16:19:05 +02:00
|
|
|
|
|
|
|
private async Task HandleCreateRequest()
|
|
|
|
{
|
|
|
|
if (_appOptions?.CreateSend == null)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
_vm.IsAddFromShare = true;
|
2022-01-25 21:41:56 +01:00
|
|
|
_vm.CopyInsteadOfShareAfterSaving = _appOptions.CopyInsteadOfShareAfterSaving;
|
2021-03-31 16:19:05 +02:00
|
|
|
|
|
|
|
var name = _appOptions.CreateSend.Item2;
|
|
|
|
_vm.Send.Name = name;
|
|
|
|
|
|
|
|
var type = _appOptions.CreateSend.Item1;
|
|
|
|
if (type == SendType.File)
|
|
|
|
{
|
|
|
|
_vm.FileData = _appOptions.CreateSend.Item3;
|
|
|
|
_vm.FileName = name;
|
|
|
|
FileType_Clicked(null, null);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
var text = _appOptions.CreateSend.Item4;
|
|
|
|
_vm.Send.Text.Text = text;
|
|
|
|
TextType_Clicked(null, null);
|
|
|
|
}
|
|
|
|
_appOptions.CreateSend = null;
|
|
|
|
}
|
2021-02-11 01:50:10 +01:00
|
|
|
}
|
|
|
|
}
|