Tuesday, January 12, 2016

Fitbit, Unity, OAuth 2 and NATIVE browser...and about a week of cursing.

T.StartPost();

SO! I found out not too long after my last post that I (and everyone else using Fitbit data) would not longer be allowed to use Webview based solutions for gaining access to Fitbit data via OAuth 2.

This creates quite the predicament as when you're using Unity there's no Unity specific way of getting the OAuth return code from the browser (such as Chrome, Safari etc.)

This meant that I had to spend about the last week cursing while trawling the internet for solutions. Unfortunately there is a bunch but some of them do not seem to work. THANKFULLY, how ever, there is one that I found that DID work and I have to definitely give credit where credit is due and say that without Ofer Reichman's blog post I probably would not have gotten this to work.

You can pretty much follow his verbatim to get it working but I will also transcribe some small differences in things that work for Fitbit .  Also I'm working on refactoring my FitbitAPI class for Unity. I'm likely to just release it on Github for the betterment of the community and so others can help to make it better and learn from it as well.)

So without Further-Ado:

How to Do OAuth 2 authentication in Unity FOR Fitbit..With a Native Browser (Known to work with Android)


**If you want more in depth reading you can read Ofer's post but I'm just going to cover the nitty gritty of getting it to work with Fitbit**

Assumptions by me:
-You already have an app registered with Fitbit
-You already have Android SDK's installed
-You already have decent knowledge of Unity

I'm using :
Windows 10
Eclipse Juno (but shouldn't make a difference if you're using a higher version)
Unity 5




Hope this helps :) Feel free to comment and hopefully I can help (no promises though)

T.Out();

Wednesday, July 1, 2015

Fitbit, OAuth2, Unity and a Month of Cursing.

UPDATE:
UnityFitbit C# class is finally up on Github
http://technicalartistry.blogspot.ca/2016/09/unity-fitbit-class-finally-online.html
Go check it out and hope it helps :D

T.StartPost();

So it's been a while since I posted (what's new :P seems to be my MO)

Recently I've been trying to get my game started which is finally getting started.  The biggest hurdle for me was the fact that I wasn't going with a traditional "I create all the data" game but am relying on an outside source to create the data.  This data comes from Fitbit.

So the problem for me was mainly 3 things:

1. I've never done a game for mobile explicitly
2. I've never used OAuth2
3. There's little to no good documentation on how to do OAuth2 nicely in Unity.

I've made the choice to use Unity as I want to be able to develop for as many mobile platforms as fast as possible (the fact also that I've never done native Android/iOS or WP doesn't help that :P )

So, the way I'm trying (as this is still a work in progress and the development has only earnestly gotten under way about....2 days ago?) to get around the mobile part is through Unity as I have done a "mobile" game for the Surface in my final year of university (for the surface)

I've done mostly C# for the last few years so it's the easiest for me to jump right into as well.

The OAuth2 part and the lack of good follow up on how people are doing it is the thing that took me a good month (while working a full time job) to finally get.

The thing for Fitbit OAuth2 that is annoying is the documentation seems structured for someone that has done either webdev or OAuth2 previously.

Now that I've done it, it seems fairly easy but man oh man was I cursing it and Unity for the last month.

So I decided to put a small article up about how I got it going in the hopes it helps others in the future.

SO Let's Get To It!

**I'm not going to cover the HOW OAuth2 works as it'll be more or less described through the steps anyways. **
In the code bits, if it's got a Yellow highlight, it means it's something YOU have to provide from the api (the clientID, ConsumerKey, CallBackUrl etc.)

Step 1:
***EDIT: PLEASE NOTE THAT FOR Fitbit the use of Webviews is NO LONGER allowed. All the OAuth specific code stays the same but you will want to go check this other post
http://technicalartistry.blogspot.ca/2016/01/fitbit-unity-oauth-2-and-native.html
***

