From b8e44b918469cbde2f03cb2423d5dd3d2009dd01 Mon Sep 17 00:00:00 2001 From: sensboston Date: Tue, 14 Jul 2015 00:48:23 -0400 Subject: [PATCH] added notification sound editor added extended capability ID_CAP_SOUND_CONTROL (for the ARM release) some minor fixes and improvements --- WPTweaker/AboutPage.xaml | 24 ++- WPTweaker/Assets/AppBar/none.png | Bin 0 -> 3603 bytes WPTweaker/Assets/AppBar/play.png | Bin 0 -> 2151 bytes WPTweaker/Common/EmulatorData.cs | 137 +++++++++++++ WPTweaker/Common/RegistryEntry.cs | 2 +- WPTweaker/Controls/RingtoneChooser.xaml | 26 +++ WPTweaker/Controls/RingtoneChooser.xaml.cs | 108 ++++++++++ WPTweaker/{ => Controls}/XmlEditorPage.xaml | 0 .../{ => Controls}/XmlEditorPage.xaml.cs | 0 WPTweaker/MainPage.xaml | 2 +- WPTweaker/MainPage.xaml.cs | 187 +++++++++++++----- WPTweaker/Properties/ARM/WMAppManifest.xml | 67 +++++++ WPTweaker/Properties/AssemblyInfo.cs | 4 +- .../Properties/Emulator/WMAppManifest.xml | 66 +++++++ WPTweaker/Properties/WMAppManifest.xml | 10 +- WPTweaker/Registry.dll | Bin 0 -> 85504 bytes WPTweaker/Registry.winmd | Bin 0 -> 6656 bytes WPTweaker/Tweaks.xml | 2 +- WPTweaker/WPInteropManifest.xml | 3 + WPTweaker/WPTweaker.csproj | 39 +++- 20 files changed, 610 insertions(+), 67 deletions(-) create mode 100644 WPTweaker/Assets/AppBar/none.png create mode 100644 WPTweaker/Assets/AppBar/play.png create mode 100644 WPTweaker/Common/EmulatorData.cs create mode 100644 WPTweaker/Controls/RingtoneChooser.xaml create mode 100644 WPTweaker/Controls/RingtoneChooser.xaml.cs rename WPTweaker/{ => Controls}/XmlEditorPage.xaml (100%) rename WPTweaker/{ => Controls}/XmlEditorPage.xaml.cs (100%) create mode 100644 WPTweaker/Properties/ARM/WMAppManifest.xml create mode 100644 WPTweaker/Properties/Emulator/WMAppManifest.xml create mode 100644 WPTweaker/Registry.dll create mode 100644 WPTweaker/Registry.winmd create mode 100644 WPTweaker/WPInteropManifest.xml diff --git a/WPTweaker/AboutPage.xaml b/WPTweaker/AboutPage.xaml index c3a4680..b870cfc 100644 --- a/WPTweaker/AboutPage.xaml +++ b/WPTweaker/AboutPage.xaml @@ -20,14 +20,14 @@ - + - - - + + + @@ -37,7 +37,7 @@ - + developed by XDA member sensboston @@ -50,16 +50,22 @@ Special thanks to - vcfan - and + vcfan and -W_O_L_F- for their research and hacks! + + + Sound editor source code adapted from + + wphTweaks project + by Jaxbot and jessenic + - - + + diff --git a/WPTweaker/Assets/AppBar/none.png b/WPTweaker/Assets/AppBar/none.png new file mode 100644 index 0000000000000000000000000000000000000000..4f87f9b1a17bdf39144a54125545769f4af73b58 GIT binary patch literal 3603 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 Z{{!Tny3j8iH*Ej_002ovPDHLkV1k;1F3JD^ literal 0 HcmV?d00001 diff --git a/WPTweaker/Assets/AppBar/play.png b/WPTweaker/Assets/AppBar/play.png new file mode 100644 index 0000000000000000000000000000000000000000..841341bfd60e78a297b9e6fbf580d80f0338f74d GIT binary patch literal 2151 zcmV-t2$=VYP)EEEiaC#6m$Rh(aMWRS*Oru^J=Md6T}eKg!T3Hm!l>^dZ}dsf>EG*W~rqh zeyCldcAi>NES!Df-=z5aC2<|DpT+$(yf5jr=$W3Leu$VjL(F6YO!=GC{=!G1ssA}G ztRIo~@)l_$FU-x&J)(Lae#dpV9{1sX@v-r|n*qV^!_0IFa4=1szvYw3|A@&!0_h6^ z>|L4}`$C>+`|w;mAMe5YeD*7i59iA0PWoUdOV|BLOnpVu`OT%Jr6+Xs5AVVI@Ls&% z&n%?t{#adIea=e2H#Rn2gG%PXz%sRAV*1mtM|3SS0R2FJ&@YdE&(iFD-zva`3Yb-l zZ0h&cMKHOtvhuV|eMf%;_!rSn4_V)7MW>+#dW@2Ph^bS=+%t6f9!n+T9`q0WM1MW_ z8BC>84;ty^(9qER)PVs-=T?OZ_Qu%Q*aI#o0O%+BE7Z_c1#hEpTbNidFDN?oFO8b^ zg@uL3TvT__Z}cC0D8$W#HfvUl@CyprJw}U8tHq+kx5xn>;72Cw>9)9u+P`i;OB_yeC3;D3VzXoOn$nZjYz zYnv+A2-OmNf?o;nJ)ypkR`l07J$(DF5bqc2VB`sWf?x2>0T1^_n3~EB$=4kw%kKF^ z6A}0Y-x56LLkSfs7S1cQ$h?$jLIU5iAPn5gb;);{E=Oc~I0C?lCMNJN)8lFVJ6Y31 zp$5^{oMHgaz;Nj5>bkF)K?ncBfXXmZV4)^|JU#4N$teHDRZFuGmMid(;B+qNV$s5V zK{$g*lQ|H>U7^_>kU7cn`TXG^qx`JI#P4W`5#TThw@3%)DnO{vul2Q8GRjAE7(mbr zbVZUvHk?Kzqy6ogOnv&>3N0GPbS$25GSR465>7Lh7S&_GiE|MsZ-&QAGRlY2>GYGD zRI%2w_kQmR@W2N+aibj;y~@9Gl9A=>2xn>3e_N|Q_?Ro=1~>sPX3(CM-UP=ybHinw z-ot9p#fM))K8x+33vc9QPH%@hW!DXe=5xVVqSHDx77p|>OYgMpnhg5LWtS0ON4W*G zlL387DUURRF8cJl&EiIQWT$)?OA^sCsN4GV0$ud$wyokuSgC`Yh^dem@Do%|3Htvg zb~YGrBzb~vySM>vz>g6zN6Ifc&U~3$*m`0!=(dU*;Kt>0RwOGS48<_>w~5rZprG3* zZh#x`Q@RD{KjX{=y(ZkZwSaD$xB+gGft)UP*kl-aZX`{(9?)$PH^7gR>&0*$wtYyl zR6lePbX&v?@B@ylzK#es)9Dm-`jD%jm#kQ16B}Gi4*^F;1hyB|8!os?)8IvyK`-Ma zX+qopKW?ig{q0BA62+#enVFe~qX2qo`=V}f1N?v^XK=DnBJ5T(C<{Xe-ITZij;z`U zp8z){qXxPOal`Guf_g3ky+5j;>l8P@kxQ>maJlB#M;T?%b@}LlqYU(>8|gxIJ7IF9 zH=9h?W;k&&9WHd)6gVG6&~>{AB-+a;emE0#J>7&eOrfU_!y;{uvPEhtsI9O_d%@(< zDEeMZr*9~HFW(dcsZsMX+K{Lu^D?5ISSb%Z7a@PT6)AZ#e>zfKN~`Q-6e35kG;IiA zC?ZGMdl>-|ebSj2sQ~<^ge9bikzT8q3Jzxjz+1N4-uH~Sf8tj~LaII(eu zpCa$2t=f8;bS1;fw5viziVUypt|U@~ksQfoG#dN#B1JCa2q%XQ+n%*+BJ37~R9U;y zfg%z9#`Dun2AG48B0oJV-B(ICd}rHE3|+qOkQPwcP7L{;Qq&*hN^2P0b9CE<9T*_h zo}-FvUCC%4Ful9Zh2;Ng3skYY?yBbl;2Yo;0$uw^0lMwmT&hX6k93!At{Cm-;vLie zH5S>9>0)RufUbE^GTP(X0K2i0)&?lLaf1*SJB_Pgu-2!n3dU&Q2a3x6vvIu_<>D!; z_mZQv@zq-O&f{@qBk6)Kt!#w)3Uxgk(+vGjUx;W|u{nB&(AiS0F7*_HU38FdWy~WdR>=SUq*5YbX}hrmQNBfJMXW zsH6H3SG=Ja>!;J-@1U}uuIYy2YS)|mq<}lRLz%^+ELDg8Mfpq&=;FrCJQXs2*duBm zwbNh5jUTZlw3=>@2)^^@9F>eg?WewY7*K7f-s90}Cr|W3V7cZ>(HaV`@l;`e@BPxpO* df^fF-_CJgFBTi>Mfqwu1002ovPDHLkV1lI97McJ6 literal 0 HcmV?d00001 diff --git a/WPTweaker/Common/EmulatorData.cs b/WPTweaker/Common/EmulatorData.cs new file mode 100644 index 0000000..2c32cdc --- /dev/null +++ b/WPTweaker/Common/EmulatorData.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WPTweaker +{ + class EmulatorData + { +#if !ARM + public static List SoundFiles = new List() + { + "1_VZW_Airwaves.wma", "2_VZW_ Cube.wma", "AchievementNotifyPopup.wav", "Ahh Glitch.wma", "Alarm-01.wma", "Alarm-02.wma", + "Alarm-03.wma", "Alarm-04.wma", "Alarm-05.wma", "Alarm-06.wma", "Alert-01.wma", "Alert-02.wma", "Alert-03.wma", "Alert-04.wma", + "Alert-05.wma", "Alert-06.wma", "Alert-07.wma", "Alert-08.wma", "Alert-09.wma", "Alert-10.wma", "Alert_calendar.wma", "Alert_charging.wma", + "Alert_find_phone.wma", "Alert_low_battery.wma", "Alert_nudge.wma", "Applebite.wma", "Bird Box.wma", "Bouncey Bounce.wma", "Brikabrak.wma", + "Brimful.wma", "Broken Tone.wma", "Busy.wav", "BusyCDMA.wav", "BusyCDMA_Nokia.wav", "Busy_Nokia.wav", "Calldrop.wav", "Calldrop_Nokia.wav", + "Callwait.wav", "Callwait_Nokia.wav", "Cat.wma", "Chipper.wma", "Circles.wma", "CMAS.wma", "Congestion.wav", "Congestion_Nokia.wav", + "CopyPaste.wav", "Default.wav", "Dewdrop.wma", "Digital Thump.wma", "Disconnct.wav", "dtmf0.wav", "dtmf1.wav", "dtmf2.wav", "dtmf3.wav", + "dtmf4.wav", "dtmf5.wav", "dtmf6.wav", "dtmf7.wav", "dtmf8.wav", "dtmf9.wav", "dtmfast.wav", "dtmfpd.wav", "Earl's Torch.wma", + "Good Times.wma", "HWandSW.wav", "ImeAddToDictionary.wav", "ImeBluebirdOOV.wav", "ImeSelectCandidate.wav", "InCallBuzz.wma", + "Just Ice.wma", "KbdAccentPicker.wav", "KbdFunction.wav", "KbdKeyTap.wav", "KbdSpacebar.wav", "lock.wav", "Lucky Five.wma", + "Macro.wma", "Marbles.wma", "Miniature of Troy.wma", "Moanday.wma", "NfcInRange.wma", "NfcPaymentFail.wma", "NfcPaymentSuccess.wma", + "NfcTransactionComplete.wma", "Nokia calendar.wma", "Nokia clock.wma", "Nokia email.wma", "Nokia message.wma", "Nokia Tune Remix.wma", + "Nokia Tune.wma", "Nostalgia.wma", "Pinball.wma", "PingRing.wav", "Pip.wav", "Pool.wma", "Remind.wma", "Reorder.wav", "Reorder_Nokia.wav", + "Ring01.wma", "Ring02.wma", "Ring03.wma", "Ring04.wma", "Ring05.wma", "Ring06.wma", "Ring07.wma", "Ring08.wma", "Ring09.wma", "Ring10.wma", + "Ring11.wma", "Ring12.wma", "Ring13.wma", "Ring14.wma", "Ring15.wma", "Ring16.wma", "Ring17.wma", "Ring18.wma", "Ring19.wma", "Ring20.wma", + "Ring21.wma", "ringback.wav", "Ruby.wma", "Skate.wma", "Slow Coffee.wma", "Standard.wav", "Sweets.wma", "unlock.wav", "Voiceprvcy.wav", + "Warped.wma", "WiFiConnected.wav", "WiFiDisconnected.wav" + }; + + + public static Dictionary NotificationEventValues = new Dictionary() + { + { "Achievement", @"C:\Programs\CommonFiles\Sounds\AchievementNotifyPopup.wav" }, + { "Alarm", @"C:\Programs\CommonFiles\Sounds\Alarm-01.wma" }, + { "BatteryCharging", @"C:\Programs\CommonFiles\Sounds\Alert_charging.wma" }, + { "BusyCDMA", @"C:\Programs\CommonFiles\Sounds\BusyCDMA_Nokia.wav" }, + { "BusyTone", @"C:\Programs\CommonFiles\Sounds\Busy_Nokia.wav" }, + { "CallDrop", @"C:\Programs\CommonFiles\Sounds\Calldrop_Nokia.wav" }, + { "CallWaiting", @"C:\Programs\CommonFiles\Sounds\Callwait_Nokia.wav" }, + { "Camera", @"" }, + { "CellBroadcast", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "Clock", @"C:\Programs\CommonFiles\Sounds\Alarm-01.wma" }, + { "CMAS", @"C:\Programs\CommonFiles\Sounds\CMAS.wma" }, + { "Congestion", @"C:\Programs\CommonFiles\Sounds\Congestion_Nokia.wav" }, + { "CopyPaste", @"C:\Programs\CommonFiles\Sounds\CopyPaste.wav" }, + { "DownloadComplete", @"*none*" }, + { "Dtmf#", @"C:\Programs\CommonFiles\Sounds\Dtmfpd.wav" }, + { "Dtmf*", @"C:\Programs\CommonFiles\Sounds\Dtmfast.wav" }, + { "Dtmf0", @"C:\Programs\CommonFiles\Sounds\Dtmf0.wav" }, + { "Dtmf1", @"C:\Programs\CommonFiles\Sounds\Dtmf1.wav" }, + { "Dtmf2", @"C:\Programs\CommonFiles\Sounds\Dtmf2.wav" }, + { "Dtmf3", @"C:\Programs\CommonFiles\Sounds\Dtmf3.wav" }, + { "Dtmf4", @"C:\Programs\CommonFiles\Sounds\Dtmf4.wav" }, + { "Dtmf5", @"C:\Programs\CommonFiles\Sounds\Dtmf5.wav" }, + { "Dtmf6", @"C:\Programs\CommonFiles\Sounds\Dtmf6.wav" }, + { "Dtmf7", @"C:\Programs\CommonFiles\Sounds\Dtmf7.wav" }, + { "Dtmf8", @"C:\Programs\CommonFiles\Sounds\Dtmf8.wav" }, + { "Dtmf9", @"C:\Programs\CommonFiles\Sounds\Dtmf9.wav" }, + { "E-mail", @"C:\Programs\CommonFiles\Sounds\Alert-08.wma" }, + { "FindPhone", @"C:\Programs\CommonFiles\Sounds\Alert_find_phone.wma" }, + { "IM", @"C:\Programs\CommonFiles\Sounds\Alert-10.wma" }, + { "ImeAddToDictionary", @"ImeAddToDictionary.wav" }, + { "ImeBluebirdOOV", @"ImeBluebirdOOV.wav" }, + { "ImeSelectCandidate", @"ImeSelectCandidate.wav" }, + { "InCallBuzz", @"C:\Programs\CommonFiles\Sounds\InCallBuzz.wma" }, + { "InCallDtmf#", @"C:\Programs\CommonFiles\Sounds\Dtmfpd.wav" }, + { "InCallDtmf*", @"C:\Programs\CommonFiles\Sounds\Dtmfast.wav" }, + { "InCallDtmf0", @"C:\Programs\CommonFiles\Sounds\Dtmf0.wav" }, + { "InCallDtmf1", @"C:\Programs\CommonFiles\Sounds\Dtmf1.wav" }, + { "InCallDtmf2", @"C:\Programs\CommonFiles\Sounds\Dtmf2.wav" }, + { "InCallDtmf3", @"C:\Programs\CommonFiles\Sounds\Dtmf3.wav" }, + { "InCallDtmf4", @"C:\Programs\CommonFiles\Sounds\Dtmf4.wav" }, + { "InCallDtmf5", @"C:\Programs\CommonFiles\Sounds\Dtmf5.wav" }, + { "InCallDtmf6", @"C:\Programs\CommonFiles\Sounds\Dtmf6.wav" }, + { "InCallDtmf7", @"C:\Programs\CommonFiles\Sounds\Dtmf7.wav" }, + { "InCallDtmf8", @"C:\Programs\CommonFiles\Sounds\Dtmf8.wav" }, + { "InCallDtmf9", @"C:\Programs\CommonFiles\Sounds\Dtmf9.wav" }, + { "InCallVoiceText", @"C:\Programs\CommonFiles\Sounds\Callwait.wav" }, + { "Infbeg", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "Infend", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "InfInt", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "Interrupt", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "Keypress", @"C:\Programs\CommonFiles\Sounds\HWandSW.wav" }, + { "KnownCallerRing0", @"" }, + { "LoudestInCallVolume", @"" }, + { "Lowbattery", @"C:\Programs\CommonFiles\Sounds\Alert_low_battery.wma" }, + { "Mail", @"C:\Programs\CommonFiles\Sounds\Alert-08.wma" }, + { "Netbegin", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "Netend", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "NetInt", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "NetworkDrop", @"C:\Programs\CommonFiles\Sounds\Calldrop_Nokia.wav" }, + { "NfcInRange", @"C:\Programs\CommonFiles\Sounds\NfcInRange.wma" }, + { "NfcPaymentFail", @"C:\Programs\CommonFiles\Sounds\NfcPaymentFail.wma" }, + { "NfcPaymentSuccess", @"C:\Programs\CommonFiles\Sounds\NfcPaymentSuccess.wma" }, + { "NfcTransactionComplete", @"C:\Programs\CommonFiles\Sounds\NfcTransactionComplete.wma" }, + { "NfcTransactionCompleteShort", @"C:\Programs\CommonFiles\Sounds\NfcTransactionComplete.wma" }, + { "Notification", @"C:\Programs\CommonFiles\Sounds\default.wav" }, + { "NotificationToast", @"C:\Programs\CommonFiles\Sounds\Alert-05.wma" }, + { "Password", @"*none*" }, + { "PhoneLocked", @"C:\Programs\CommonFiles\Sounds\lock.wav" }, + { "PhoneUnlocked", @"C:\Programs\CommonFiles\Sounds\unlock.wav" }, + { "PhotoScroll", @"C:\Programs\CommonFiles\Sounds\default.wav" }, + { "PingRing", @"C:\Programs\CommonFiles\Sounds\PingRing.wav" }, + { "Pip", @"C:\Programs\CommonFiles\Sounds\PIP.wav" }, + { "Reminder", @"C:\Programs\CommonFiles\Sounds\Nokia calendar.wma" }, + { "Reorder", @"C:\Programs\CommonFiles\Sounds\Reorder_Nokia.wav" }, + { "Ringback", @"C:\Programs\CommonFiles\Sounds\ringback.wav" }, + { "Ringout", @"C:\Programs\CommonFiles\Sounds\Callwait.wav" }, + { "RingPreview", @"" }, + { "RingTone", @"C:\Programs\CommonFiles\Sounds\2_VZW_ Cube.wma" }, + { "RingVoiceText", @"C:\Programs\CommonFiles\Sounds\Ring01.wma" }, + { "ScreenOff", @"C:\Programs\CommonFiles\Sounds\lock.wav" }, + { "ScreenOn", @"C:\Programs\CommonFiles\Sounds\unlock.wav" }, + { "Shutdown", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "SMS", @"C:\Programs\CommonFiles\Sounds\Nokia message.wma" }, + { "SMSNudge", @"C:\Programs\CommonFiles\Sounds\Alert_nudge.wma" }, + { "StartButton", @"C:\Programs\CommonFiles\Sounds\default.wav" }, + { "SystemAsterisk", @"C:\Programs\CommonFiles\Sounds\default.wav" }, + { "SystemDefault", @"C:\Programs\CommonFiles\Sounds\default.wav" }, + { "SystemExclamation", @"C:\Programs\CommonFiles\Sounds\default.wav" }, + { "SystemHand", @"C:\Programs\CommonFiles\Sounds\default.wav" }, + { "SystemQuestion", @"C:\Programs\CommonFiles\Sounds\default.wav" }, + { "SystemStart", @"*none*" }, + { "Toolkit", @"C:\Programs\CommonFiles\Sounds\default.wav" }, + { "TransferComplete", @"C:\Programs\CommonFiles\Sounds\transfercomplete.wav" }, + { "VoiceMail", @"C:\Programs\CommonFiles\Sounds\Nokia email.wma" }, + { "VoicePrivacyDrop", @"C:\Programs\CommonFiles\Sounds\voiceprvcy.wav" }, + { "Warning", @"C:\Programs\CommonFiles\Sounds\Remind.wma" }, + { "WiFiConnected", @"C:\Programs\CommonFiles\Sounds\WiFiConnected.wav" }, + { "WiFiDisconnected", @"C:\Programs\CommonFiles\Sounds\WiFiDisconnected.wav" }, + }; +#endif + } +} diff --git a/WPTweaker/Common/RegistryEntry.cs b/WPTweaker/Common/RegistryEntry.cs index b2d2c8b..4b44383 100644 --- a/WPTweaker/Common/RegistryEntry.cs +++ b/WPTweaker/Common/RegistryEntry.cs @@ -98,7 +98,7 @@ public static bool IsInteropUnlocked() return true; #endif } - public RegistryEntry(string fullPath, string keyName, RegDataType dataType, object defaultValue, string comparer, Int64 min = Int64.MinValue, Int64 max = Int64.MaxValue) + public RegistryEntry(string fullPath, string keyName, RegDataType dataType, object defaultValue = null, string comparer = "", Int64 min = Int64.MinValue, Int64 max = Int64.MaxValue) { if (fullPath.StartsWith("HKEY_CLASSES_ROOT") || fullPath.StartsWith("HKCR")) Hive = RegistryHive.HKEY_CLASSES_ROOT; else if (fullPath.StartsWith("HKEY_LOCAL_MACHINE") || fullPath.StartsWith("HKLM")) Hive = RegistryHive.HKEY_LOCAL_MACHINE; diff --git a/WPTweaker/Controls/RingtoneChooser.xaml b/WPTweaker/Controls/RingtoneChooser.xaml new file mode 100644 index 0000000..bae4350 --- /dev/null +++ b/WPTweaker/Controls/RingtoneChooser.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WPTweaker/Controls/RingtoneChooser.xaml.cs b/WPTweaker/Controls/RingtoneChooser.xaml.cs new file mode 100644 index 0000000..7e50cdb --- /dev/null +++ b/WPTweaker/Controls/RingtoneChooser.xaml.cs @@ -0,0 +1,108 @@ +// Used source code from https://github.com/jessenic/wph-tweaks/blob/master/HomebrewHelperWP/Filesystem/RingtoneChooser.xaml.cs +// by Jaxbot, by jessenic +// +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.IO; +using System.IO.IsolatedStorage; +using System.Runtime.CompilerServices; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Input; +using System.Windows.Media; +using System.ComponentModel; + +namespace WPTweaker +{ + public partial class RingtoneChooser : UserControl + { + public string SelectedRingtone { get; set; } + + IsolatedStorageFile isfStore = IsolatedStorageFile.GetUserStoreForApplication(); + string _isfRootPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path; + + public RingtoneChooser() + { + this.InitializeComponent(); + } + + private void Image_Tap(object sender, GestureEventArgs e) + { + var file = (RingtoneListItem)((Image)sender).DataContext; + if (file != null && !file.DisplayName.Contains("none")) + { +#if ARM + string fileName = file.DisplayName + ".tmp"; + try + { + // Copy file to the isf + File.Copy(file.FullPath, Path.Combine(_isfRootPath, fileName), true); + using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Open, isfStore)) + { + mediaElement.SetSource(stream); + mediaElement.Play(); + } + isfStore.DeleteFile(fileName); + } + catch { } +#else + MessageBox.Show(file.FullPath); +#endif + } + } + + private void RingtoneChooser_Loaded(object sender, RoutedEventArgs e) + { + RingtoneListItem item = new RingtoneListItem("none"); + RingtoneList.Items.Add(item); + if (this.SelectedRingtone != null && this.SelectedRingtone.ToLower().Equals("none")) + { + this.RingtoneList.SelectedItem = item; + } +#if ARM + string[] sourceDirs = new string[] { "C:\\Data\\Users\\Public\\Ringtones", "C:\\Programs\\CommonFiles\\Sounds" }; +#else + string[] sourceDirs = new string[] { "C:\\Programs\\CommonFiles\\Sounds" }; +#endif + foreach (var dir in sourceDirs) + { +#if ARM + string[] files = Directory.GetFiles(dir, "*.*"); +#else + string[] files = EmulatorData.SoundFiles.Select(f => Path.Combine(dir, f)).ToArray(); +#endif + foreach (var str in files) + { + item = new RingtoneListItem(str); + RingtoneList.Items.Add(item); + if (this.SelectedRingtone != null && str.Equals(this.SelectedRingtone, StringComparison.InvariantCultureIgnoreCase)) + { + this.RingtoneList.SelectedItem = item; + } + } + } + } + + private void RingtoneList_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (RingtoneList.SelectedItem != null) + { + SelectedRingtone = ((RingtoneListItem)this.RingtoneList.SelectedItem).FullPath; + } + } + + public class RingtoneListItem + { + public string DisplayName { get; set; } + public string FullPath { get; set; } + public string ImageSource + { + get { return DisplayName.Contains("none") ? "/Assets/AppBar/none.png" : "/Assets/AppBar/play.png"; } + } + public RingtoneListItem(string fullPath) { DisplayName = Path.GetFileNameWithoutExtension(fullPath); FullPath = fullPath; } + } + } +} \ No newline at end of file diff --git a/WPTweaker/XmlEditorPage.xaml b/WPTweaker/Controls/XmlEditorPage.xaml similarity index 100% rename from WPTweaker/XmlEditorPage.xaml rename to WPTweaker/Controls/XmlEditorPage.xaml diff --git a/WPTweaker/XmlEditorPage.xaml.cs b/WPTweaker/Controls/XmlEditorPage.xaml.cs similarity index 100% rename from WPTweaker/XmlEditorPage.xaml.cs rename to WPTweaker/Controls/XmlEditorPage.xaml.cs diff --git a/WPTweaker/MainPage.xaml b/WPTweaker/MainPage.xaml index a6b94ba..9df2c59 100644 --- a/WPTweaker/MainPage.xaml +++ b/WPTweaker/MainPage.xaml @@ -10,7 +10,7 @@ FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" - SupportedOrientations="Portrait" Orientation="Landscape" + SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True"> diff --git a/WPTweaker/MainPage.xaml.cs b/WPTweaker/MainPage.xaml.cs index 0b5c2f9..9d00031 100644 --- a/WPTweaker/MainPage.xaml.cs +++ b/WPTweaker/MainPage.xaml.cs @@ -17,6 +17,8 @@ using Windows.Storage.Pickers; using Windows.ApplicationModel.Activation; using WPTweaker.Resources; +using System.Reflection; +using Microsoft.Phone.Net.NetworkInformation; namespace WPTweaker { @@ -30,6 +32,7 @@ public partial class MainPage : PhoneApplicationPage public MainPage() { + ParseTheme(); InitializeComponent(); @@ -213,34 +216,79 @@ void BuildUI() brushes.Add(Application.Current.Resources["TweakOddBackgroundBrush"] as SolidColorBrush); LayoutRoot.Items.Clear(); - var categories = _tweaks.Select(t => t.Category).Distinct(); - if (_settings.SortTweaks) categories = categories.OrderBy(t => t); + var categories = _tweaks.Select(t => t.Category).Distinct().ToList(); + categories.Add("Sounds"); + if (_settings.SortTweaks) categories = categories.OrderBy(t => t).ToList(); foreach (var category in categories) { - var tweaksByCategory = _tweaks.Where(t => t.Category.Equals(category)); - if (_settings.SortTweaks) tweaksByCategory = tweaksByCategory.OrderBy(t => t.Name); var pivotItem = new PivotItem() { Header = category }; var content = new StackPanel(); - int i = 0; - foreach (var tweak in tweaksByCategory) + + // Special event notification sounds tweaks + if (category.Equals("Sounds")) { - tweak.Background = brushes[++i % 2]; - dynamic tweakControl = null; - switch (tweak.Type) - { - case TweakType.Toggle: tweakControl = new ToggleTweak(tweak); break; - case TweakType.Enum: tweakControl = new EnumTweak(tweak); break; - case TweakType.Input: tweakControl = new InputTweak(tweak); break; - case TweakType.Color: tweakControl = new ColorTweak(tweak); break; - } - try +#if ARM + string[] subKeyNames = null; + if (Registry.NativeRegistry.GetSubKeyNames(Registry.RegistryHive.HKLM, "Software\\Microsoft\\EventSounds\\Sounds", out subKeyNames)) +#else + string[] subKeyNames = EmulatorData.NotificationEventValues.Keys.ToArray(); +#endif { - tweakControl.DataContext = tweak; - content.Children.Add(tweakControl); + if (subKeyNames != null) + { + int i = 0; + foreach (var str in subKeyNames) + { +#if ARM + string readStr = string.Empty; + if (Registry.NativeRegistry.ReadString(Registry.RegistryHive.HKLM, string.Concat("SOFTWARE\\Microsoft\\EventSounds\\Sounds\\", str), "Sound", out readStr)) + { +#else + string readStr = EmulatorData.NotificationEventValues[str]; +#endif + var btn = new Button() + { + Background = brushes[++i % 2], + Content = str, + Tag = str, + Margin = new Thickness(4, 2, 4, 2), + Height = 90 + }; + btn.Click += button_Click; + btn.IsEnabled = readStr.Length > 3; + content.Children.Add(btn); +#if ARM + } +#endif + } + } } - catch (Exception e) + } + else + { + var tweaksByCategory = _tweaks.Where(t => t.Category.Equals(category)); + if (_settings.SortTweaks) tweaksByCategory = tweaksByCategory.OrderBy(t => t.Name); + int i = 0; + foreach (var tweak in tweaksByCategory) { - MessageBox.Show(e.Message, string.Format("Exception on adding tweak \"{0}\"", tweak.Name), MessageBoxButton.OK); + tweak.Background = brushes[++i % 2]; + dynamic tweakControl = null; + switch (tweak.Type) + { + case TweakType.Toggle: tweakControl = new ToggleTweak(tweak); break; + case TweakType.Enum: tweakControl = new EnumTweak(tweak); break; + case TweakType.Input: tweakControl = new InputTweak(tweak); break; + case TweakType.Color: tweakControl = new ColorTweak(tweak); break; + } + try + { + tweakControl.DataContext = tweak; + content.Children.Add(tweakControl); + } + catch (Exception e) + { + MessageBox.Show(e.Message, string.Format("Exception on adding tweak \"{0}\"", tweak.Name), MessageBoxButton.OK); + } } } pivotItem.Content = new ScrollViewer() { Content = content }; @@ -248,26 +296,71 @@ void BuildUI() } } + void button_Click(object sender, RoutedEventArgs e) + { + try + { +#if ARM + string str = string.Empty; + if (Registry.NativeRegistry.ReadString(Registry.RegistryHive.HKLM, string.Concat("SOFTWARE\\Microsoft\\EventSounds\\Sounds\\", ((Button)sender).Tag), "Sound", out str)) +#else + string str = EmulatorData.NotificationEventValues[((Button)sender).Tag as string]; +#endif + { + var ringtoneChooser = new RingtoneChooser() { SelectedRingtone = str }; + var msgBox = new CustomMessageBox() + { + Background = Application.Current.Resources["TweakEvenBackgroundBrush"] as SolidColorBrush, + Tag = ((Button)sender).Tag, + Caption = string.Format("choose sound notification\nfor event \"{0}\"", ((Button)sender).Tag), + Content = ringtoneChooser, + LeftButtonContent = "choose", + RightButtonContent = "cancel", + IsFullScreen = true, + }; + msgBox.Dismissed += (object boxSender, DismissedEventArgs ea) => + { + if (ea.Result == 0) + { + var tag = ((CustomMessageBox)boxSender).Tag as string; + var value = ((RingtoneChooser)((CustomMessageBox)boxSender).Content).SelectedRingtone; + var regEntry = new RegistryEntry(@"HKLM\SOFTWARE\Microsoft\EventSounds\Sounds\"+tag, "Sound", RegDataType.REG_SZ); + regEntry.Value = value.Equals("none") ? string.Empty : value; + } + }; + + msgBox.Show(); + } + } + catch (Exception exception) + { + MessageBox.Show(exception.Message); + } + } + #region Command bar buttons commands private async void CheckTweakListUpdate() { - var req = HttpWebRequest.Create(_tweakListUri); - req.Method = "HEAD"; - try + if (NetworkInterface.GetIsNetworkAvailable()) { - WebResponse resp = await req.GetResponseAsync(); - // 196 bytes difference it's a headers size. Let's add a few more bytes for CR/LF, tabs etc. (non-significant changes) - if (resp.ContentLength > 0 && Math.Abs(resp.ContentLength - _settings.XmlTweaks.Length) > 210) + var req = HttpWebRequest.Create(_tweakListUri); + req.Method = "HEAD"; + try { - if (MessageBox.Show("Would you like to download new list?", "Tweak list update found", MessageBoxButton.OKCancel) == MessageBoxResult.OK) + WebResponse resp = await req.GetResponseAsync(); + // 196 bytes difference it's a headers size. Let's add a few more bytes for CR/LF, tabs etc. (non-significant changes) + if (resp.ContentLength > 0 && Math.Abs(resp.ContentLength - _settings.XmlTweaks.Length) > 210) { - SyncButton_Click(this, null); + if (MessageBox.Show("Would you like to download new list?", "Tweak list update found", MessageBoxButton.OKCancel) == MessageBoxResult.OK) + { + SyncButton_Click(this, null); + } } } + // Lets be silent in case of exception... + catch { } } - // Lets be silent in case of exception... - catch { } } /// @@ -277,21 +370,25 @@ private async void CheckTweakListUpdate() /// private void SyncButton_Click(object sender, EventArgs e) { - var webClient = new WebClient(); - webClient.DownloadStringCompleted += (object _, DownloadStringCompletedEventArgs args) => - { - if (args.Error == null) - { - _settings.XmlTweaks = args.Result; - ParseTweaksXml(); - BuildUI(); - } - else + if (NetworkInterface.GetIsNetworkAvailable()) + { + var webClient = new WebClient(); + webClient.DownloadStringCompleted += (object _, DownloadStringCompletedEventArgs args) => { - MessageBox.Show(args.Error.Message); - } - }; - webClient.DownloadStringAsync(_tweakListUri); + if (args.Error == null) + { + _settings.XmlTweaks = args.Result; + ParseTweaksXml(); + BuildUI(); + } + else + { + MessageBox.Show(args.Error.Message); + } + }; + webClient.DownloadStringAsync(_tweakListUri); + } + else MessageBox.Show("Network is not available!", "Error", MessageBoxButton.OK); } /// @@ -358,7 +455,7 @@ private async void Application_ContractActivated(object sender, IActivatedEventA private void EditButton_Click(object sender, EventArgs e) { - NavigationService.Navigate(new Uri("/XmlEditorPage.xaml", UriKind.Relative)); + NavigationService.Navigate(new Uri("/Controls/XmlEditorPage.xaml", UriKind.Relative)); } private void AboutButton_Click(object sender, EventArgs e) diff --git a/WPTweaker/Properties/ARM/WMAppManifest.xml b/WPTweaker/Properties/ARM/WMAppManifest.xml new file mode 100644 index 0000000..feadeb6 --- /dev/null +++ b/WPTweaker/Properties/ARM/WMAppManifest.xml @@ -0,0 +1,67 @@ + + + + + Assets\ApplicationIcon.png + + + + + + + + + + + + + Assets\Tiles\FlipCycleTileSmall.png + 0 + Assets\Tiles\FlipCycleTileMedium.png + WPTweaker + + + + + + + Assets\Tiles\FlipCycleTileLarge.png + + + + + + True + + + + + + + + + OEMSharedFolderAccessLib.dll + + + + DevProgram.dll + + + + RPCComponent.dll + + + + Registry.dll + + + + + + + + + + + + \ No newline at end of file diff --git a/WPTweaker/Properties/AssemblyInfo.cs b/WPTweaker/Properties/AssemblyInfo.cs index 6343335..2260429 100644 --- a/WPTweaker/Properties/AssemblyInfo.cs +++ b/WPTweaker/Properties/AssemblyInfo.cs @@ -32,6 +32,6 @@ // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("1.3.3")] -[assembly: AssemblyFileVersion("1.3.3")] +[assembly: AssemblyVersion("1.4.0")] +[assembly: AssemblyFileVersion("1.4.0")] [assembly: NeutralResourcesLanguageAttribute("en-US")] diff --git a/WPTweaker/Properties/Emulator/WMAppManifest.xml b/WPTweaker/Properties/Emulator/WMAppManifest.xml new file mode 100644 index 0000000..6852b8f --- /dev/null +++ b/WPTweaker/Properties/Emulator/WMAppManifest.xml @@ -0,0 +1,66 @@ + + + + + Assets\ApplicationIcon.png + + + + + + + + + + + + Assets\Tiles\FlipCycleTileSmall.png + 0 + Assets\Tiles\FlipCycleTileMedium.png + WPTweaker + + + + + + + Assets\Tiles\FlipCycleTileLarge.png + + + + + + True + + + + + + + + + OEMSharedFolderAccessLib.dll + + + + DevProgram.dll + + + + RPCComponent.dll + + + + Registry.dll + + + + + + + + + + + + \ No newline at end of file diff --git a/WPTweaker/Properties/WMAppManifest.xml b/WPTweaker/Properties/WMAppManifest.xml index 62cfd20..feadeb6 100644 --- a/WPTweaker/Properties/WMAppManifest.xml +++ b/WPTweaker/Properties/WMAppManifest.xml @@ -4,8 +4,10 @@ Assets\ApplicationIcon.png - + + + @@ -49,6 +51,12 @@ RPCComponent.dll + + Registry.dll + + + + diff --git a/WPTweaker/Registry.dll b/WPTweaker/Registry.dll new file mode 100644 index 0000000000000000000000000000000000000000..529c706c08578124306676059cbdc474b545587b GIT binary patch literal 85504 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 BVFUmG literal 0 HcmV?d00001 diff --git a/WPTweaker/Registry.winmd b/WPTweaker/Registry.winmd new file mode 100644 index 0000000000000000000000000000000000000000..86e2969f0fb13beb1ab860a475f94661ccf2d150 GIT binary patch literal 6656 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 - + sensboston @ xda-developers Jaxbot @ WindowsPhoneHacker.com diff --git a/WPTweaker/WPInteropManifest.xml b/WPTweaker/WPInteropManifest.xml new file mode 100644 index 0000000..881457d --- /dev/null +++ b/WPTweaker/WPInteropManifest.xml @@ -0,0 +1,3 @@ + + + diff --git a/WPTweaker/WPTweaker.csproj b/WPTweaker/WPTweaker.csproj index 6f650c2..a76385a 100644 --- a/WPTweaker/WPTweaker.csproj +++ b/WPTweaker/WPTweaker.csproj @@ -41,7 +41,7 @@ full false Bin\Debug - DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE + TRACE;DEBUG;SILVERLIGHT;WINDOWS_PHONE;EMULATOR true true prompt @@ -51,7 +51,7 @@ pdbonly true Bin\Release - TRACE;SILVERLIGHT;WINDOWS_PHONE + TRACE;SILVERLIGHT;WINDOWS_PHONE;EMULATOR true true prompt @@ -89,6 +89,7 @@ + @@ -105,10 +106,13 @@ InputTweak.xaml + + RingtoneChooser.xaml + ToggleTweak.xaml - + XmlEditorPage.xaml @@ -147,11 +151,15 @@ Designer MSBuild:Compile + + MSBuild:Compile + Designer + Designer MSBuild:Compile - + Designer MSBuild:Compile @@ -166,9 +174,12 @@ - - Designer - + + + + + Always + @@ -179,6 +190,8 @@ + + PreserveNewest @@ -216,6 +229,9 @@ .\RPCComponent.winmd + + .\Registry.winmd + @@ -232,6 +248,7 @@ +