mirror of
https://github.com/bitwarden/android.git
synced 2025-01-03 23:07:34 +03:00
3799eb4603
* add support for disable send policy * cleanup * show/hide options support for send search results * additional failsafes and copy function consolidation * added missing disabled send icon to android renderer * async fix and string updates
128 lines
4.1 KiB
C#
128 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Bit.App.Utilities;
|
|
using Bit.Core.Abstractions;
|
|
using Bit.Core.Models.View;
|
|
using Bit.Core.Utilities;
|
|
using Xamarin.Forms;
|
|
|
|
namespace Bit.App.Pages
|
|
{
|
|
public class SendsPageViewModel : BaseViewModel
|
|
{
|
|
private readonly ISearchService _searchService;
|
|
|
|
private CancellationTokenSource _searchCancellationTokenSource;
|
|
private bool _sendEnabled;
|
|
private bool _showNoData;
|
|
private bool _showList;
|
|
|
|
public SendsPageViewModel()
|
|
{
|
|
_searchService = ServiceContainer.Resolve<ISearchService>("searchService");
|
|
Sends = new ExtendedObservableCollection<SendView>();
|
|
SendOptionsCommand = new Command<SendView>(SendOptionsAsync);
|
|
}
|
|
|
|
public Command SendOptionsCommand { get; set; }
|
|
public ExtendedObservableCollection<SendView> Sends { get; set; }
|
|
public Func<SendView, bool> Filter { get; set; }
|
|
|
|
public bool SendEnabled
|
|
{
|
|
get => _sendEnabled;
|
|
set => SetProperty(ref _sendEnabled, value);
|
|
}
|
|
|
|
public bool ShowNoData
|
|
{
|
|
get => _showNoData;
|
|
set => SetProperty(ref _showNoData, value, additionalPropertyNames: new []
|
|
{
|
|
nameof(ShowSearchDirection)
|
|
});
|
|
}
|
|
|
|
public bool ShowList
|
|
{
|
|
get => _showList;
|
|
set => SetProperty(ref _showList, value, additionalPropertyNames: new []
|
|
{
|
|
nameof(ShowSearchDirection)
|
|
});
|
|
}
|
|
|
|
public bool ShowSearchDirection => !ShowList && !ShowNoData;
|
|
|
|
public async Task InitAsync()
|
|
{
|
|
SendEnabled = ! await AppHelpers.IsSendDisabledByPolicyAsync();
|
|
if (!string.IsNullOrWhiteSpace((Page as SendsPage).SearchBar.Text))
|
|
{
|
|
Search((Page as SendsPage).SearchBar.Text, 200);
|
|
}
|
|
}
|
|
|
|
public void Search(string searchText, int? timeout = null)
|
|
{
|
|
var previousCts = _searchCancellationTokenSource;
|
|
var cts = new CancellationTokenSource();
|
|
Task.Run(async () =>
|
|
{
|
|
List<SendView> sends = null;
|
|
var searchable = !string.IsNullOrWhiteSpace(searchText) && searchText.Length > 1;
|
|
if (searchable)
|
|
{
|
|
if (timeout != null)
|
|
{
|
|
await Task.Delay(timeout.Value);
|
|
}
|
|
if (searchText != (Page as SendsPage).SearchBar.Text)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
previousCts?.Cancel();
|
|
}
|
|
try
|
|
{
|
|
sends = await _searchService.SearchSendsAsync(searchText, Filter, null, cts.Token);
|
|
cts.Token.ThrowIfCancellationRequested();
|
|
}
|
|
catch (OperationCanceledException)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
if (sends == null)
|
|
{
|
|
sends = new List<SendView>();
|
|
}
|
|
Device.BeginInvokeOnMainThread(() =>
|
|
{
|
|
Sends.ResetWithRange(sends);
|
|
ShowNoData = searchable && Sends.Count == 0;
|
|
ShowList = searchable && !ShowNoData;
|
|
});
|
|
}, cts.Token);
|
|
_searchCancellationTokenSource = cts;
|
|
}
|
|
|
|
public async Task SelectSendAsync(SendView send)
|
|
{
|
|
var page = new SendAddEditPage(send.Id);
|
|
await Page.Navigation.PushModalAsync(new NavigationPage(page));
|
|
}
|
|
|
|
private async void SendOptionsAsync(SendView send)
|
|
{
|
|
if ((Page as BaseContentPage).DoOnce())
|
|
{
|
|
await AppHelpers.SendListOptions(Page, send);
|
|
}
|
|
}
|
|
}
|
|
}
|