You're going to need a webview. This is something that you can start a webpage in Unity on.
This is essential as you will need to get your "code" back from whatever OAuth2 service you're going to be pinging.  Depending on your webview this can range from cheap to VERY expensive.

The plugin I'm using currently for this part is Cross Platform Native Plugins.  It has the webview, it has GREAT support from the devs (seriously I send them an email and usually within a few hours to one day it's answered) and also it will have extra stuff for me to use later (twitter,FB etc.)

You can set the Scheme that the webview will look for so that way when you get the redirect with the code, the webview will grab the message and you can do stuff with it :)


Step 2:
Now that you  have your webview and have it configured and ready to go, what do we do?
Well OAuth2 is a strangely strange beast that likes to sometimes just tell you to get stuffed...
 makes it so we never touch the users credentials. No username or password is stored or touched by us, it's all by the service itself.

The general way we'll get the first Code to get started is by configuring a URL that will tell the service who we are (app) and what we want (stuff)

For Fitbit for example it would be like this
 https://www.fitbit.com/oauth2/authorize?response_type=code&client_id=ClientID&redirect_uri=" +  
 WWW.EscapeURL(CallBackUrl) +   
 "&scope=activity%20nutrition%20heartrate%20location%20profile%20sleep%20weight%20social  

This will tell Fitbit that you want to start the OAuth2 process and would like access to the things in the scope (nutrition, heartrate etc.)When you Register an app with Fitbit you'll get a ClientID and you can also specify a CallBackUrl. In your code you define the same things and that's more or less it.

One thing to note about the Callbackurl here, it has to be ESCAPED. In Unity you do this with the WWW class by going WWW.EscapeURL("UrlToBeEscaped");  This makes it weburl ready (replaces / with %20 for example)

What you would get back if you were not using a webview would be something like Callbackurl/?code=bunchOfRandomNumbersAndLetters

With the webview like CPNP, you won't likely see that page at all (IF you're using a scheme like myapp://   as it will just not load the page since your callbackurl doesn't have to be a valid alive website) and it will just be grabbed by the webview in the WebViewMessage.

Step 3:
When you've grabbed your code from the url/message, then you can move onto the next step which is requesting an actual Authorization Token. This is the token that allows you to then make calls to Fitbit and get data.

This is the part that took me the longest to get right and also the part that no one else seems to be documenting nicely.

The part that was hard for me was the fact that this uses webcalls which I've never done and couldn't find much on what for example GET or POST calls were, what I needed to fill in where etc.

 var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(_clientID + ":" + _consumerSecret);  
 var encoded = Convert.ToBase64String(plainTextBytes);  
 var form = new WWWForm();  
 form.AddField("client_id", _clientID);  
 form.AddField("grant_type", "authorization_code");  
 form.AddField("redirect_uri", WWW.UnEscapeURL(CallBackUrl));  
 form.AddField("code", _returnCode);  
 var headers = form.headers;  
 headers["Authorization"] = "Basic " + encoded;  
 _wwwRequest = new WWW("https://api.fitbit.com/oauth2/token", form.data, headers);  

So, This is the step by step part for what's happening in this code.
OAuth2 requires that you encode your ClientID and your ConsumerSecret in Base64 WITH a colon (:) between them.
I honestly messed up for a few days because I had a semi-colon(;) instead and it took a friend looking at it and the documentation to go ...You're Dumb. (Thanks Gerard)

Next is setting up the data. This is also a part that I had NO IDEA where to put it and how to do the call itself. Again, this is thanks to a my buddy Gerard that was looking over the code for a while and telling me how to formulate it cause I had it SO SO SO wrong before.

From the Fitbit Docs
 This example assumes that the code URI parameter value in the callback URI was 1234567890.  
 POST https://api.fitbit.com/oauth2/token  
 Authorization: Basic Y2xpZW50X2lkOmNsaWVudCBzZWNyZXQ=  
 Content-Type: application/x-www-form-urlencoded  
 client_id=22942C&grant_type=authorization_code&redirect_uri=http%3A%2F%2Fexample.com%2Fcallback&code=1234567890  
