// Decompiled with JetBrains decompiler // Type: ZuneUI.SyncControls // Assembly: ZuneShell, Version=4.7.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217 // MVID: FC8028F3-A47B-4FB4-B35B-11D1752D8264 // Assembly location: C:\Program Files\Zune\ZuneShell.dll using Microsoft.Iris; using Microsoft.Zune.Configuration; using Microsoft.Zune.Shell; using Microsoft.Zune.Util; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.IO; using UIXControls; namespace ZuneUI { public class SyncControls : ModelItem { private UIDeviceList _deviceList; private UIDevice _currentDevice; private UIDevice _deferredArrivalDevice; private string _canonicalNameToMakeActive; private bool _changeIntoSetupDevice; private Command _deviceSignInFailureEvent; private Queue _failedSignInQueue; private DownloadTaskList _downloadTasks; private bool _haveSeenDownloadsOngoing; private MessageBox _currentUnlinkedDeviceDialog; private bool _showSyncInstructionsToast; private bool _displayWirelessSyncBanner; private static string _sizeInKB = Shell.LoadString(StringId.IDS_GAS_GAUGE_SIZE_IN_KB); private static string _sizeInMB = Shell.LoadString(StringId.IDS_GAS_GAUGE_SIZE_IN_MB); private static string _sizeInGB = Shell.LoadString(StringId.IDS_GAS_GAUGE_SIZE_IN_GB); private static long _devicelandKilobyte = 1024; private static long _devicelandMegabyte = DevicelandKilobyte * DevicelandKilobyte; private static long _devicelandGigabyte = DevicelandMegabyte * DevicelandKilobyte; private static SyncControls s_singletonInstance; private static string _unlinkedDeviceNagDialogTitle = Shell.LoadString(StringId.IDS_DIALOG_TITLE_LINK_TO_SYNC_FRIENDS); private static string _unlinkedDeviceNagDialogMessageBase = Shell.LoadString(StringId.IDS_DIALOG_TEXT_LINK_TO_SYNC_FRIENDS); private SyncControls(IModelItemOwner owner) : base(owner) { this._deviceList = SingletonModelItem.Instance; this._deviceList.DeviceAddedEvent += new DeviceListEventHandler(this.OnDeviceAdded); this._deviceList.DeviceRemovedEvent += new DeviceListEventHandler(this.OnDeviceRemoved); this._deviceList.DeviceConnectedEvent += new DeviceListEventHandler(this.OnDeviceConnected); this._deviceList.DeviceDisconnectedEvent += new DeviceListEventHandler(this.OnDeviceDisconnected); this._currentDevice = UIDeviceList.NullDevice; SignIn.Instance.PropertyChanged += new PropertyChangedEventHandler(this.SignInPropertyChanged); AccountCreationWizard.CreationCompleted += new EventHandler(this.AccountCreationFinished); DeviceManagement.DeviceConnectionHandled += new DeviceConnectionHandledEventHandler(this.OnDeviceConnectionHandled); this.UpdateWirelessSyncBannerDisplay(); } protected override void OnDispose(bool fDisposing) { if (fDisposing) { if (this._deviceList != null) { this._deviceList.DeviceAddedEvent -= new DeviceListEventHandler(this.OnDeviceAdded); this._deviceList.DeviceRemovedEvent -= new DeviceListEventHandler(this.OnDeviceRemoved); this._deviceList.DeviceConnectedEvent -= new DeviceListEventHandler(this.OnDeviceConnected); this._deviceList.DeviceDisconnectedEvent -= new DeviceListEventHandler(this.OnDeviceDisconnected); this._deviceList = null; } if (this._downloadTasks != null) { this._downloadTasks.ActiveDownloads.PropertyChanged -= new PropertyChangedEventHandler(this.OnDownloadPropertyChanged); this._downloadTasks = null; } SignIn.Instance.PropertyChanged -= new PropertyChangedEventHandler(this.SignInPropertyChanged); AccountCreationWizard.CreationCompleted -= new EventHandler(this.AccountCreationFinished); DeviceManagement.DeviceConnectionHandled -= new DeviceConnectionHandledEventHandler(this.OnDeviceConnectionHandled); } base.OnDispose(fDisposing); } public bool ShowPhoneWelcomeMessage { get => ClientConfiguration.FUE.ShowPhoneFUEDeviceLandOptions; set { if (ClientConfiguration.FUE.ShowPhoneFUEDeviceLandOptions == value) return; ClientConfiguration.FUE.ShowPhoneFUEDeviceLandOptions = value; this.FirePropertyChanged(nameof(ShowPhoneWelcomeMessage)); } } public bool ShowSyncInstructionsToast { get => this._showSyncInstructionsToast; set { if (this._showSyncInstructionsToast == value) return; if (this.CurrentDevice.Class == DeviceClass.Classic || this.CurrentDevice.Class == DeviceClass.ZuneHD) { bool flag = value && ClientConfiguration.Devices.ShowSyncInstructionsToast; value = flag; ClientConfiguration.Devices.ShowSyncInstructionsToast = flag; } this._showSyncInstructionsToast = value; this.FirePropertyChanged(nameof(ShowSyncInstructionsToast)); } } public bool DisplayWirelessSyncBanner { get => this._displayWirelessSyncBanner && !this.CurrentDevice.IsWirelessSyncEnabled; set { if (this._displayWirelessSyncBanner == value) return; this._displayWirelessSyncBanner = value; this.FirePropertyChanged(nameof(DisplayWirelessSyncBanner)); } } public UIDevice CurrentDevice { get => this._currentDevice ?? UIDeviceList.NullDevice; private set { if (this._currentDevice == value) return; this._currentDevice = value ?? UIDeviceList.NullDevice; PhoneBrandingStringMap.Instance.BrandingEnabled = this._currentDevice != null && this._currentDevice.SupportsBrandingType(DeviceBranding.WindowsPhone); KinBrandingStringMap.Instance.BrandingEnabled = this._currentDevice != null && this._currentDevice.SupportsBrandingType(DeviceBranding.Kin); this.FirePropertyChanged(nameof(CurrentDevice)); } } public UIDevice CurrentDeviceOverride => DeviceManagement.SetupDevice ?? this.CurrentDevice; public bool ChangeIntoSetupDevice { get => this._changeIntoSetupDevice; set { if (this._changeIntoSetupDevice == value) return; this._changeIntoSetupDevice = value; this.FirePropertyChanged(nameof(ChangeIntoSetupDevice)); } } public Command DeviceSignInFailureEvent { get { if (this._deviceSignInFailureEvent == null) this._deviceSignInFailureEvent = new Command(this); return this._deviceSignInFailureEvent; } } public Queue FailedSignInDevices { get { if (this._failedSignInQueue == null) this._failedSignInQueue = new Queue(); return this._failedSignInQueue; } } public UIDevice CurrentFailedSignInDevice { get { try { return this.FailedSignInDevices.Peek(); } catch (InvalidOperationException ex) { return UIDeviceList.NullDevice; } } } public void SetCurrentDevice(UIDevice device) { if (device == null) device = UIDeviceList.NullDevice; if (this._canonicalNameToMakeActive != null && device.CanonicalName != null && device.CanonicalName.StartsWith(this._canonicalNameToMakeActive)) { this._canonicalNameToMakeActive = null; if ((!(ZuneShell.DefaultInstance.CurrentPage is QuickplayPage) || !ClientConfiguration.FUE.ShowArtistChooser) && (ZuneShell.DefaultInstance.Management.CurrentCategoryPage == null || !ZuneShell.DefaultInstance.Management.CurrentCategoryPage.IsWizard)) ZuneShell.DefaultInstance.NavigateToPage(new Deviceland()); } if (device == this.CurrentDevice) return; Management management = null; CategoryPage categoryPage = null; if (ZuneShell.DefaultInstance != null) management = ZuneShell.DefaultInstance.Management; if (management != null) categoryPage = management.CurrentCategoryPage; categoryPage?.RestartSyncIfNecessary(); this.CurrentDevice = device; ClientConfiguration.Devices.CurrentDeviceID = this.CurrentDevice.ID; categoryPage?.PauseSyncIfNecessary(); management?.DisposeDeviceManagement(false); } public void Phase3Init() { this._downloadTasks = DownloadTaskList.Instance; this._downloadTasks.ActiveDownloads.PropertyChanged += new PropertyChangedEventHandler(this.OnDownloadPropertyChanged); this._haveSeenDownloadsOngoing = this._downloadTasks.ActiveDownloads.Count > 0; } public void SetCurrentDeviceByCanonicalName(string canonicalName) { this._canonicalNameToMakeActive = canonicalName.ToLower(); if (this._deviceList == null) return; foreach (UIDevice device in this._deviceList) { if (device.IsConnectedToClient && device.CanonicalName.StartsWith(this._canonicalNameToMakeActive)) { this.SetCurrentDevice(device); break; } } } public void SetCurrentDeviceIfNecessary(UIDevice device, bool comingOutOfFirstConnect) { if (!device.IsConnectedToClientPhysically) return; this.SetCurrentDevice(device); if (comingOutOfFirstConnect) return; this.ShowUnlinkedDeviceNagDialogIfNecessary(); } public UIDevice FindNewActiveDevice() => this.FindNewActiveDevice(null); public UIDevice FindNewActiveDevice(UIDevice excludedDevice) { foreach (UIDevice device in this._deviceList) { if (device != excludedDevice) return device; } return null; } public void DeleteCurrentDevice() { if (!this.CurrentDevice.IsValid) return; MessageBox.Show(Shell.LoadString(StringId.IDS_DELETE_DIALOG_TITLE), Shell.LoadString(StringId.IDS_DELETE_DIALOG_TEXT), new EventHandler(this.ConfirmedDeleteDevice)); } private void ConfirmedDeleteDevice(object sender, EventArgs e) { if (this.CurrentDevice.IsGuest || !this.CurrentDevice.SupportsWirelessSetupMethod1 && !this.CurrentDevice.SupportsWirelessSetupMethod2) this.DeleteCurrentDeviceWorker(); else WirelessSync.Instance.ClearWirelessOnDeviceForForget(); } public void DeleteCurrentDeviceWorker() { if (this.CurrentDevice == null) return; string message = this.CurrentDevice.SupportsBrandingType(DeviceBranding.WindowsPhone) ? Shell.LoadString(StringId.IDS_PHONE_FORGET_DEVICE_DIALOG_CONTENT) : Shell.LoadString(StringId.IDS_FORGET_DEVICE_DIALOG_CONTENT); ZuneShell.DefaultInstance.Management.CommitList.RemoveByIntValue(this.CurrentDevice.ID); HRESULT hresult = this._deviceList.DeleteDevice(this.CurrentDevice); if (hresult.IsError) Shell.ShowErrorDialog(hresult.Int, StringId.IDS_DELETE_DEVICE_FAILED); else MessageBox.Show(Shell.LoadString(StringId.IDS_FORGET_DEVICE_DIALOG_TITLE), message, null); } public void PromptForAccountLinkage() => this.ShowUnlinkedDeviceNagDialog(false); public void HideWirelessSyncBanner() { ClientConfiguration.Devices.ConnectionsUntilWirelessSyncBannerDisplay = -1; this.UpdateWirelessSyncBannerDisplay(); } public void AddDeviceToFailedSignInQueue(UIDevice device) { device.IsLockedAgainstSyncing = true; this.FailedSignInDevices.Enqueue(device); if (this.FailedSignInDevices.Count != 1) return; this.ShowFailedSignInMessageBox(); } public void HandleFailedSignInDevice(string username, string password) { this.CurrentFailedSignInDevice.SendMarketplaceCredentials(username, password); this.IgnoreFailedSignInDevice(); } public void IgnoreFailedSignInDevice() { try { UIDevice uiDevice = this.FailedSignInDevices.Dequeue(); uiDevice.IsLockedAgainstSyncing = false; uiDevice.BeginSync(); } catch (InvalidOperationException ex) { } if (this.FailedSignInDevices.Count <= 0) return; this.ShowFailedSignInMessageBox(); } public void HandleFailedSignInDeviceGuidMismatch() { string message = string.IsNullOrEmpty(this.CurrentFailedSignInDevice.ZuneTag) ? string.Format(Shell.LoadString(StringId.IDS_DEVICE_CREDS_GUID_MISMATCH_TEXT_UNKNONW_ZUNETAG), CurrentFailedSignInDevice.Name, SignIn.Instance.ZuneTag) : string.Format(Shell.LoadString(StringId.IDS_DEVICE_CREDS_GUID_MISMATCH_TEXT), CurrentFailedSignInDevice.Name, CurrentFailedSignInDevice.ZuneTag, SignIn.Instance.ZuneTag); MessageBox.Show(Shell.LoadString(StringId.IDS_DEVICE_CREDS_GUID_MISMATCH_TITLE), message, new Command(this, Shell.LoadString(StringId.IDS_ENTER_CREDENTIALS), delegate { this.DeviceSignInFailureEvent.Invoke(); }), null, delegate { this.IgnoreFailedSignInDevice(); }, true); } private void ShowFailedSignInMessageBox() { string message = string.IsNullOrEmpty(this.CurrentFailedSignInDevice.ZuneTag) ? string.Format(Shell.LoadString(StringId.IDS_DEVICE_SIGN_IN_FAILURE_TEXT_UNKNONW_ZUNETAG), CurrentFailedSignInDevice.Name) : string.Format(Shell.LoadString(StringId.IDS_DEVICE_SIGN_IN_FAILURE_TEXT), CurrentFailedSignInDevice.Name, CurrentFailedSignInDevice.ZuneTag); MessageBox.Show(Shell.LoadString(StringId.IDS_DEVICE_SIGN_IN_FAILURE_TITLE), message, new Command(this, Shell.LoadString(StringId.IDS_ENTER_CREDENTIALS), delegate { this.DeviceSignInFailureEvent.Invoke(); }), null, delegate { this.IgnoreFailedSignInDevice(); }, true); } private void OnFUECompleted(object sender, EventArgs args) { Fue.FUECompleted -= new EventHandler(this.OnFUECompleted); if (this._deferredArrivalDevice != null) this.OnDeviceConnected(null, new DeviceListEventArgs(this._deferredArrivalDevice)); this._deferredArrivalDevice = null; } private void OnDeviceConnected(object sender, DeviceListEventArgs args) { if (args.Device.SupportsBrandingType(DeviceBranding.WindowsPhone) && ZuneApplication.IsDesktopLocked && !args.Device.IsConnectedToClientWirelessly) SingletonModelItem.Instance.HideDevice(args.Device); else if (Fue.Instance.IsFirstLaunch) { if (ZuneApplication.InstallContext != SetupInstallContext.Zune && args.Device.SupportsBrandingType(DeviceBranding.WindowsPhone) && !args.Device.RequiresAutoRestore) return; this._deferredArrivalDevice = args.Device; Fue.FUECompleted += new EventHandler(this.OnFUECompleted); } else { DeviceManagement.SetupQueue[args.Device.ID] = args.Device; if (ClientConfiguration.Devices.ConnectionsUntilWirelessSyncBannerDisplay > 0) --ClientConfiguration.Devices.ConnectionsUntilWirelessSyncBannerDisplay; this.UpdateWirelessSyncBannerDisplay(); } } private void OnDeviceDisconnected(object sender, DeviceListEventArgs args) { if (this._deferredArrivalDevice == args.Device) { this._deferredArrivalDevice = null; Fue.FUECompleted -= new EventHandler(this.OnFUECompleted); } else { if (args.Device == this.CurrentDevice) { ZuneShell.DefaultInstance.Management.DisposeDeviceManagement(false); this.HideUnlinkedDeviceNagDialog(); foreach (UIDevice device in this._deviceList) { if (device != args.Device && device.IsConnectedToClientPhysically) { this.SetCurrentDevice(device); break; } } } if (DeviceManagement.SetupDevice != args.Device) return; ZuneShell.DefaultInstance.Management.AlertedDeviceCategory = null; } } private void OnDeviceAdded(object sender, DeviceListEventArgs args) { if (args.Device.ID != ClientConfiguration.Devices.CurrentDeviceID && ClientConfiguration.Devices.CurrentDeviceID != 0 && (this.CurrentDevice.IsConnectedToClient || !args.Device.IsConnectedToClient)) return; this.SetCurrentDevice(args.Device); } private void OnDeviceRemoved(object sender, DeviceListEventArgs args) { if (args.Device != this.CurrentDevice) return; this.SetCurrentDevice(this.FindNewActiveDevice(this.CurrentDevice)); } private void OnDeviceConnectionHandled(object sender, DeviceConnectionHandledEventArgs args) { if (!args.IsFirstConnect) return; ClientConfiguration.Devices.ConnectionsUntilWirelessSyncBannerDisplay = 1; this.UpdateWirelessSyncBannerDisplay(); } private void UpdateWirelessSyncBannerDisplay() => this.DisplayWirelessSyncBanner = ClientConfiguration.Devices.ConnectionsUntilWirelessSyncBannerDisplay == 0; private void OnDownloadPropertyChanged(object sender, PropertyChangedEventArgs args) { if (!(args.PropertyName == "Count")) return; if (this._downloadTasks.ActiveDownloads.Count > 0) { this._haveSeenDownloadsOngoing = true; } else { if (!this._haveSeenDownloadsOngoing) return; foreach (UIDevice device in this._deviceList) { if (device.IsConnectedToClient) device.BeginSync(true, true); } this._haveSeenDownloadsOngoing = false; } } private void SignInPropertyChanged(object sender, PropertyChangedEventArgs args) { if (!(args.PropertyName == "SignedIn") || !SignIn.Instance.SignedIn) return; this.ShowUnlinkedDeviceNagDialogIfNecessary(); } private void AccountCreationFinished(object sender, EventArgs args) => this.ShowUnlinkedDeviceNagDialogIfNecessary(); private void ShowUnlinkedDeviceNagDialogIfNecessary() { if (!this.CurrentDevice.PromptForAccountLinkage || this.CurrentDevice.IsGuest || (this.CurrentDevice.UserId != 0 || !this.CurrentDevice.IsConnectedToClientPhysically) || (!this.CurrentDevice.SupportsZuneTagLinking || !SignIn.Instance.SignedIn || (AccountCreationWizard.AccountCreationInProgress || ZuneShell.DefaultInstance.CurrentPage is DialogPage))) return; this.ShowUnlinkedDeviceNagDialog(true); } private void ShowUnlinkedDeviceNagDialog(bool allowUserToOptOut) { if (!SettingsExperience.ShouldShowDeviceMarketplaceCategory) return; this.HideUnlinkedDeviceNagDialog(); SQMLog.Log(SQMDataId.UnlinkedDeviceNagDialogShow, 1); UIDevice device = this.CurrentDevice; BooleanChoice optOutChoice = null; Command okCommand = new Command(this, DialogHelper.DialogYes, delegate { SQMLog.Log(SQMDataId.UnlinkedDeviceNagDialogYes, 1); Shell.SettingsFrame.Settings.Device.Invoke(SettingCategories.DeviceMarketplace); }); EventHandler cancelCommand = delegate { SQMLog.Log(SQMDataId.UnlinkedDeviceNagDialogNo, 1); if (optOutChoice == null || optOutChoice.Value) return; SQMLog.Log(SQMDataId.UnlinkedDeviceNagDialogNoShow, 1); }; if (allowUserToOptOut) { optOutChoice = new BooleanChoice(); optOutChoice.Value = !device.PromptForAccountLinkage; optOutChoice.ChosenChanged += delegate { device.PromptForAccountLinkage = !optOutChoice.Value; }; optOutChoice.Description = Shell.LoadString(StringId.IDS_DONT_SHOW_THIS_MESSAGE_AGAIN); } this._currentUnlinkedDeviceDialog = MessageBox.Show(_unlinkedDeviceNagDialogTitle, string.Format(_unlinkedDeviceNagDialogMessageBase, device.Name), DialogHelper.DialogNo, true, okCommand, null, null, cancelCommand, optOutChoice); } private void HideUnlinkedDeviceNagDialog() { if (this._currentUnlinkedDeviceDialog == null || this._currentUnlinkedDeviceDialog.WouldLikeToBeHidden) return; this._currentUnlinkedDeviceDialog.Hide(); } public static int ConvertSyncOperationToInt(ESyncOperation operation) => (int)operation; public static int ConvertSyncStateToInt(ESyncState state) => (int)state; public static int ConvertSyncStatusToInt(TrackSyncStatus status) => (int)status; public static int GetGasGaugeSegmentWidth( int maxWidth, long size, long totalSize, int margins) { totalSize = Math.Max(totalSize, 1L); size = Math.Max(size, 0L); return Math.Max((int)Math.Min(maxWidth * size / totalSize, maxWidth - margins), 0); } public static long DevicelandKilobyte => _devicelandKilobyte; public static long DevicelandMegabyte => _devicelandMegabyte; public static long DevicelandGigabyte => _devicelandGigabyte; public static string FormatLongAsSize(long sizeInBytes) { if (sizeInBytes < DevicelandMegabyte && sizeInBytes != 0L) return string.Format(_sizeInKB, (float)(sizeInBytes / (double)DevicelandKilobyte)); return sizeInBytes < DevicelandGigabyte ? string.Format(_sizeInMB, (float)(sizeInBytes / (double)DevicelandMegabyte)) : string.Format(_sizeInGB, (float)(sizeInBytes / (double)DevicelandGigabyte)); } public void BrowseAndReplaceMedia(IList items, int mediaType) => FileOpenDialog.Show(Shell.LoadString(StringId.IDS_OPEN_FILE_DIALOG_TITLE), ZuneShell.DefaultInstance.Management.MediaFolder, args => { string path = (string)args; if (string.IsNullOrEmpty(path)) return; Shell.DeleteMedia(items, false); Application.DeferredInvoke(delegate { try { if (!ZuneApplication.ZuneLibrary.CanAddMedia(path, (EMediaTypes)mediaType)) return; ZuneApplication.ZuneLibrary.AddMedia(path); } catch (UnauthorizedAccessException ex) { } catch (IOException ex) { } }, null); }); public static SyncControls Instance { get { if (s_singletonInstance == null) s_singletonInstance = new SyncControls(ZuneShell.DefaultInstance); return s_singletonInstance; } } } }