// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.
using Plugin.Settings;
using Plugin.Settings.Abstractions;
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace MyDriving.Utils
{
public enum LoginAccount
{
None = 0,
Facebook = 1,
Microsoft = 2,
Twitter = 3,
}
///
/// This is the Settings static class that can be used in your Core solution or in any
/// of your client applications. All settings are laid out the same exact way with getters
/// and setters.
///
public class Settings : INotifyPropertyChanged
{
const string DatabaseIdKey = "azure_database";
const string LoginAccountKey = "login_account";
const string DeviceIdKey = "device_id";
const string HostNameKey = "host_name";
const string DeviceConnectionStringKey = "device_connection_string";
const string MetricDistanceKey = "metric_distance";
const string MetricUnitsKey = "metric_units";
const string FirstRunKey = "first_run";
const string LoginAttemptsKey = "login_attempts";
const int LoginAttemptsDefault = 0;
const string HasSyncedDataKey = "has_synced";
const bool HasSyncedDataDefault = false;
const string LastSyncKey = "last_sync";
static Settings _settings;
static readonly int DatabaseIdDefault = 0;
static readonly LoginAccount LoginAccountDefault = LoginAccount.None;
static readonly string DeviceIdDefault = string.Empty;
static readonly string HostNameDefault = string.Empty;
static readonly string DeviceConnectionStringDefault = string.Empty;
static readonly bool MetricDistanceDefault = false;
static readonly bool MetricUnitsDefault = false;
static readonly bool FirstRunDefault = true;
static readonly DateTime LastSyncDefault = DateTime.Now.AddDays(-30);
bool isConnected;
static ISettings AppSettings => CrossSettings.Current;
///
/// Gets or sets the current settings. This should always be used
///
/// The current.
public static Settings Current => _settings ?? (_settings = new Settings());
public int DatabaseId
{
get { return AppSettings.GetValueOrDefault(DatabaseIdKey, DatabaseIdDefault); }
set { AppSettings.AddOrUpdateValue(DatabaseIdKey, value); }
}
public LoginAccount LoginAccount
{
get { return (LoginAccount) AppSettings.GetValueOrDefault(LoginAccountKey, (int) LoginAccountDefault); }
set
{
if (AppSettings.AddOrUpdateValue(LoginAccountKey, (int) value))
OnPropertyChanged();
}
}
public string DeviceId
{
get { return AppSettings.GetValueOrDefault(DeviceIdKey, DeviceIdDefault); }
set
{
if (AppSettings.AddOrUpdateValue(DeviceIdKey, value))
OnPropertyChanged();
}
}
public string HostName
{
get { return AppSettings.GetValueOrDefault(HostNameKey, HostNameDefault); }
set
{
if (AppSettings.AddOrUpdateValue(HostNameKey, value))
{
//if hostname is changed, DeviceConnectionString must be recreated
DeviceConnectionString = string.Empty;
OnPropertyChanged();
}
}
}
public string DeviceConnectionString
{
get { return AppSettings.GetValueOrDefault(DeviceConnectionStringKey, DeviceConnectionStringDefault); }
set
{
if (AppSettings.AddOrUpdateValue(DeviceConnectionStringKey, value))
OnPropertyChanged();
}
}
public bool MetricDistance
{
get { return AppSettings.GetValueOrDefault(MetricDistanceKey, MetricDistanceDefault); }
set
{
if (AppSettings.AddOrUpdateValue(MetricDistanceKey, value))
OnPropertyChanged();
}
}
public bool MetricUnits
{
get { return AppSettings.GetValueOrDefault(MetricUnitsKey, MetricUnitsDefault); }
set
{
if (AppSettings.AddOrUpdateValue(MetricUnitsKey, value))
OnPropertyChanged();
}
}
///
/// Gets or sets a value indicating whether the user wants to see favorites only.
///
/// true if favorites only; otherwise, false.
public bool FirstRun
{
get { return AppSettings.GetValueOrDefault(FirstRunKey, FirstRunDefault); }
set
{
if (AppSettings.AddOrUpdateValue(FirstRunKey, value))
OnPropertyChanged();
}
}
public bool IsLoggedIn
=> !string.IsNullOrWhiteSpace(AuthToken) && !string.IsNullOrWhiteSpace(AzureMobileUserId);
public int LoginAttempts
{
get { return AppSettings.GetValueOrDefault(LoginAttemptsKey, LoginAttemptsDefault); }
set { AppSettings.AddOrUpdateValue(LoginAttemptsKey, value); }
}
public bool HasSyncedData
{
get { return AppSettings.GetValueOrDefault(HasSyncedDataKey, HasSyncedDataDefault); }
set { AppSettings.AddOrUpdateValue(HasSyncedDataKey, value); }
}
public DateTime LastSync
{
get { return AppSettings.GetValueOrDefault(LastSyncKey, LastSyncDefault); }
set
{
if (AppSettings.AddOrUpdateValue(LastSyncKey, value))
OnPropertyChanged();
}
}
public bool IsConnected
{
get { return isConnected; }
set
{
if (isConnected == value)
return;
isConnected = value;
OnPropertyChanged();
}
}
public int UpdateDatabaseId()
{
return DatabaseId++;
}
#region User Profile
const string UserUIDKey = "user_uid";
static readonly string UserUIDDefault = string.Empty;
public string UserUID
{
get { return AppSettings.GetValueOrDefault(UserUIDKey, UserUIDDefault); }
set { AppSettings.AddOrUpdateValue(UserUIDKey, value); }
}
const string AzureMobileUserIdKey = "user_azure_id";
static readonly string AzureMobileUserIdDefault = string.Empty;
public string AzureMobileUserId
{
get { return AppSettings.GetValueOrDefault(AzureMobileUserIdKey, AzureMobileUserIdDefault); }
set { AppSettings.AddOrUpdateValue(AzureMobileUserIdKey, value); }
}
const string AuthTokenKey = "authtoken";
static readonly string AuthTokenDefault = string.Empty;
public string AuthToken
{
get { return AppSettings.GetValueOrDefault(AuthTokenKey, AuthTokenDefault); }
set { AppSettings.AddOrUpdateValue(AuthTokenKey, value); }
}
const string FirstNameKey = "user_firstname";
static readonly string FirstNameDefault = string.Empty;
public string UserFirstName
{
get { return AppSettings.GetValueOrDefault(FirstNameKey, FirstNameDefault); }
set { AppSettings.AddOrUpdateValue(FirstNameKey, value); }
}
const string LastNameKey = "user_lastname";
static readonly string LastNameDefault = string.Empty;
public string UserLastName
{
get { return AppSettings.GetValueOrDefault(LastNameKey, LastNameDefault); }
set { AppSettings.AddOrUpdateValue(LastNameKey, value); }
}
const string ProfileUrlKey = "user_profile_url";
static readonly string ProfileUrlDefault = string.Empty;
public string UserProfileUrl
{
get { return AppSettings.GetValueOrDefault(ProfileUrlKey, ProfileUrlDefault); }
set { AppSettings.AddOrUpdateValue(ProfileUrlKey, value); }
}
public void Logout()
{
AuthToken = string.Empty;
UserProfileUrl = string.Empty;
UserFirstName = string.Empty;
UserLastName = string.Empty;
AzureMobileUserId = string.Empty;
UserUID = string.Empty;
LoginAccount = LoginAccount.None;
}
#endregion
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string name = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
#endregion
}
}