With this example you can see that we do the same setup although the AddFields break up the whole URL/data that we have to POST.  If you're keen you'll also notice that their redirect_uri is escaped, this is another hiccup that took me a good few days to get to finally go (and was actually the last thing I fixed to make it all work) This has to be NOT escaped when you put it in the form.addfield.

 So we make the data by using the wwwForm and adding it all to the fields like above, then we make the Authorization Header which needs a value of "Basic " +  our encoded clientID:ConsumerSecret

After that is all done, we make a new WWW and put the url as our Token url, put the data from the form in it, and then the headers.

One thing to note, in the fitbit doc you'll see the Content-Type:  that is AUTO added by wwwform so you don't have to add it yourself.


Step 4:
If all goes well, you'll get a bunch of JSON back with
access_token, expires_in, refresh_token, and token_type
The main things that I care about are access_token and refresh_token.

The expires is always the same and so is the token_type.

You parse out the JSON and get your access_token and then you can start getting data :D

 var headers = new Dictionary<string, string>();  
       headers["Authorization"] = "Bearer " + _oAuth2.Token;  
       _wwwRequest = new WWW("https://api.fitbit.com/1/user/-/profile.json", null, headers);  

You pretty much copy paste the other requests/posts that you made BUT instead of filling in data in the 2nd parameter, you put it null. This tells the WWW that you're doing a GET request

One of the things I only just figured out yesterday was that the url you put in this request will NOT give you everything you want. It's annoying but you will still have to make other calls. This one for example will ONLY get you the profile data of the user.
Unfortunately this doesn't do half of what I need so I will need to do more calls for things like Activities to get the current steps, floors etc.

Things for that can be found in the Fitbit Docs
https://wiki.fitbit.com/display/API/API-Get-Activities
For example.

Well I hope this has informed and helped people out. I hope that it also will make people's lives easier when it comes to what is needed and how to do it for OAuth2.  This is generally the same way that you do it for other OAuth2 things (at least from looking at the flow/docs for things like the Jawbone for instance.)

T.Out();





Sunday, November 23, 2014

Update

T.StartPost();

Well it's been a decent while since I posted last, like usual since the last time there has been some changes to the ole life.

