using System; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using AndroidX.AppCompat.App; using AndroidX.AppCompat.Widget; using AndroidX.Core.View; using AndroidX.DrawerLayout.Widget; using Google.Android.Material.FloatingActionButton; using Google.Android.Material.Navigation; using Google.Android.Material.Snackbar; using Tesses.YouTubeDownloader.Droid; using Toolbar = AndroidX.AppCompat.Widget.Toolbar; namespace TYTD.Mobile { public interface IServerItem { bool IsEditable {get;} string Name {get;set;} string InnerValue {get;set;} bool Update(); void Delete(); } public sealed class LocalItem : IServerItem { string name; string value; public LocalItem(string name,string value) { this.name = name; this.value = value; } public bool IsEditable => false; public string Name { get => name; set => throw new NotImplementedException(); } public string InnerValue { get => value; set => throw new NotImplementedException(); } public void Delete() { throw new NotImplementedException(); } public bool Update() { throw new NotImplementedException(); } } public sealed class ServerItem : IServerItem { string oldname; Dictionary dict; public ServerItem(Dictionary dict,string name,string url) { oldname=name; Name = name; InnerValue=url; this.dict=dict; } public bool IsEditable => true; public string Name {get;set;} public string InnerValue { get;set; } public void Delete() { dict.Remove(oldname); TYTDCommon.SaveServers(dict); } public bool Update() { if(oldname != Name) { dict.Remove(oldname); dict.Add(Name,InnerValue); TYTDCommon.SaveServers(dict); return true; } dict[Name]=InnerValue; TYTDCommon.SaveServers(dict); return false; } } public static class ServerItemHandler { public static string AddUnique(this Dictionary items,string key,T value) { string keyOut=key; int i = 2; while(items.ContainsKey(keyOut)) { keyOut = $"{key} ({i++})"; } items.Add(keyOut,value); return keyOut; } private static IEnumerable getNames(this IEnumerable items) { foreach(var item in items) { yield return item.Name; } } public static string[] GetNames(this IEnumerable items) { return items.getNames().ToArray(); } } [Activity(Label = "@string/servers_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = false)] public class ServersActivity : AppCompatActivity { public void UpdateItem(IServerItem item) { var builder=new AndroidX.AppCompat.App.AlertDialog.Builder(this); builder.SetView(Resource.Layout.edit_server); EditText? name =null; EditText? url=null; Button? sftp=null; AndroidX.AppCompat.App.AlertDialog? alert=null; builder.SetNegativeButton(Resource.String.cancel_text,(sender,e)=>{ if(alert != null) alert.Dismiss(); }); builder.SetTitle(Resource.String.edit_server_text); builder.SetPositiveButton(Resource.String.ok_text,(sender,e)=>{ if(svrs != null&&name!= null && url !=null && !string.IsNullOrWhiteSpace(name.Text) && !string.IsNullOrWhiteSpace(url.Text)){ item.Name = name.Text; item.InnerValue = url.Text; if(item.Update()) UpdateLV(); } if(alert != null) alert.Dismiss(); }); alert= builder.Show(); if(alert != null) { //this.GetExternalFilesDirs(null) name=alert.FindViewById(Resource.Id.server_name_field); if(name!= null) name.Text = item.Name; url = alert.FindViewById(Resource.Id.server_uri_field); if(url != null) url.Text = item.InnerValue; sftp = alert.FindViewById