simplenotesdroid/NoteActivity.cs

127 lines
4.5 KiB
C#

using System.Net;
using System.Net.Http.Json;
using System.Text.Json.Serialization;
using Android.Views;
using AndroidX.AppCompat.App;
using Google.Android.Material.Color;
using Google.Android.Material.FloatingActionButton;
using Google.Android.Material.Snackbar;
using Google.Android.Material.TextField;
namespace SimpleNotes;
[Activity(Label = "@string/note_page",Theme ="@style/Theme.SimpleNotes")]
public class NoteActivity : AppCompatActivity
{
public override bool OnCreateOptionsMenu(IMenu? menu)
{
MenuInflater.Inflate(Resource.Menu.menu_note,menu);
return true;
}
Func<Task>? Save;
public override bool OnOptionsItemSelected(IMenuItem item)
{
int id=item.ItemId;
if(id == Resource.Id.action_save)
{
if(Save != null)
Task.Run(Save).Wait(0);
}
return base.OnOptionsItemSelected(item);
}
protected override async void OnCreate(Bundle? savedInstanceState)
{
base.OnCreate(savedInstanceState);
DynamicColors.ApplyToActivityIfAvailable(this);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_note);
SetSupportActionBar(FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Id.toolbar2));
var (endpoint,username,password) = MainActivity.GetPrefs(this);
//check for id
var note_title = FindViewById<TextInputEditText>(Resource.Id.note_title);
var note_body = FindViewById<TextInputEditText>(Resource.Id.note_body);
if(note_title == null || note_body == null) return;
long id = Intent?.GetLongExtra("note_id",0) ?? 0;
if(id > 0)
{
if(!string.IsNullOrWhiteSpace(endpoint) && !string.IsNullOrWhiteSpace(username) && !string.IsNullOrWhiteSpace(password))
{
var request = new HttpRequestMessage(HttpMethod.Get,$"{endpoint}/api/note?id={id}");
request.Headers.Add("Authorization",$"Basic {Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes($"{username}:{password}"))}");
var response=await MainActivity.Client.SendAsync(request);
var note = response.StatusCode == HttpStatusCode.OK ? (await response.Content.ReadFromJsonAsync<_NoteResponse>())?.Note : null;
if(note != null)
{
note_title.Text = note.Title;
this.Title = note.Title;
note_body.Text = note.Body;
}
}
}
note_title.TextChanged += (sender,e)=>{
this.Title = note_title.Text;
};
async Task<long> SaveNote(Note note)
{
var request = new HttpRequestMessage(HttpMethod.Post,$"{endpoint}/api/note");
request.Headers.Add("Authorization",$"Basic {Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes($"{username}:{password}"))}");
request.Content = new System.Net.Http.StringContent(System.Text.Json.JsonSerializer.Serialize(note),new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));
var result=await MainActivity.Client.SendAsync(request);
if(result.StatusCode == HttpStatusCode.OK)
{
var res2=await result.Content.ReadFromJsonAsync<_NoteResponse>();
return res2?.Note?.Id ?? 0;
}
return 0;
}
Save = async()=>{
var note = new Note();
note.Id = id;
this.RunOnUiThread(()=>{
note.Title = note_title.Text ?? "";
note.Body = note_body.Text ?? "";
});
if(!string.IsNullOrWhiteSpace(endpoint) && !string.IsNullOrWhiteSpace(username) && !string.IsNullOrWhiteSpace(password))
{
id=await Task.Run(async()=>await SaveNote(note));
this.RunOnUiThread(()=>{
Toast.MakeText(this,"Saved Note",ToastLength.Long)?.Show();
});
}
};
}
}
public class _NoteResponse
{
[JsonPropertyName("success")]
public bool Success {get;set;}
[JsonPropertyName("note")]
public Note Note {get;set;}=new Note();
}
public class Note
{
[JsonPropertyName("id")]
public long Id {get;set;}
[JsonPropertyName("title")]
public string Title {get;set;}="";
[JsonPropertyName("body")]
public string Body {get;set;}="";
}