diff --git a/MetaforceInstaller.UI/MainWindow.axaml b/MetaforceInstaller.UI/MainWindow.axaml
index 7b8c85a..8b8276a 100644
--- a/MetaforceInstaller.UI/MainWindow.axaml
+++ b/MetaforceInstaller.UI/MainWindow.axaml
@@ -2,7 +2,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:vm="using:MetaforceInstaller.UI.ViewModels"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+ x:CompileBindings="True"
+ x:DataType="vm:MainWindowViewModel"
x:Class="MetaforceInstaller.UI.MainWindow"
Title="MetaforceInstaller">
@@ -19,6 +22,10 @@
+
+
+
+
@@ -39,27 +46,17 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MetaforceInstaller.UI/MainWindow.axaml.cs b/MetaforceInstaller.UI/MainWindow.axaml.cs
index 975928c..9e5ac6b 100644
--- a/MetaforceInstaller.UI/MainWindow.axaml.cs
+++ b/MetaforceInstaller.UI/MainWindow.axaml.cs
@@ -1,236 +1,40 @@
-using System;
-using System.IO;
-using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Interactivity;
-using Avalonia.Platform.Storage;
-using Avalonia.Threading;
-using Avalonia.VisualTree;
-using MetaforceInstaller.Core.Models;
+using MetaforceInstaller.Core.Intefaces;
using MetaforceInstaller.Core.Services;
+using MetaforceInstaller.UI.ViewModels;
namespace MetaforceInstaller.UI;
public partial class MainWindow : Window
{
- private string? _apkPath;
- private string? _zipPath;
- private AdbService _adbService;
-
- private const int PROGRESS_LOG_STEP = 10;
- private const int PROGRESS_UPDATE_STEP = 1;
-
- private int _lastLoggedProgress = -1;
- private int _lastUpdatedProgress = -1;
+ private MainWindowViewModel _viewModel;
+ private IStorageService _storageService;
public MainWindow()
{
InitializeComponent();
+
+ _viewModel = new MainWindowViewModel();
+ DataContext = _viewModel;
+
+ _storageService = new StorageService();
+
NewInstallationButton.Click += OnNewInstalltionClick;
- // LogMessage("MetaforceInstaller by slavagm");
- //
- // _adbService = new AdbService();
- // _adbService.ProgressChanged += OnAdbProgressChanged;
- // _adbService.StatusChanged += OnAdbStatusChanged;
- //
- // CheckAndEnableInstallButton();
- //
- // ChooseApkButton.Click += OnChooseApkClicked;
- // ChooseContentButton.Click += OnChooseContentClicked;
- // InstallButton.Click += OnInstallClicked;
+
+ LoadInstallations();
+ }
+
+ private void LoadInstallations()
+ {
+ var appData = _storageService.Load();
+ _viewModel.LoadInstallations(appData.Installations);
}
public async void OnNewInstalltionClick(object? sender, RoutedEventArgs e)
{
var newInstallationDialog = new NewInstallationDialog();
await newInstallationDialog.ShowDialog(this);
+ LoadInstallations();
}
-
- // private void OnAdbProgressChanged(object? sender, ProgressInfo e)
- // {
- // Dispatcher.UIThread.InvokeAsync(() =>
- // {
- // if (e.PercentageComplete != _lastUpdatedProgress &&
- // e.PercentageComplete % PROGRESS_UPDATE_STEP == 0)
- // {
- // InstallProgressBar.Value = e.PercentageComplete;
- // _lastUpdatedProgress = e.PercentageComplete;
- // }
- //
- // if (e.PercentageComplete != _lastLoggedProgress &&
- // e.PercentageComplete % PROGRESS_LOG_STEP == 0 || e.PercentageComplete == 100)
- // {
- // LogMessage(
- // e.TotalBytes > 0
- // ? $"Прогресс: {e.PercentageComplete}% ({FormatBytes(e.BytesTransferred)} / {FormatBytes(e.TotalBytes)})"
- // : $"Прогресс: {e.PercentageComplete}%");
- //
- // _lastLoggedProgress = e.PercentageComplete;
- // }
- // });
- // }
- //
- // private void OnProgressReport(ProgressInfo progressInfo)
- // {
- // Dispatcher.UIThread.InvokeAsync(() =>
- // {
- // if (progressInfo.PercentageComplete != _lastUpdatedProgress &&
- // progressInfo.PercentageComplete % PROGRESS_UPDATE_STEP == 0)
- // {
- // InstallProgressBar.Value = progressInfo.PercentageComplete;
- // _lastUpdatedProgress = progressInfo.PercentageComplete;
- // }
- //
- //
- // if (progressInfo.PercentageComplete != _lastLoggedProgress &&
- // (progressInfo.PercentageComplete % PROGRESS_LOG_STEP == 0 || progressInfo.PercentageComplete == 100))
- // {
- // LogMessage(
- // progressInfo.TotalBytes > 0
- // ? $"Прогресс: {progressInfo.PercentageComplete}% ({FormatBytes(progressInfo.BytesTransferred)} / {FormatBytes(progressInfo.TotalBytes)})"
- // : $"Прогресс: {progressInfo.PercentageComplete}%");
- //
- // _lastLoggedProgress = progressInfo.PercentageComplete;
- // }
- // });
- // }
- //
- // private void OnAdbStatusChanged(object? sender, string e)
- // {
- // Dispatcher.UIThread.InvokeAsync(() =>
- // {
- // InstallProgressBar.Value = 0;
- // _lastLoggedProgress = -1;
- // _lastUpdatedProgress = -1;
- // LogMessage(e);
- // });
- // }
- //
- // private string FormatBytes(long bytes)
- // {
- // string[] suffixes = ["B", "KB", "MB", "GB", "TB"];
- // var counter = 0;
- // double number = bytes;
- //
- // while (Math.Round(number / 1024) >= 1)
- // {
- // number /= 1024;
- // counter++;
- // }
- //
- // return $"{number:N1} {suffixes[counter]}";
- // }
- //
- //
- // private async void CheckAndEnableInstallButton()
- // {
- // InstallButton.IsEnabled = !string.IsNullOrEmpty(_apkPath) && !string.IsNullOrEmpty(_zipPath);
- // }
- //
- // private async void OnChooseApkClicked(object? sender, RoutedEventArgs e)
- // {
- // var topLevel = GetTopLevel(this);
- // var files = await topLevel!.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
- // {
- // Title = "Выберите APK файл",
- // AllowMultiple = false,
- // FileTypeFilter = new[]
- // {
- // new FilePickerFileType("APK Files")
- // {
- // Patterns = new[] { "*.apk" }
- // }
- // }
- // });
- //
- // if (files.Count >= 1)
- // {
- // _apkPath = files[0].Path.LocalPath;
- // LogMessage($"APK выбран: {Path.GetFileName(_apkPath)}");
- // }
- //
- // CheckAndEnableInstallButton();
- // }
- //
- // private async void OnChooseContentClicked(object? sender, RoutedEventArgs e)
- // {
- // var topLevel = GetTopLevel(this);
- // var files = await topLevel!.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
- // {
- // Title = "Выберите архив с контентом",
- // AllowMultiple = false,
- // FileTypeFilter = new[]
- // {
- // new FilePickerFileType("ZIP Files")
- // {
- // Patterns = new[] { "*.zip" }
- // }
- // }
- // });
- //
- // if (files.Count >= 1)
- // {
- // _zipPath = files[0].Path.LocalPath;
- // LogMessage($"Контент выбран: {Path.GetFileName(_zipPath)}");
- // }
- //
- // CheckAndEnableInstallButton();
- // }
- //
- // private async void OnInstallClicked(object? sender, RoutedEventArgs e)
- // {
- // if (string.IsNullOrEmpty(_apkPath) || string.IsNullOrEmpty(_zipPath))
- // {
- // LogMessage("Ошибка: Выберите APK файл и папку с контентом");
- // return;
- // }
- //
- // _adbService.RefreshDeviceData();
- //
- // InstallButton.IsEnabled = false;
- // InstallProgressBar.Value = 0;
- //
- // try
- // {
- // LogMessage("Начинаем установку...");
- //
- // var deviceInfo = _adbService.GetDeviceInfo();
- // LogMessage($"Найдено устройство: {deviceInfo.SerialNumber}");
- // LogMessage($"Состояние: {deviceInfo.State}");
- // LogMessage($"Модель: {deviceInfo.Model} - {deviceInfo.Name}");
- //
- // var progress = new Progress(OnProgressReport);
- //
- // await _adbService.InstallApkAsync(_apkPath, progress);
- //
- // var apkInfo = ApkScrapper.GetApkInfo(_apkPath);
- // LogMessage($"Ставим {apkInfo.PackageName} версии {apkInfo.VersionName}");
- // var zipName = Path.GetFileName(_zipPath);
- // var outputPath =
- // @$"/storage/emulated/0/Android/data/{apkInfo.PackageName}/files/{zipName}";
- // LogMessage($"Начинаем копирование контента в {outputPath}");
- //
- // await _adbService.CopyFileAsync(_zipPath, outputPath, progress);
- //
- // LogMessage("Установка завершена успешно!");
- // }
- // catch (Exception ex)
- // {
- // LogMessage($"Ошибка установки: {ex.Message}");
- // }
- // finally
- // {
- // InstallButton.IsEnabled = true;
- // InstallProgressBar.Value = 0;
- // }
- // }
- //
- // private void LogMessage(string message)
- // {
- // var timestamp = DateTime.Now.ToString("HH:mm:ss");
- // LogsTextBox.Text += $"[{timestamp}] {message}\n";
- //
- // var scrollViewer = LogsTextBox.FindAncestorOfType();
- // scrollViewer?.ScrollToEnd();
- // }
}
\ No newline at end of file
diff --git a/MetaforceInstaller.UI/ViewModels/MainWindowViewModel.cs b/MetaforceInstaller.UI/ViewModels/MainWindowViewModel.cs
new file mode 100644
index 0000000..6a81dcd
--- /dev/null
+++ b/MetaforceInstaller.UI/ViewModels/MainWindowViewModel.cs
@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+using MetaforceInstaller.Core.Models;
+
+namespace MetaforceInstaller.UI.ViewModels;
+
+public class MainWindowViewModel : INotifyPropertyChanged
+{
+ public event PropertyChangedEventHandler? PropertyChanged;
+
+ public ObservableCollection Installations { get; set; } = new();
+
+ public void LoadInstallations(IEnumerable data)
+ {
+ Installations.Clear();
+ foreach (var installation in data)
+ {
+ Installations.Add(installation);
+ }
+ }
+
+ protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+}
\ No newline at end of file