For starters I am all graduated and edumicated.  I also now work for the University that I just graduated from as the Community Manager (it's a pretty fun fit if I do say so myself).  I will honestly say I wasn't sure how different it would be, transitioning from student to faculty and I must say it's been quite easy and smooth.  Slowly but surely I'm learning all the in's and outs of the work environment and it's hierarchy.

The transition means that I take on some more responsibilities and do a lot of the stuff I did as a student still, but in a more "professional" way...So our weekly study nights still continue (and this year have FLOURISHED with each week usually having 100+ students compared to our last years of 30-40 average) and I now also follow up with the new/current international students that are enrolled in DAE.

It does feel strange sometimes knowing that I'm no longer a student but faculty but I try to keep it to a minimum so that way I can still stay in tune with the community as much as possible.

Other than that there's obviously the whole "need to keep my skills up" portion of life which has started again as well (I did take a hiatus from all the stuff I was doing over the summer and Sept and most of Oct as well....mainly because I needed the break)

So one of the things I've been looking at and picking up is Substance Designer. I've had SD for probably 1-2 years now I think but I've never had the time to A) figure it out B ) have a chance to use it, so I figured I would correct that by doing some "research" aka messing around with a small goal in mind.
I originally was going to just try and make a hand painted texture for a model I'm working on (just something small at the moment to get back into the swing of things) and then figured instead of actually painting it all why don't I see if I can actually make use of Substance Designers proceduralness ...since you know...it is one of the reasons to use SD.

So after playing with it for a few days here and there I've come up with something that is (in my opinion) starting to get close to what I want which in the end is more of a stylized-normal map- texture. I do like the look of it so far and just want to try and add some more knots into it.

I have it now where the floor boards are procedural as well so you can control if it is few or more boards, spacing between, variance of the layout etc.

Originally it started out as a Stylized/PBR material but I ended up needing to be able to see it in Max 2015 (which as far as I can tell isn't quite up to the PBR stage yet.. :( ) so I grabbed my nodes and put it in a new file for Diff/Spec/Gloss/Norm and this is what I've got so far.  Granted I don't know much when it comes to hand painted so not only is the program new to me, the style is new too, but I think it's getting there. Thanks to my girlfriend Jessie Van Aelst who tells me when it sucks and helps me to understand when and why it sucks :P 

Anyway I have a game idea in mind as well but since I'm not sure on the style I want to make it in yet I'm just kind of messing around till something pops for me I think and we'll go from there :)

T.Out();

Wednesday, April 30, 2014

Some WPF Treeview Tips/Tricks

T.StartPost();

Hey everyone/anyone reading, been a long while but I have just been quite busy with my internship and being a tools code monkey :D  It's been pretty fun, interesting and at times, VERY FRUSTRATING.

Now anyone that has done WPF has probably run into any number of things that wants to make you pull your hair out and flip some tables onto small children, but after many hours searching and trying different things I've come across somethings that are VERY VERY handy for tools in WPF. I'll probably just update this post as I come across more to keep them all in once place but for starters, here is a few things that I've learned to make dealing with the dreaded and yet very powerful TreeView.

WPF TreeView is probably the best and the most frustrating thing I've had to deal with on a constant basis in the last few months; it's so handy for presenting data in a hierarchical way but there are things that you just can't do directly with TreeView without searching and searching and searching the internet to find the answers to such as:


  • How can I force TreeView to change the SelectedItem?
          Now this I will say has stunned me for a while and I actually JUST found the answer to this problem Here on Stack Overflow.  So what are we to do here? Well if you're lucky enough to have your project presenting with a inherited model (cause you should be at least using the MVVM programming pattern while doing WPF tools) for your data then you can do this quite easily.  You need about 2-3 things,
1. Keep track of your selectedItem via clicks/keyboard navigation 
2. Add to your base model type, a property like 
        private bool _isSelected;
        public bool IsSelected { get { return _isSelected; } set { Set(ref _isSelected, value); } }
    *NOTE* the Set is just raising INotifyPropertyChanged so how ever you are handling yours is how you should do it here as well *NOTE*
3. In your treeview, you'll need to have at least this line from the link
<Setter Property="IsSelected"
                        Value="{Binding IsSelected, Mode=TwoWay}" />
What this is going to do is allow you to toggle IsSelected in your data Model and since the treeview is bound to it, it will automatically set and be set to IsSelected.  Now some people may think, "Why wouldn't you just do it in code behind or something like that?"  Well that's because IsSelected is a read-only property, so you can't just set it all willy-nilly like that and from all the proposed ways I've seen so far, this is the easiest to setup.

This also goes for being able to select what IS and ISN'T expanded in your treeview programmatically, make a property and bind with the Setter in your treeview.

Search Results




  • How to implement a simple and easy to use Search Filter for your TreeView
Searchable WPF TreeView on Code Project
Thankfully, Already made a great article on this. If you don't need/want the super fancy search box (was a bit overkill for what I needed) then the really relevant parts of the article are having some more setter properties in your Treeview for

<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
                <Setter Property="Visibility" Value="{Binding Path=IsMatch, Mode=OneWay, Converter={StaticResource ResourceKey=boolToVisibility}}"/>
This lets you setup your TreeView to work with a method that you will call in your code that will search through your Data (that is bound to the tree) and set Expanded to true/false and Visibility to true/false as well which will effectively hide anything that doesn't match your results in your textbox and expand open to the result, anything that does match. Much like the IsSelected above, you'll add the IsExpanded and IsMatch(I did IsVisible myself) to your data Model.

The next important piece of code that you will need is this
public void ApplyCriteria(string criteria, Stack<TreeNodeViewModel> ancestors) {
    if (IsCriteriaMatched(criteria)) {
        IsMatch = true;
        foreach (var ancestor in ancestors) {
            ancestor.IsMatch = true;
            ancestor.IsExpanded = !String.IsNullOrEmpty(criteria);
        }
    } 
    else
        IsMatch = false;

    ancestors.Push(this);
    foreach (var child in Children)
        child.ApplyCriteria(criteria, ancestors);

    ancestors.Pop();
}
        
The method that determines if this node is a match is in this article a simple string comparison;
private bool IsCriteriaMatched(string criteria) {
    return String.IsNullOrEmpty(criteria) || name.Contains(criteria);
}
The methods will check for anything matching the searchText you give it (I hooked up an extra method from my codebehind that when the text changes in my textbox, call the method which passes the text to the Apply Criteria.) and expand or hide accordingly.

*NOTE* if you want to make the search just a bit more functional change the IsCriteriaMatched to
name.ToLower().Contains(criteria.ToLower());  This will make it that no matter if you have say Matilda or matilda, it will still show up if you gave the search box MaTilDa for example *NOTE*

The only change to this method that I really made was that I also pass the current node you're checking so you can get the name of the node like


private bool IsCriteriaMatched(string criteria, NodeWithName check)
{
    return String.IsNullOrEmpty(criteria) || check.Name.ToLower().Contains(criteria.ToLower());
}

The only part left is in your WPF you have a textbox and choose whether you want it live filtering (as the user types it filters) or keypress filtering (hit enter, it does the search) and make sure that you save/bind to the textbox text in a viewmodel (pretty much the same place you do the above search methods is as good a place as any)

Those are the two biggest things that I've run into and it's taken a while to find good working answers to (I've never used the Setter myself before this so it was a good experience to learn that I could bind to it).

Hopefully people stumble across this post and find these answers instead of searching for a long time.

T.Out();

Monday, March 3, 2014

WPF and Child Code...

T.StartPost();

Just a quick post because you never know who might need to do something like this as well (and maybe this can save them a few days of trying stuff/searching for different things/implementing things that don't work...)

So while making a tool for my internship, I had to implement a UI that would display data in a parent/child relationship. Ok, shouldn't be to bad, but the thing is that it could also have the same parent data in a list as well.

After trying for a while to get this setup to work I finally got something that displayed correctly by just getting the object and stripping the strings from it and displaying that and then more or less "discarding" the object (not discarding but not saving it in my UI for retrieval)

Then I was told we would be able to get things back by the unique ID that they would have (which also put me in a pickle because I wasn't using a Unique ID in my test data...Where I thought this might save me, it put me deeper into the, "Oh crap, how am I going to get the object back and get that ID?"

This is where StackOverflow came in to save the day...finally...after a week of searching different questions on there haha.

http://stackoverflow.com/questions/1912481/wpf-treeview-hierarchicaldatatemplate-binding-to-object-with-multiple-child-co?answertab=votes#tab-top

This answer is the answer that finally gave me the puzzle piece to get my Data Object into the UI as well as being able to get it back after (instead of just getting the strings and displaying that.)

Hopefully someone can find this helpful cause man that took way to long to get that to work..I must have tried over 15 different ways to do the datatemplates and none of them worked till this one so yeah.

Edit:

One thing to note as well, when doing the data templates, if you're doing it in a treeview like I am/the example as well, you don't want to put a TreeViewItem into the datatemplate if you want to be able to click on the text to get selection.  I didn't realize I had done this till yesterday and was trying to figure out why you had to click on this tiny spot between the > and the text.  Apparently TreeView automatically wraps whatever you put in the template in a TreeViewItem anyways so you can just display with textblock/label etc. etc.

T.Out();


Tuesday, February 11, 2014

Let the work begin!

T.StartPost();

So, with the finishing of the last semester (my final semester with in class courses) it fades into the distance and the new semester begins and with it brings ..."The Internship"

An exciting and scary adventure awaits me in the coming months.  I'm elated that I'm able to do my internship with the fellows over at Conatus Creative, who are doing River City Ransom : Underground.
The original River City Ransom game (Street Gangs for EU) was a game on the NES that really is in the top 5 of my favorite games of all time.  The amount of time I've spent beating the gangs up in that game is ridiculous.

RCR:U is the first licensed sequel to RCR and also first to be developed by a western developer (there are a lot of other games in the RCR lineage in Japan), so the fact that I can work on this is amazing to me.  I'm super excited to be apart of this project and of course a bit scared to be working on an IP that I've loved for so long.

I just got back from our school trip to the US/Canada where we got to go on some tours to places like Valve, ArenaNet and EA (Vancouver). Was fun to be on that side of the pond again, even if for only 10 days ish.

Well,  back to work now.

T.Out();



Friday, November 29, 2013

Unity, Localization and oh so much anger...

T.StartPost();

Unity.

So powerful, pretty easy to use and so annoying when something breaks.

For the game we're making in our Integration Projects 3 class, we are making our game in Unity.  The class states that the game has to be localized for English, Dutch, French and German, as well as Win 8  Store ready.

We thought everything was A-OK till this last week when we went to do a Win 8 build (cause the school finally got the tablets for us to test on...) and that's when we found out something that hinges our whole localization code and throws it in the the garbage...

Since our game is going to be using quite a bit of text we decided to spend some time making sure our localization would work flawlessly from the start instead of going back and doing it after (since that seems like a dumb idea anyway...)

So we came up with a system that is basically as follows:

One class - GlobalData -> basically keeps track of what language the game should be in.

Holds an Enum,

 LanguageEnum {English, Nederlands, French, German}  

and an int that is CurrentLanguage which of course keeps track of our language by casting the LanguageEnum to an int and storing it.

Then for each class that will have text in it, we have an xml file with a pretty basic structure that is like this:

 <?xml version="1.0" encoding="utf-8"?>  
 <MainMenu>  
  <Title>  
   <Eng Text="Main Menu"/>  
   <Nl Text="Hoofdmenu"/>  
   <Fr Text="Menu Principal"/>  
   <Ger Text="Hauptmenü"/>  
  </Title>  
  <NewGame>  
   <Eng Text="New Game"/>  
   <Nl Text="Nieuw Spel"/>  
   <Fr Text="Nouveaux Jeu"/>  
   <Ger Text="Neues Spiel"/>  
  </NewGame>  
 </MainMenu>  

Then in our class with text we have two things, another Enum that corresponds with the Elements in our xml such as:
 public enum MenuStringKey  
 { Title, NewGame, Controls, Options, Credits, Exit }  

And a public void  LoadStrings(); method which is as follows:

 // Open Xml Document with tranlations.  
     XmlDocument xmlDoc = new XmlDocument();  
     xmlDoc.Load(@"Assets\Localization\MenuText.xml");  
     // Loop over all needed option strings. (By looping over OptionStringKey enums.)  
     foreach (MenuStringKey neededStr in Enum.GetValues(typeof(MenuStringKey)))  
     {  
       // Get all possible translations for the needed string.  
       XmlNodeList languageList = xmlDoc.GetElementsByTagName(neededStr.ToString());  
       // Get needed translation.  
       foreach (XmlNode translations in languageList)  
       {  
         //Get the attribute that goes with the localization.  
         MenuStrings.Add(neededStr, translations.ChildNodes.Item((int)GlobalData.CurrentLanguage).Attributes["Text"].Value);  
       }  
     }  

We store our localized strings in a Dictionary of
 Dictionary<MenuStringKey, string>   

 Or whichever Enum it is.

And whenever we wanted to get the localized string it is just
 MenuStrings[MenuStringKey.Title]  //Gets the corresponding string in whichever language

We had to do our loading with relative paths as for some reason, Resources didn't want to work us before (it does in our new code but it didn't back then...)

This also made another problem we didn't at first notice, because we're referring to the assets/localization folder, we also have to copy that folder structure over to the build else, no text, no working game.

But hey, not a big deal right?

Well, this was working fine for us up till this week, as I said before.  When we went to build for Win 8 app store, we found that XmlDocument and friends are not supported...Great...
 Just GREAT...

So now we have to figure out how to get our xml reading to work again with XDocument which is actually what I wanted to use in the first place but at the time (only a few weeks ago) Unity didn't support which is why we had to use the xmlDocument instead of XDocument and LINQ (which is sooo much nicer)

So after messing around and trying to get used to XDocument and LINQ again, I have finally come up with an actually, even more elegant solution which solves 2 problems for us.

It solves the having to copy over the folder structure as well as our xml loading problems.


So we still have the same setup with the enums and such, the only change I have made is in the GlobalData one by changing it from the original (see above) to
 LanguageEnum {Eng, Nl, Fre, Ger}  
 This makes it so when we use it for LINQ it auto finds the same tag in our XML.

So I changed our LoadStrings to

 var textAsset = (TextAsset)Resources.Load("Localization/MenuText");  
     var doc = new XDocument(XDocument.Parse(textAsset.text));  
     var root = doc.Root;  
     foreach (MenuStringKey neededStr in Enum.GetValues(typeof(MenuStringKey)))  
     {  
       MenuStrings.Add(neededStr,  
         root.Element(neededStr.ToString()).Element(GlobalData.CurrentLanguage.ToString()).FirstAttribute.Value);  
     }  
Now there is a few things I can say about this chunk of code besides it being one foreach instead of 2 and actually one line :P

 var textAsset = (TextAsset)Resources.Load("Localization/MenuText");  

This is using the Resources of Unity.  What is Resources?  It's a folder called Resources inside your Assets folder. It apparently is quite handy for a lot of things not only limited to loading text files and such.

So I moved our localization folder from the Assets into our Resources folder. I kept it in our Localization folder just cause you never know what else we're gonna throw in there (order and stuff...)

So for resource loading of xmls, you don't put the .xml, just the file name and Unity will actually look where you tell it and find the file that matches what you want. I tested because some documentation says you can just say the file name and it will search ALL folders in your resources folder but this seems to not be completely true, so be warned that if you have a sub folder, make sure you are including that folder name in your path as well like above.

The second thing is
 var doc = new XDocument(XDocument.Parse(textAsset.text));</code></pre>  
 Which was actually a pretty annoying thing to get figured out. &nbsp;A lot of online sources say use XDocument.load which doesn't seem to work. I did finally stumble across someone saying doing this current line which made it work correctly.  

Now for our XML structure, we only have the one attribute in our Element which is the text for that language.
 MenuStrings.Add(neededStr,   
      root.Element(neededStr.ToString()).Element(GlobalData.CurrentLanguage.ToString()).FirstAttribute.Value);   
 .  
Since this is inside our ForEach, we check for each Enum that is in MenuStringKey and try to find the element that corresponds with it and then finding the element in that one that corresponds to our CurrentLanguage and then finally the attribute which is the Text="" part
This works quite nicely and actually makes it so we can keep all the other code (so far, I do have to check to make sure it will Build for Win 8 after I get this all re done in the other classes...)for the actual using of our text and such, which is great.

I'll do an edit when I've found out if this will completely fix our build problem.
Thanks for reading and hopefully this has helped someone :D
EDIT:
This code has made it so I was able to make a Win 8 App store build with no problems. Cheers, hope it helps.

 T.Out();