Files
ZuneShell.dll/ZuneShell/ZuneUI/JumpListManager.cs
T

211 lines
9.6 KiB
C#
Raw Normal View History

2021-02-21 21:52:41 -06:00
// Decompiled with JetBrains decompiler
// Type: ZuneUI.JumpListManager
// 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.Shell;
using Microsoft.Zune.Util;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading;
namespace ZuneUI
{
public class JumpListManager : SingletonModelItem<JumpListManager>
{
private const int _maxPins = 6;
private const int _maxQuickMixes = 5;
private const int _normalIconIndex = -12;
private const int _quickMixIconIndex = -13;
private Command _updatePins;
private IList _pinList;
private IList _quickMixList;
private bool _pinListsHaveBeenSetAtLeastOnce;
private bool _finalCommitHasBeenCompleted;
private bool _showResumeNowPlaying;
private bool _currentPlaylistWillBeSaved;
private bool _transportControlsHavePlaylist;
private string _resumeNowPlayingName;
private string _shuffleAllName;
private string _pinCategoryName;
private string _quickMixCategoryName;
private static int _lastUpdateJobCookie = 0;
private static object _updateJobLock = new object();
public JumpListManager()
: base(SingletonModelItem<TransportControls>.Instance)
2021-02-21 21:52:41 -06:00
{
this._updatePins = new Command(this);
2021-02-21 21:52:41 -06:00
this._pinListsHaveBeenSetAtLeastOnce = false;
this._finalCommitHasBeenCompleted = false;
this._showResumeNowPlaying = false;
this._resumeNowPlayingName = Shell.LoadString(StringId.IDS_JUMP_LIST_RESUME_NOWPLAYING);
this._shuffleAllName = Shell.LoadString(StringId.IDS_JUMP_LIST_SHUFFLE_ALL);
this._pinCategoryName = Shell.LoadString(StringId.IDS_JUMP_LIST_QUICKPLAY_CATEGORY);
this._quickMixCategoryName = Shell.LoadString(StringId.IDS_JUMP_LIST_QUICKMIX_CATEGORY);
2021-02-21 21:52:41 -06:00
SingletonModelItem<TransportControls>.Instance.PropertyChanged += new PropertyChangedEventHandler(this.OnTransportControlsPropertyChanged);
ZuneApplication.Closing += new EventHandler(this.OnApplicationClosing);
}
protected override void OnDispose(bool disposing)
{
if (disposing)
{
ZuneApplication.Closing -= new EventHandler(this.OnApplicationClosing);
SingletonModelItem<TransportControls>.Instance.PropertyChanged -= new PropertyChangedEventHandler(this.OnTransportControlsPropertyChanged);
}
base.OnDispose(disposing);
}
public Command JumpListPinUpdateRequested => this._updatePins;
public void SetPins(IList pinList, IList quickMixList)
{
this._pinList = pinList;
this._quickMixList = quickMixList;
this._pinListsHaveBeenSetAtLeastOnce = true;
this.UpdateJumpList();
}
public static void PlayPin(JumpListPin pin)
{
if (pin == null)
return;
SingletonModelItem<TransportControls>.Instance.RequestedJumpListPin = pin;
}
private void OnTransportControlsPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == "HasPlaylist" || args.PropertyName == "Playing")
{
TransportControls instance = SingletonModelItem<TransportControls>.Instance;
bool flag = instance.HasPlaylist && !instance.Playing;
if (this._showResumeNowPlaying != flag)
{
this._showResumeNowPlaying = flag;
this.UpdateJumpList();
}
this._transportControlsHavePlaylist = instance.HasPlaylist;
}
else
{
if (!(args.PropertyName == "CurrentPlaylist"))
return;
this._currentPlaylistWillBeSaved = SingletonModelItem<TransportControls>.Instance.WillSaveCurrentPlaylistOnShutdown();
}
}
private void OnApplicationClosing(object sender, EventArgs args)
{
if (!this._currentPlaylistWillBeSaved)
this._showResumeNowPlaying = false;
else if (this._transportControlsHavePlaylist)
this._showResumeNowPlaying = true;
this.UpdateJumpList();
this._finalCommitHasBeenCompleted = true;
}
private void UpdateJumpList()
{
if (!OSVersion.IsWin7() || !this._pinListsHaveBeenSetAtLeastOnce || this._finalCommitHasBeenCompleted)
return;
UpdateJumpListJob updateJumpListJob = new UpdateJumpListJob();
updateJumpListJob.Cookie = Interlocked.Increment(ref _lastUpdateJobCookie);
2021-02-21 21:52:41 -06:00
updateJumpListJob.ShowResumeNowPlaying = this._showResumeNowPlaying;
updateJumpListJob.ResumeNowPlayingName = this._resumeNowPlayingName;
updateJumpListJob.ShuffleAllName = this._shuffleAllName;
updateJumpListJob.PinCategoryName = this._pinCategoryName;
updateJumpListJob.QuickMixCategoryName = this._quickMixCategoryName;
updateJumpListJob.PinList = new JumpListPin[this._pinList.Count];
for (int index = 0; index < this._pinList.Count; ++index)
updateJumpListJob.PinList[index] = new JumpListPin((JumpListPin)this._pinList[index]);
updateJumpListJob.QuickMixList = new JumpListPin[this._quickMixList.Count];
for (int index = 0; index < this._quickMixList.Count; ++index)
updateJumpListJob.QuickMixList[index] = new JumpListPin((JumpListPin)this._quickMixList[index]);
ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateJumpListWorker), updateJumpListJob);
2021-02-21 21:52:41 -06:00
}
private static void UpdateJumpListWorker(object data)
{
if (!(data is UpdateJumpListJob updateJumpListJob))
2021-02-21 21:52:41 -06:00
return;
lock (_updateJobLock)
2021-02-21 21:52:41 -06:00
{
if (_lastUpdateJobCookie != updateJumpListJob.Cookie)
2021-02-21 21:52:41 -06:00
return;
List<JumpListEntry> disallowedDestinationList = null;
2021-02-21 21:52:41 -06:00
JumpListSession session;
HRESULT hresult = Win7ShellManager.Instance.BeginJumpListSession(out session);
2021-02-21 21:52:41 -06:00
if (hresult.IsSuccess)
hresult = session.GetDisallowedDestinations(out disallowedDestinationList);
2021-02-21 21:52:41 -06:00
if (hresult.IsSuccess)
{
List<string> disallowedCommandLineArguments = disallowedDestinationList.ConvertAll(rawEntry => rawEntry.CommandLineArguments);
2021-02-21 21:52:41 -06:00
JumpListEntry task;
if (updateJumpListJob.ShowResumeNowPlaying)
{
session.CreateTask(out task);
task.Name = updateJumpListJob.ResumeNowPlayingName;
task.CommandLineArguments = "/resumenowplaying";
task.IconIndex = -12;
}
session.CreateTask(out task);
task.Name = updateJumpListJob.ShuffleAllName;
task.CommandLineArguments = "/shuffleall";
task.IconIndex = -12;
JumpListCategory category;
if (updateJumpListJob.PinList != null && updateJumpListJob.PinList.Length > 0)
{
session.CreateCategory(out category);
category.Name = updateJumpListJob.PinCategoryName;
for (int index = 0; index < 6 && index < updateJumpListJob.PinList.Length; ++index)
PopulateJumpListIfPossible(category, updateJumpListJob.PinList[index], -12, disallowedCommandLineArguments);
2021-02-21 21:52:41 -06:00
}
if (updateJumpListJob.QuickMixList != null && updateJumpListJob.QuickMixList.Length > 0)
{
session.CreateCategory(out category);
category.Name = updateJumpListJob.QuickMixCategoryName;
for (int index = 0; index < 5 && index < updateJumpListJob.QuickMixList.Length; ++index)
PopulateJumpListIfPossible(category, updateJumpListJob.QuickMixList[index], -13, disallowedCommandLineArguments);
2021-02-21 21:52:41 -06:00
}
session.Commit();
}
else
session?.Cancel();
}
}
private static void PopulateJumpListIfPossible(
JumpListCategory category,
JumpListPin pin,
int iconIndex,
List<string> disallowedCommandLineArguments)
{
string str = string.Format("/playpin:{0}", pin.ToString());
2021-02-21 21:52:41 -06:00
if (disallowedCommandLineArguments.Contains(str))
return;
JumpListEntry destination;
category.CreateDestination(out destination);
destination.Name = pin.Name;
destination.CommandLineArguments = str;
destination.IconIndex = iconIndex;
}
private class UpdateJumpListJob
{
public int Cookie;
public bool ShowResumeNowPlaying;
public string ResumeNowPlayingName;
public string ShuffleAllName;
public string PinCategoryName;
public string QuickMixCategoryName;
public JumpListPin[] PinList;
public JumpListPin[] QuickMixList;
}
}
}