Jon (00:01.74) Hello everybody, welcome back again to Gone Mobile. Do you see the shirt I got on today? Look at that. Yeah, well they won and then it's only preseason, but they won a game against Montreal and I figured that might be the one time I get to wear the shirt after they win. Allan (00:07.797) No, I didn't actually. yeah, the leafs. Yeah, it's that time of year again. Allan (00:14.626) Well. Allan (00:19.839) You're a very hopeful individual. All of the trophies for the Stanley Cup go south of the border. Which is really sad. Jon (00:25.42) Yeah, that's what I'm saying. No, I didn't mean like win the Stanley Cup. meant the one game they might win this season. I'm not calling myself hopeful for that. Allan (00:36.183) We don't have any good football teams, but at least, hey, my Bills, my Bills, they're rocking the NFL at least. But it's not a Canadian team. Jon (00:43.648) Yeah, I guess. Well, yeah, we were talking about that because I thought when, when like you're a Bills fan, I'm like, it's kind of like what we do here. Cause everyone's, I don't know. It's kind of the game I play where I'm almost in the U S but I'm not. And so depending who I'm talking to, I'll, I'll use the one to my advantage. Right. but it's, it's like the, sports teams like red wings fan. No, no way. Never, never, never, never terrible. Can't do that baseball. I'll be a tiger's fan. That's fine. Over the. Allan (01:01.932) Okay. Allan (01:12.75) Alright, they don't win anyway so... And the Blue Jays were dead... well not dead last, not like the White Sox, they were... what, worst record ever? Potentially, yeah. It's pretty bad. Jon (01:13.578) over Toronto. Yeah, exactly. Jon (01:25.174) Probably they were bad. Do they have? Do they have in -seat ordering in the what's it's not the sky dome anymore. I don't know what it's Yeah so Allan (01:33.803) in the roger center no they don't it's all wild and cool and they've redone it a thousand times but that would be awesome Jon (01:41.59) So we went to Wrigley Field and to tie this back into mobile somehow. One of the cool things was in the app, the ballpark app, you could be like, ordered to my seat. And it was a limited menu, but it was like, you just put your, yeah. Allan (01:46.851) Hmm Allan (01:55.695) Hot dog and beer? I don't know, what else do need? Jon (01:59.35) Yeah. And it wasn't even like the vendor coming up the aisle and like stopping them, right? Cause they, they do that at places, but it was no, I just put my seat number in, put my order in, and then it just shows up. It was, it was fantastic. Allan (02:10.799) They do that in movie theaters, in a stadium like that, that's pretty cool. Because all the lines, too. How long did it take? Jon (02:15.69) Yeah. And I was hopeful cause... yeah. It was shorter than like getting up and going to the concession stand and waiting in a line. Like easily. Allan (02:25.294) Hmm. Wild. Wild. Jon (02:29.246) And that we went to a Tigers game last night and I was hoping to have the same thing and they had it for like some areas but not Like I think regularly field was some areas only two but it was quite a few areas like if you were in the bleachers like now, sorry, man but if you're in like The will the lower deck they would bring it right but Tigers was wasn't Yeah, exactly. Tiger Tigers was not it was like if you're in this specific section of the lower deck like randomly so Allan (02:42.885) Yo. Allan (02:46.575) We're not mountain climbing to get to you. Allan (02:57.734) So you were. Jon (02:57.762) plenty of room to improve but the app itself for ordering kind of sucked with Wrigley so it felt very web -based and it was really slow and janky Allan (03:08.217) You'd think they'd have it tied to your ticket, but then it'd be ticket master problems. Jon (03:12.81) Yeah, I don't know. Those tickets all show up in like the MLB app now when you do it, which is different than Hockey still. Hockey, it's like the Ticketmaster app, that's it. Allan (03:23.279) Yeah. All these, see they got to get on board, but Ticketmaster's got like a deadlock on it. Jon (03:28.834) yeah. But even, I mean, even the stadium could do their own app and have you order through that, right? It'd be fine. We need to, maybe we should pitch this. We should go to the sports teams and be like, listen, we will build you a better app and we will take 5 % of the concession profits as a payment. Allan (03:41.574) We have an app. Jon (03:50.018) And that's how business deals work, right? All right. Allan (03:50.247) Yeah, that doesn't actually sound bad. Yeah. Let's go for 10. They charge, come on, man. They charge 25 bucks for a beer now. can, yeah, come on, come on. Jon (03:58.64) it's so bad. It's so bad. Yeah. Anyway, we had some listener feedback come in, during the weeks that I either forgot to post episodes or, or we didn't record or whatever. It's been a, it's been a busy time. work has been busy, so we, we've slipped a little bit. Allan (04:06.138) We did. Allan (04:16.143) And John didn't share this with me. He never does. It's usually like, surprise, hey, because he sees the stuff, right? John's the admin. I think I could go in, but I don't. Jon (04:24.118) Yeah, yeah, so this is new for you Yeah, you probably could. So listener feedback from Peter? I'm not sure if I'm going to pronounce that right, but I tried. So sorry. Allan (04:37.583) It's Canadian pronunciation. We'll blame your accent. Jon (04:40.554) Yeah, that's right. So Peter was asking or mentioning that, hey, wrote his first app this year with Maui and had a hard time understanding push notifications, which I mean, it is hard. It's complex. If you've never done it before, it's not a simple topic. But he used Shiny. Allan (05:03.474) sweet. Jon (05:04.31) Yeah, in the app and server side, and that seems to be working. So I think you're on to something with this shiny thing. Allan (05:11.229) Yeah, I'm glad to hear it. Makes my life easier. Jon (05:13.776) but the, the meat, the meat of this feedback was talking about, opinions of chat GPT or, know, or copilot or whatever and coding. and so, you know, they were talking about having a friend who wrote an app, like, I'll say wrote an app in quotes, finger air quotes in flutter using chat GPT to do most of it. but, you know, when you do that, you don't really know what, what it's doing necessarily. and. Allan (05:32.881) Okay. Jon (05:43.262) So I think I would side with you, Peter, in your opinion, that seems to be, yeah, it's great. It's great as a tool. But if you use it and just rush through to write something that you don't understand, like that's not gonna help you out long -term. And it may even like be that your code doesn't do what you want it to do, right? Allan (05:57.436) No. Allan (06:02.362) I've found the GitHub copilot to be super helpful for docs. if you're in like there's times where I'll take a story and I don't want to be taking my eyes. So if I'm working on something like a big task, I will often because I, you know, I'll close the browser. You know, I'm ridiculous for closing the browser, which so is John. Sometimes at the end of the episode, he's just like, and he closes the browser and it's like, screw you too, Jon (06:27.746) Yeah, quick way to say goodbye. Allan (06:29.875) So I'm bad for that as well. It's just a thing. You're like, we gotta get all these browser types gone. So I'll take a story and I'll copy and paste it into the code editor, the IDE. And I find that if you give it that context and it's all in the scope of the one file, it does start to get pretty smart. It's like, you probably want this. you have an enum that says you're probably gonna want all this too. But it doesn't really know how to look outside of that box I found. If I'm doing documentation, Jon (06:47.574) Yeah. Allan (06:59.335) It's extremely helpful there, because it knows like it's got to write hello world. mean, it's really hard to screw that up, right? So I find it's really good at completing the stuff that is in line, but doing like the whole wad, like where you ask it to do something, I'm like, yes, that's not right at all. Jon (07:16.332) Well, even if you use it kind of incrementally to do that, like I've had success using it for things. And, I think there's a difference between, you know, fully, like I'll use an example. I, I, when I was doing my, my weird custom font scaling stuff and I wanted to like, I wanted to bring like several factors into this calculation of what the font size should be. And I, I started thinking about the math and like the code to write the math and I was just like, Allan (07:45.864) Yeah Jon (07:47.018) I bet Copilot can do this reasonably well for me. And it did, it did a great job, but did I really understand fully the code? Like, I mean, I, I did, but I didn't, you know, I was like, that's neat. It's using like, you know, this math function to do, you know, kind of what I asked it to do, but I don't, you know, I, I'm not sure that I could be like, yeah, I know exactly what that equation looks like. If I wrote it out in math, you know, mathematical terms and I could tell you what exactly it's doing. But it was like, this is working. I did some test cases. and it, it worked how I wanted it to. So I think it's not necessarily like you have to understand all the deep details of everything that comes out of something like that. I mean, to an extent you do, but if you're writing whole like sections of like an app or something and you don't know why most of this code is going like, no, that's, that's not helpful. Yeah. And I think that the other thing that I had thought about with this is I think it's. Allan (08:34.442) Yeah, that's probably not where you want to be. Jon (08:46.25) Also, like if you can write a lot of like validations against it. So I, the other thing, I think I talked about this on a previous episode. I used it for fake, for doing the pool chemistry math, like at a molecular level. Yeah. I, was, I should share the, the transcript from it with you. Like it's impressive. And so I had, I had like a calculation or a formula that was based on some like magic number values and it, and I knew the results for each. Allan (08:58.436) my. Jon (09:16.342) for a bunch of set of inputs. But what I wanted to do is turn that into something that I could have more inputs into and I didn't know the magic number values that would just correlate to those new input types. So I used this, I used it to create the formula for me or to help build the formula. Cause I kind of had to walk it through it a bit too. I'm like, yeah, this is almost right, but I know it's not quite, but I don't know the math, but I'm gonna tell you this and then you're gonna help me. And it did. Allan (09:39.156) Not quite. Jon (09:45.484) But at the end of it all, what I ended up doing is writing like a bunch of different inputs. Like I wrote like a unit test that had like all the different variables and then a bunch of different permutations. I, what? I know, right? It's a shocker. Allan (09:56.226) Wait, wait, wait, you wrote a unit test. You wrote a unit, wow, this is recorded. He can't even edit that one out. Jon (10:04.64) Yeah, it happened once. Yeah. So I wrote a unit test and it had all the different cases. And so I knew what the expected outcome was with the known to be good formula. And then I, but I didn't obviously test against the inputs that like, didn't, I couldn't do with the known formula, but knowing that it was working right for all of the known inputs. like, I feel pretty confident and knowing my input was like somewhere in between, you know, the ranges of known ones. like, I'm very confident that this is correct essentially. Allan (10:38.424) Plinko chips kept going into jackpot. Jon (10:40.702) Exactly. So I think if you approach using it in that kind of way, you know, it's, fine to not to, kind of rely on it a bit, but yeah, you gotta know, you gotta know your code. You shouldn't write a whole app and then be like, I don't know what the heck that does. That's not gonna help you. Yeah. I mean, that's different. Like a, a, abstraction or like a black box is different than when you know that the person who made it, you can reasonably trust. Right. I mean, it's like we tell our kids all the time, like do your due diligence. Like Allan (10:54.464) Well, people use open source and don't always know what it does, so. Jon (11:10.452) on your sources, right? Like so and so said this like, yeah, well, this so and so a trusted source or, you know, are they a doctor? No, they're a five year old kid. They're dumb. They don't know. So just know your, know your source, but. Allan (11:20.044) Right. They don't know anything. or if you're not careful, they'll end up making a meme out of it in the future. So. Jon (11:28.008) Exactly. Yeah. So thanks for the feedback. yeah, I think it's a good point to bring up that, it's again, I think we, keep saying this in a lot of ways. I know I do in a lot of conversations, especially with friends and family who, who maybe don't know as much about the space when they ask. And it's like, it's a tool, but you still have to know how to use it. Right. Allan (11:46.821) Yeah, well, you got to you got to hope that it's worth that it's coming out right at the end like again, usually it's for tab situations. I don't I don't use the prompt part of it as often. Jon (11:58.792) yeah, no, I do. I do more now. Like that's the part I'm talking about. Allan (12:03.597) I should, you know, that's the funny part, because usually I'm like, I still go to Google and I just know tag, tag, tag, tag, tag, tag. Right. So I'm like, I got to just refine a little bit. And I'm like, why can't I do this in chat GPT? I don't know why I do have chat GPT open pretty much all the time. And yeah. Jon (12:11.243) Yeah. Jon (12:18.326) Yeah, it's old habits to an extent, right? Like I find myself, I go in phases too, where I'm like, yeah, I can just look this up with, or I can use Copilot or ChatGPT or whatever, and I'll do it a bunch and then I'll forget again and I'll just be back to my old habits and yeah. Allan (12:35.826) Now, the funny part was is I, the one time I did use chat GPT to generate a whack of code. Now I tried this a couple different ways. I had an SVG of a football field, right? I was trying to write a play thing. So I wanted to kind of zoom in on certain parts of the field. So if it's like a 20 yard play, it zooms out a little bit and I couldn't quite get an SVG. Surprisingly, I know whatever, couldn't find a good SVG that I wanted. So I'm like, whenever I can just ask chat GPT to generate a XAML football field. Jon (12:57.686) Mm. Allan (13:06.45) And I mean, was gross, Sammel. It was gross. But it worked. I mean, it was the American football field, not the CFL version. But that's not too bad. mean, most of the kids play NFL style rules. Yeah. Well, it's 110 yards and then longer. The CFL's got the weird rules. But tougher. Jon (13:08.834) But it worked, yeah. Jon (13:17.888) Now do it in meters chat GPT. Jon (13:24.298) Yeah, yeah. They do. It's tougher. Well, yeah, because the field's longer, right? Allan (13:35.418) Yeah, yes. Jon (13:37.258) and fewer downs, right? So it's harder. Allan (13:39.302) Yeah, they've a lot more pass. Apparently harder to catch balls and read defenses, but you know. Jon (13:45.954) It's cold. It's hard to catch. So speaking of AI and intelligence, how about the Apple intelligence? I know I talked to you about this. I was not going to order the iPhone 16. It really was not. Well, yeah. mean, so it's not a compelling upgrade over the 15. Allan (13:51.11) So. Allan (14:05.478) You did though, didn't you? You haven't told me yet because you knew I was gonna mock you about it. Allan (14:13.947) No. Jon (14:15.05) It's not, there's a new button. You can have a camera button now. Allan (14:19.442) The 15 has the side extra button. Yes. Jon (14:23.67) No. Well, has a, no, no, but there's another one yet. Allan (14:28.348) What do want another one for? Jon (14:30.242) for taking pictures like a camera, I guess. Allan (14:33.064) well I have, but I guess technically the default is to mute it, right? Shut up all notifications. And I change it to camera. Jon (14:39.232) Well, there's a new button, another button on the side with the power, right? Like right on this side. So you see this phone on the side, right down here there's gonna be a new button. Allan (14:46.128) Okay. Yeah. Allan (14:53.17) Okay, but on the other side there is a new button already that you can make do whatever you want. So now we've got two. So I have two now. Well, no, this side has that mysterious button. See? Jon (14:55.658) Yeah, well, it's, but it used to be a switch. Jon (15:04.095) Yeah, but it used to be that was for toggling like silent mode. I know it's a button now. I know I know it can. I know it's the Zombo com of iPhones. Allan (15:07.569) You can change it to anything. You can change it to anything. I know, it's awesome. Jon (15:14.966) But now you have two buttons that can probably do anything. The new one, you can like, it's like touch, it's almost like a touch pad, I guess. So you can like zoom and stuff with it. Yeah. Allan (15:26.195) think about that to be honest but hey flashlight maybe? Have you seen the new flashlight thing on it? That's that's neat. So John and I are kind of enablers of each other. We're really bad in terms of buying stuff so about what was it about a year ago when I got on the HomePod thing and you're like yeah I go with it and so I bought the big one first and I was I was pretty committed I was gonna go get the whole thing but they didn't have any of the little guys for my kids so I was like you know what I'll just try this one first. Jon (15:28.342) Yeah, yeah, yeah, that's nice. Jon (15:37.836) Mm Jon (15:44.02) yeah. All homepads. Jon (15:55.82) Mm Allan (15:56.444) I intended to walk into that store and buy all of them, like for my kids' rooms and downstairs and stuff. Yeah, and then they didn't have them. So I got the big speaker. The speaker is fantastic. But I gotta say, I have to say Mrs. S otherwise she's gonna wake up and start doing things, but she's pretty stupid. Still, it's not very intelligent. Jon (16:01.11) Yeah, yeah, one for each room. Jon (16:15.914) Yeah, yeah. Well, I'm hoping that improves with, I don't know if they'll need to do new home pods with like the Apple intelligence to get better. Like in theory, Siri should start getting better with the AI in it. I don't know. Yeah, well, I hope it can't be worse. Allan (16:32.915) You would think. I mean, I will say the one thing that's cool is that when you press the button now, does that really cool effect on the screen? That's the only benefit I've seen to it. But the effect is very pretty. I think I messaged you about a week ago too. And I was like, dude, you need to see this button. Did you ever find that button? You never did, did you? Okay, so if you don't type for long enough, it comes up with this, and this is on iPhone 15 screens. It's like an HDR feature. Jon (16:56.213) No, no. Allan (17:04.638) And the glow it makes on that button is fantastic. I'm like, dude, we have to make this. I have to find out how to make this exact button. Jon (17:09.9) Yeah, make it a. They're probably doing something like low level with the HDRs to make it like pop out that maybe you can't even do. Allan (17:17.801) Yeah, what it looks like a flashlight is literally behind the button. Like it's that intensity too. And you're like, why can't we do this? This is man, I'll spend a whole friggin sprint on doing that thing. And it'll be like, what did you do? I made a light up button. It's beautiful. Jon (17:33.068) Yeah, that made a button. It's a, hey, it's a shiny button. Yeah. Yep, yep, yep, Allan (17:39.483) Jon (17:45.186) Yeah, we got there. We usually do. So iPhone 16, I wasn't gonna, but I realized that with my phone plan, you know, it's like in Canada still, give you like a hardware subsidy. Now I don't pay for my phone plan. So like it's free money if I don't use it. And so I've been due for one for a while to use it. And it's like $500 off the phone. It's not nothing. So. Allan (17:58.282) Eh, kind of. Allan (18:09.589) Alright. Don't want to wait another year for a foldable phone, eh? Jon (18:14.754) Yeah, well another decade, sure. Yeah, it'll be here one day. Yeah, it's not, it's not happening. Yeah. So iPhone 16, which means iOS 18, which means Xcode 16, which means did you break yourself like everybody else? You didn't cause I, you knew better. Allan (18:16.836) don't, don't crush my spirits. I keep hoping. stop, stop. Allan (18:27.321) Xcode 16. Allan (18:32.874) No, I knew. Yeah, I was waiting. So what I usually do is I'll bug John and then John bugs Alex Soto and it's just a nice line. We're waiting for people to try it for us. So John jumped in head first. I was waiting. Jon (18:41.474) Mm Jon (18:48.386) Well, I waited till I, till I knew from Alex that it was okay. So we, so Maui has new, well, not Maui. mean, there's it's all Maui, but, yeah, there's new net eight workloads that you can go install today if you want to manually that, work with Xcode 16. So, you know, this, this has gotta be like the, the, the rant section of the podcast because. Allan (18:53.869) Yeah. Allan (19:16.344) Okay. Jon (19:17.45) You know, to be fair, we don't do the best job of highlighting to people that they shouldn't go install the new things. But also like, before you go install the new things, go check if it's safe to install the new things, right? Just look, right? So... Allan (19:30.745) Check with your vendor. Because you guys, the iOS team has always been really good about saying, this isn't done and here's where it's at. Although I'm glad they, because they were holding strong to net nine and I was like, dude, I need my Mac 15 toy. Jon (19:41.184) Yeah, yeah, in which we are. Jon (19:48.578) Yeah. So what, what happened, well, and what happened this year was usually in the past that now there's a caveat to this because you know that this is still not technically untrue or, is technically still able to do, you, this year you couldn't technically install Xcode 15 .4 if you upgraded to Mac OS 15 that. it was like, yeah. So no, you know, you, you, couldn't Allan (20:13.101) Not without a hack. Jon (20:18.05) have best of both worlds. You had to stay back on old Mac OS, but that meant you couldn't install Xcode 16, which was fine because you shouldn't have, because we didn't support it yet. But so people started kind of going and upgrading to Sequoia, which meant they couldn't really install Xcode 15 .4 to get back to a working state. I mean, luckily you could, you could download it. You could set your, you know, your Xcode select to that old path and it would still work, but Xcode itself would show up as like, can't run this like Xcode 15 for Apple's like, you can't run this. This doesn't work with this version of Mac. I'm like, no. Yeah. So they, kind of hurt us there a little bit. but then, yeah. So people were in a state where, I did all this upgrade. Like, what are you, what are my options? Like, well, you can use the hack. you can format your machine and go back to 15 or 14. Allan (20:50.713) Yeah. Allan (20:55.27) But it does. Stupid. Gotta get the latest. Allan (21:13.231) Ha ha ha ha. Jon (21:15.858) Not a popular answer, surprisingly. so we, we, you know, that team worked really hard to get stuff out sooner. and so it's out. but one of the cool things with it is, and if you want to go find it, it's on like the Xamarin Mac OS repo on GitHub, go to the releases. There's notes of how to install it. And one of the cool things that I'm happy about finally, is we have these workload sets. They're kind of called our workload version sets. So Allan (21:17.666) No, no. Allan (21:43.972) Yay. This is a big deal, actually. Jon (21:45.28) Yeah, it is a big deal. mean, if you just kind of let Visual Studio update you with everything, typically you would be fine. But on Mac, that's not a thing really so much, right? Like there's VS code, but it doesn't really help you update. Not right now. Allan (21:59.771) Yeah, nothing pushes pushes forward the stick, so to speak. Jon (22:02.996) No. So with, with workload, with workloads in the past, you effectively had to like, if you could do a dotnet workload install and say a dotnet workload install MAMI and it would go out and it would just grab the latest version of the workloads that were available on NuGet publicly stable and install those. that might be fine for your scenario, but for some people, a lot of people, if you were trying to like, keep a version that you knew your stuff was compatible with in CI, for instance, that wasn't a great option, right? Like, you never knew what you were gonna get then if you did that, it would just start updating on you. And so there was a way in the past to pin to a set of versions, like so there's this thing called workload sets, and maybe if you have experimented with that or seen it, there's like this rollback JSON file that you could use. that said like this version of each workload is what I want to install. And then you would have to like use that in the command to install things and Allan (23:04.881) and you had to pull that forward with your CI products. And I've been through all this. We had that. Jon (23:08.482) Right, remember to update it. Yeah, it's it was clunky yet best and I think it was even an unadvertised feature technically in the SDK. So workload sets are kind of the evolution of that and really they're just a new get packaged with one of those files in it. But the tooling now supports knowing like dotnet workload install maui dash dash version 8 .0 .402. or whatever, the 402 .1, I think is the latest one that's out now, today, yesterday. And so now you can just do that and it goes and figures out the different versions of every workload that would come along in that scenario with you. So you can set your CI to like be that one pinned version. And they're working on some additional tooling to help like query, you what versions are available. help figure out like what versions of the workloads are in a set, that kind of stuff. So like we're not all the way there yet, but it is an improved experience from the perspective of predictability. Allan (24:13.664) It's definitely a good starting point, that's for sure. And we don't have to wait for .99 for it. The funny part is a lot of people still get confused. Do I move forward or do I not? Well, you're on LTS, but... Jon (24:20.48) Yeah. Yeah, so. Jon (24:27.426) Well, yeah, so there's a couple more things that may be helpful to unwind on the topic because if you're listening to this and you're trying to learn something, like let's teach you some of the things because they're not obvious. So yeah, people often get confused on this is a port policy, right? Because they'll be like, .NET 8 is LTS release, so I just want to stay on that. And it's like, well, that's good if you're not doing mobile in Maui. But if you are doing Maui, There's no such thing as LTS. We follow a different support policy. And really the reason for that is we have to update Apple and Google update. We don't have a choice. And for Apple, means like they'll stop supporting old Xcode versions and require that you build with Xcode 16 before too long. If you're going to submit apps to the store. Allan (25:18.446) Usually it's a couple months. It's not long. Jon (25:20.034) Yeah, and it's a different timeframe for new apps versus existing app updates. The existing app updates get a little bit more leeway in time, but it's not that long. And so for us to try and maintain Xcode 16 working back with older versions of Visual Studio and .NET and everything, it would be a nightmare to try and do. We have tried to in the past, it doesn't work. And so we spend all of our... energy trying to make that just work instead of like building the product, right? So, you you have to move forward. And so for our support policy, basically net nine is around the corner. As soon as it goes GA, you have six months of net eight quote unquote support, because we're already going to stop pushing import, like the more general fixes and stuff into net eight. At that point, we're going to push new. you know, all the servicing into net nine. If there's a serious issue, a regression, you know, something super, super bad in that eight. Yeah, we'll, go fix it. but otherwise it's going into net nine. So if you want, if you want to keep on getting those fixes, like you gotta, you gotta stay on the train with us. Allan (26:33.398) Well, I mean, most people that are doing native development, if you're pure native anyways, you have to carry that forward every year. Now, Apple and Android have got, well, we'll speak for Apple. Apple has gotten better about the porting effort forward. Like it's usually, usually doesn't break and they're not big on changing up the whole permission life cycle like Android does every other year. I think I've only seen Apple where it was like, my God, what did you guys do once? And that was around iOS eight. Jon (26:38.976) Yeah, absolutely. Jon (26:53.419) Yeah Allan (27:03.012) That was a that was like, whoa, guys, you pretty much broke everything. So thanks. But it's always been a game where you've had to move forward, right? There's there's companies that are like, yeah, we'll leave our mobile app for like a year and then we'll come back and add features. And they're like, where can I just add the feature? Well, it's change. It's not like Web. I mean, it would be nice if it was more like, I can't believe I'm going to say this Windows. To a degree, yeah, John, last Windows. Jon (27:03.127) Yeah. Jon (27:20.428) Why is it so hard? Jon (27:28.45) You Got that on recording too. Allan (27:32.899) Yeah, I know. I know it's sad. But at least you know some of that old crap that you wrote like 15 years ago. For the most part, I mean if you've got old net installed. You're gonna run wind forms or WPF is going to turn on. Now Windows is older than dirt and even when you've got. When you've got some of these new updates, it's just shoveling more dirt on top of the hill, right? Jon (27:43.554) It still works. Allan (28:01.911) Whereas the mobile platforms, obviously they need to chop some of that crap out because you don't have infinite space on a phone. So. Windows has that luxury. Jon (28:08.48) Yeah. Yeah. And it's just, it's a different paradigm and yeah, it is kind of, it's interesting when you see enterprises building apps and stuff and they think that they can apply the same, you know, thinking and policies and stuff to their mobile apps. it's like, sorry, no, you can't. You just, you have to move forward and moving forward more frequently is usually much easier than waiting, you know, a bunch of time and then being like, okay, now we'll move forward. It's like that. Right. Allan (28:27.372) No, doesn't work like that. Allan (28:35.854) Yeah, because now you've got to catch up. You've got to be like, how much has changed? Or like, what's the delta between then and now? And then you're making plans for all those changes. Forget your features, right? You're figuring that out. Now, it's not brutal. We make it sound like it's brutal. It's not horrid by any means, but it's there. Like Android permissions. Dude, I'm so tired of them changing permissions. Jon (28:45.738) Yeah, you're just gonna play catch up at that point. Jon (29:03.306) I, kind of keep hoping that Google will slow that down. Like I feel like they've been trying to like trickle it out. So it doesn't, but it's just like, but then every year it's a new one. Like just give it to us all at once. Like just pull off the bandaid, get to be to the place where Apple is in terms of restricting stuff. Cause like, that's the problem, right? They started way off in that you can do anything and they're like, that's actually not great for us or our customers. So let's take that back. Apple, Apple had the right idea. Allan (29:04.004) 15 is due anytime now too. Allan (29:12.687) Every year. Allan (29:25.753) Really bad. Allan (29:33.53) Nearly keep saying that Apple's copying, but sorry. Sorry. Jon (29:36.93) No, But anyway, yeah, Xcode 16, all the new stuff, you can use it. The other thing to keep in mind, yeah, I wanted to say this one too, is if you have multiple, like the other thing that's confusing is, can install once, what's net nine goes GA, I can install net nine SDK, and then I can go build my app. And you can. The thing that I think that people still don't get today is if you're, You can build with a newer SDK and still target an older framework version, right? And that sometimes doesn't make a difference. And sometimes it's a subtle, but really important difference. And just in terms of like, the SDK in net nine does something different than it did in net eight. And you're still getting some of the new SDK behaviors, even though you're building a net eight TFF. And so there's that aspect of it too, that's like, if once you install that new net nine, you gotta go update your project to be the new net nine TFM as well. Don't think you've just caught up by installing the SDK and you still build your same old project that's targeting net eight. Allan (30:50.609) So here was an interesting one too. I had, so I updated the SDK. I'm on a Mac. I love Mac. That's your fault. So I had a case. I'm always pretty much updating the latest stuff and I blow out my old SDKs almost instantaneously. But this week, the company I work with, we generally tend to push forward the Maui version. And we also tend to push forward the workloads. We use that workload pinning that we talked about the old way, new ways coming. And we had all this, but we had a couple of people that just, it was saying all these code generation stuff, things had failed. And I'm like, guys, I just did a fresh clone. This is a fresh clone, this is generating fine. Because Mac doesn't push forward the SDK at all. So they were on an ancient SDK. Jon (31:43.49) Hmm. Allan (31:46.766) And the thing with the source generators is that, and I didn't know this until this point, is we tend to update those, right? We're like, ooh, new shiny nuggets. And we update them. But those are still tied because it's the Roslyn stuff. It's kind of tied to that SDK. So what was happening is when we looked under the hood, it was saying, Jon (31:53.687) Yeah. Jon (31:58.678) Yeah. Allan (32:08.04) Well, this is like 410 and we don't understand 410 of the library. use 49. Now I'm not sure if that was an SDK thing. Well, it was an SDK thing because we ended up updating that and it all worked. We thought it was a writer thing at first. But that, you know, that's important to know. Jon (32:23.008) Yeah. Yeah. No, that, that, yeah. And that, and that's like those subtle differences in what SDK versus like new get packages and stuff mean, right? It can, it can be different and you don't always know. So it's like, like I think the, the, the PSA here is go update, go check what's available often. Allan (32:46.972) Yep. Jon (32:48.502) Go update somewhat regularly, but then, never go blindly update, right? Like keep up to date, but don't just press a button because you know, you think you should, especially if it's not like within the .net part of it. And that's where you're working. don't, don't let, here's a, here's a good product of the week. This is maybe the first not package or plugin. Do you use X codes, the X codes app? Yeah. I mean, they should. Allan (33:14.961) Yes. Yep. Doesn't everybody? Jon (33:18.604) That's why I'm putting it as the product of the week because X codes, the app helps you manage downloading multiple different, whatever versions of X code you would like and making, you know, one of them active. it also uses, Aria to download, which is super fast. And it also uses that there's, if you go into the settings, I don't know if you've done this one, there's a setting that's like an experimental feature for extracting the download. Allan (33:20.969) Alright. Allan (33:47.07) I have not. Jon (33:48.022) turn that puppy on that extraction of the thing goes so much faster. Allan (33:53.639) Really? Huh, I'll have to look at that one. Jon (33:57.11) Yeah. So it makes the whole install process faster, but it also gives you visibility and like lets you control what, what desk, what Xcode version you have and all that kind of stuff. So like, go use that. Like that's the other thing that I see is like, well the app store told me this is the version update too. It's like, yeah, I wish Apple wouldn't do that. Allan (34:13.333) Yeah. Well, and it's brutal to install through the App Store takes hours. And really, I always remember because well, you know, my internet's been mega fast forever. Right. You would be like, it's going to take hours. I'm like, it's done. Mine's done already. Right. But like, there would be cases where I'm like people where you'd have the App Store download. And even if you had ultra fast internet, it still take two hours. And it's like. Jon (34:25.26) Yeah. Jon (34:28.85) yeah, I would just wait so long for... Allan (34:41.792) the hell is this thing doing? Jon (34:43.414) Yeah, the download wasn't always the slow part, right? was the whatever else it was doing. Yeah, it was all of it. That's why Apple's making so much profit. They've got Bitcoin miners going on while you're installing updates. So yeah, go update, but do so carefully, you know, with great power, great responsibility, that whole thing. Allan (34:46.388) Yeah, well, it was the downloading too. Allan (35:00.007) There you go. Allan (35:08.182) Just like new gets don't right click and update all understand what you're updating and why. Don't update your Chinese. Jon (35:11.094) Yes, yeah, know what you're doing. Know what you're doing. Which is, and sometimes you don't update often enough like I did not the other day. Allan (35:19.602) yes, yeah. I do, I do. Well, it was a bit weird, but, and I guess I have to document that a little bit better, but the lockstep of all versions. It's not really assumed, right? Cause NuGet allows you to get away with it. Jon (35:20.502) Do you remember that whole thing? Jon (35:30.304) Yeah, no, it will. And if you have stupid enough users that come along and don't update their versions on a solution level, this is what happens, right? So yeah, I finally started using Mediator in a project. Allan (35:43.041) Yeah, you want to tell them what you did. Allan (35:49.313) John is using one of my dependencies at last. says shiny, but it has no RX. So. Jon (35:53.378) This is not the first time. I use your localization one, the one that you made for me. That's fine. Allan (36:00.055) That doesn't really count. was to make you do localization properly, but that's fine. Jon (36:05.766) Hey, I it works. So yeah, no, so Mediator. I had firsthand experience using it, which is one of the things. we do internally. We've had a number of different names for it, but we spend intentional days sometimes building apps and stuff and using our own tools so that we have an idea of what it feels like from a customer perspective, which is always a good thing. And my... What I decided to work on this time, cause we're, we've mentioned already, we're going back to, to the Disney world, in, in the, in the winter and my son who is food obsessed, but doesn't actually like eating any of the food, wanted to, he's like, I want to make a list of all of the different snacks at every park and where, you know, what place they're at in the park so that we know when we're hungry, you know, like we've already gone through and I know. Allan (36:46.21) Ha ha ha ha. Jon (37:00.406) which ones I want so we can figure out where to go when we're hungry. And so I'm like, well, this sounds like a good idea for an app because I don't want to look at a list. I don't want to like try and be like, this place and we can go here. I want the app to tell me like, I'm hungry. And then it's like, here's your closest options from like your preselected list of things that you know you want. Right? So I decided to make an app that I've, I've titled mouse must eat, must eat. because that sounds fun. it's just a little simple app that has like a map. And so I imported all of the marker or the location information from all the restaurants from this random API that is awesome. There's another mention, theme parks API, I think it was. Yeah, so they do like, you Allan (37:32.076) Not a bad name. Allan (37:45.036) Yeah, it is awesome. Allan (37:49.218) Theme parks API, which by the way, I'm also using for something, but I'll let you finish yours. Jon (37:55.274) ride wait times and stuff. But one of the things they also have is like all the different restaurant locations. And so I, I use that. I've tried a bunch of new things in the app this time. I'm trying, I tried, back for app, which I think we mentioned on a previous show, which was, was cool. It's all based on, on parse, like the API. So they, they actually, their server is like a parse server and then they've got like extra stuff around it, but that's how you interact with it. The unfortunate thing is like that. client for Maui is not really great. There was a lot of weird stuff with it. I worked around most of the issues, but then you're like, well I usually use super base for this. And I was like, why, why did that one get by me? Cause I knew about it. We talked about it on, I think that same episode. But then when I went back to do this, I just, forgot that one existed, I guess. Allan (38:44.516) Well, it is infrastructure you have to spin yourself or pay for hosting, right? Jon (38:48.31) Well, there's a free. So was the other one. Like there's a free hosting plan. That's all I'm using right now. Yeah. Yeah. But and it's like, you know, it's one of those things like, yeah, I can easily spin up a web API and like do my own database and stuff. But I just, wanted like the whole, from the couch, I want to just like type in the database field names and stuff. Like I, I didn't, I didn't, I wanted it to be super. It's just like on a webpage that I go set this thing up. I don't know. That was, that was just what I wanted. So Allan (38:52.204) Is there any actually haven't paid attention. I hosted all on my own so. Allan (39:16.942) You wanted it to be super, so you picked super bass. Jon (39:19.186) super. Yeah, so I used, there we go, you're getting into it. So I used that, I set up like the data backend with it. I got most of that all working nicely and that worked a lot easier. But then, you know, obviously the meat of this was I wanna use Mediator. I gotta figure this thing out, right? So I pulled in the project, I started coding stuff up. I read the documentation, which like, you know, you give yourself a hard time about your documentation. Allan (39:23.056) There we go. Jon (39:49.204) And maybe like it's not world -class, you know, like full -time engineer working on it, but it's there. No, it isn't. Allan (39:56.604) It's not bad. It's not bad for a mediator. If you go into other things in the Shiny library, it's pretty bad, whatever. I know how to use it. Jon (40:02.186) Yeah, I mean, but it, but it's there. Like how many, I'm, I guess I'm very used to just finding packages and libraries that there's zero documentation for. like having something to say, here's the stuff you need to do is like, this is, this is good. I know what to do. And I, I think I didn't stray too far from being totally wrong about it. think that where, where I hit trouble was because I didn't I don't know how I did it, but I got into a state where like I had different versions of different shiny packages, right? In my projects. And then, they didn't like each other, I guess. Allan (40:36.24) Yeah, I don't know what that was. it pissed off the source generator. And then that didn't like things. So a bunch of things. But then you also found that API and my source generator didn't like it anyways because it was YAML and it was one of those Node .js ones. So I fixed that. Jon (40:40.14) Yeah. Yeah. Jon (40:47.383) Yeah Jon (40:51.286) Yeah, but I ended up just using that API as like a, like, cause I didn't, I don't want to pull in like the menu information. I mean, I might want to, from each restaurant in the sense that it would be easy to like see the items and select favorites or whatever. But I was more interested in just getting like the restaurant locations and those don't really change that often. I'm like, I'll just write like a little console app to blow through it and put it in the database and then just keep loading it. So. Allan (41:15.093) Call it in once. Allan (41:19.998) But if you download the menus too, then you can search when your son's like, I only want to eat chicken nuggets or an apple. Jon (41:25.13) Yeah, yeah, but that was a different API as like that didn't have an API. We'd have to like reverse engineer that one, which you found a couple links to figure it out too, but. Allan (41:35.442) Yeah, the Disney restaurant stuff directly. Scrape Disney. Jon (41:38.4) Yeah, yeah. Yeah, so that might be a future version, but for the purpose of this one, it was just trying to like, so I had the map and then I had the tables with the information in them and I wanted to use a mediator request handler to go get that information for me. And like, this is a perfect application of using it, right? Because I have a request, in this case, I just want all the data, because there's not. that much data. just give me all the data, but I might eventually have a variation of that. That's just like, me the closest data. Right. And then I want to display that as like markers on the map. Great. Easy to do. but then what, what I really liked about using mediator was I could do the caching. I could do the offline stuff. Right. And it's all like just the attributes on, on the, the request or on the, I don't know what, where's the right place to put those on the method itself. Allan (42:36.5) Well, you can put them on the handler. Previously in the version one that's still out there, you could put it on the contracts as well. But as we go forward, I think I'm just gonna make it, no, on the method. So you had it on the class, that was the one confusion, because on the class of the handler, it's not actually red. That was open for the contracts, and it was because you did that that I'm pulling it off the contracts, and it'll only be on the method of the handlers going forward. Jon (42:38.721) Yeah. Jon (42:44.844) But on the handler, just at the class level or can I do it? Okay. Jon (42:54.678) Okay. Jon (43:02.29) Which kind of makes sense, because if you want to implement multiple handler methods or handle methods, you want to maybe have that granularity of like this one will cache, but this other method doesn't. If I want to stuff multiple ones in the same class. Allan (43:13.864) rate. And as it is, I'm getting ready to do like a Microsoft configuration setup so you can actually just specify namespaces and stuff. So having those attributes kind of live and breathe at multiple places along with this config, it was like. It was too complicated, so I just and once you had that on the top level class, I was like, well, no, it doesn't go there. Unfortunately, it's not red, so that one would have been left out in the cold. Jon (43:20.179) Mm -hmm. Mm Jon (43:32.95) Yeah. Jon (43:42.4) Yeah. So, but, but, you know, in terms of the pattern, like the thing that was really kind of the aha moment for me that stood out and it's not, I don't know. It's not that it's like that much different in a sense from using a database or something, but I had the, in my view model, it's like in my, you know, on appearing method, I send out this request or I, know, and then I, I'm just doing it all as like, the request, not the send and then like implement the thing in the view model right now, which I probably, depending on my use case, wanna do that instead because I could maybe send a request at various points and then have one location that kind of, it all returns back to. But I just did the one off in like the on appearing, I'm like, request with the fetch spots, I called them spots, like the restaurants. Allan (44:27.357) Okay. Jon (44:38.784) And then I get a spots response. And then I just put that into my list on the view model and that updates things. like the nice thing was every step of the way when I w so that was fine for the restaurants. When you click on a restaurant, then it opens up like a detail page for that restaurant. And then it shows the list of, of snacks that we have set up and the same pattern there on appearing fetch snacks. And then in this case, the request obviously has the spot. ID that I want to request them for brings them back, puts them in the list. Then they show up on the page. Now the cool thing was like, when, when I started adding stuff for updating a snack or adding, well, I have one request, one handler that both can do, know, update in and create new ones, which is just like, if, you know, if the, if nothing's passed into it, create a new one. Otherwise you assume you're updating the one that got passed in. But when, when that all fires off and then I come back, Allan (45:08.493) Mm Jon (45:37.664) to that, you know, pop -up that had the list of spots, like everything just updates, right? And it's all, and it's all cached and it's all offline. And so I can, you know, lose my connection after that and go back and see that that spot's there again. So I think it was, was less the, I don't know, it just was, it was a really low friction and easy way to just prop up this app and prop up these screens. And if I, if I did the right request in the right spot, I didn't have to think about like, I just edited one. It's going to be different now. I got to update the view model when I returned to it. Cause like that all just happens as part of the appearing life cycle stuff, right? Allan (46:19.282) Well, and I think that that's the thing, because a lot of people won't rebind when they go back to a list or a page because they don't want to incur like a network call. Right. And it's like, OK, I get that. That's fine. But then you still you have to work harder to get it. Right. Because now you have to be like, go find that thing, update it, rebind it. Jon (46:23.66) Yeah. Jon (46:27.659) Right. Jon (46:34.551) Yeah. Jon (46:38.1) And I guess it's cause I like all of those pieces are combined then, right? Cause the, one request handler does the network call the super super base, you know, and then it's automatically cashed for me. And so I'll it's, it's just me. I don't have to think about like, it was updated. So that means the database is now updated. So that means I can rebind the list, right? It's just all like one kind of operation that does it all. So I don't know if I'm describing it well, but I just, had this moment of like, this is just, it just worked. Like it's, didn't have to think much about it. It all just kind of works. It all just fits together. It's easy. So, nice, nice job. Yeah. Yeah. No, it's, it's pretty nice. Allan (47:13.81) Well, and that's what matters, right? Thank you. I mean, really, that was the goal, because a lot of people will layer that all in dependency injection. And then you'll go down and you're like, OK, well, I want this method to cache as well. And you're like, OK, hang on, because now I got to go through and add that through to other stuff. And you don't just mark it. Jon (47:21.612) Right. Jon (47:26.006) Yes. And that's the, yeah. And that's the thing, I guess, because I would, if I had done that myself, I would have had, you know, a service for doing the database, like the, web communication. And then I would have had a service for cashing it. And then I would have had, you know, all, all those parts. And then I would have had to reason about calling them in the right places in the right order. And this just, just does it. It's, it's easy. It's great. The only thing, not the only thing. mean, I. I think the area that I stuff that would think about more, and it's not bad now that C -sharp has like records and stuff is like the, the having, you know, multiple types kind of declared for request and response. And I know you don't have to do that, I guess, right? Or, well, no, you do, don't you? I have to implement interfaces for like the response and request types. Allan (48:19.573) Yes, well you have to define the contract. But if you're doing HTTP there is generation options. Jon (48:22.688) right. So. Jon (48:29.174) Yeah, yeah, fair. It was more the like, okay, so I've got this, it was almost like I almost have no code, but for the no code, have like three classes, you know? So it's like, it's almost like type heavy, but not that, again, it's not a problem. It's just like, that was the one thing that I kind of observed. I'm like, every time I want to like add to this pattern, I'm creating more types, which is fine. Allan (48:54.399) You're essentially trading signatures for types, message types, right? That's the trade off. And then the trade off is leading that type to where your handler is, right? If you have to follow your own kind of convention because they can't find it. Now we've talked about that a few times, like how could we do that? I have no idea. I have no idea. It's pure tooling thing. Jon (48:57.793) Yeah. Yeah. Yeah. Jon (49:08.959) Yes. Jon (49:14.807) Yeah. Allan (49:21.778) I've looked at some analyzer options. That's not really easy, anyhow, stuff to think about. Jon (49:26.102) Yeah. And, and, like I said, you know, it's not, it's not a problem. It's one of those things that I think it's just a different way of looking at it where I'm used to looking at it, you know, the, the cruft existing over here. And now the, the, not even cruft, the lesser cruft exists over here and it's just, it feels different. but, but like I said, with, records and stuff, like those things can be very, those things can be like two lines anyway, right? Like it's not a big deal. It's just that they're there. It's just a different way of thinking. Allan (49:53.18) Yeah, you just have to define it. It's another type. And I mean, that's the thing, too, is that those types will crawl over domain layers. So if you've got multi -projects, it lets you kind of do all that cool thing. But anyhow, it's cool to hear you're using it. I finally got you using the library. Localization doesn't count. Jon (50:10.188) Yeah, no, I like it a lot. I think that the next step is kind of just evolving my like, am I using this the way that is ideal and the way that I think works best for me and kind of feeling that out a bit and just getting more familiar with the pattern and kind of figuring out how I like to use it, I suppose. Allan (50:28.466) Well, that's the best thing about it too, as I've been using it professionally too. I'm like, this doesn't quite fit. Or I'm doing a lot of boilerplate like HTTP for all the offline stuff. I'd have to turn around and go, OK, now I got to make an HTTP method for this and it's one line. So I didn't want all that boilerplate. So that's why the source generator exists now. Then I was like, well, I want to cache those calls and that doesn't source generate. So now I need configuration. Jon (50:37.355) Mm Jon (50:49.132) Yeah. Yeah. Allan (50:56.496) So it's been iterative. This has been a pretty fun project to work on. Jon (51:00.622) I might even have to seriously consider maybe this is where I do my V2 break of my own pool math API. Cause I don't wanna change it and deal with like people with the old version of the app having problems. But in theory, I like the idea of my whole stupidly long class of like web basically like HTTP method implementation or like, know, fetching. or contacting the HTTP, the REST service. I have a ton of methods and over the years, you know how it goes. It's like, that one doesn't do exactly what I want. So I'm make another one. And they're similar, but they're different. I like the idea the more I think about it of trying to like do the web API kind of, you know, and then generate stuff and have the client just run through Shiny to generate it. Yeah, so I... Allan (51:54.507) There we go. Jon (51:58.57) It's cool. I'm to keep working on the app at least enough to make it so that it can be used for our trip. But it's kind of been one of those little fun side projects that's not, I'm not trying to build an app out of it, you know, put in the store or anything like that. It's just for learning. Allan (52:11.785) No, it's a helpful one. Now you did find a golden goose in that themes parks API. Because I have wonderland season passes. My kids and I love it. And it doesn't let you check the wait times on rides if you're not actually in its GPS fence. And that sucks, man, because I want to know, is it a busy day? Do we go? Do we not go? And there's ways I could hack the GPS, but. Jon (52:20.99) Mm. Jon (52:25.847) Mm Jon (52:34.764) I was gonna say, there's gotta be websites that do that or something that must do that. Yeah. Allan (52:37.193) There is, but like I just want to go into the app because then when I'm at the park I'm still in the app, right? Or it's on my phone. So I was like you found a golden goose and it's even got the paid wait times if I want to because Wonderland allows you to pay for single ride fast lanes. So when I did Leviathan for the first time this year I paid for it because I didn't want to wait in line for an hour plus. Jon (52:49.568) Yeah, it had all sorts. OK. Yep. Allan (53:01.269) and my friend and I went on it and it was just pretty wild. So this API was goldite. So now I've coded up just a little basic thing so I can see the wait times. And I guess don't wait for GPS just right here. Jon (53:08.93) So now you got to throw that in the store for 99 cents or whatever, right? I bet you. Jon (53:16.054) Yeah, Wait times, no matter where you are. Allan (53:18.313) Hehehehe Jon (53:21.51) yeah. So fun little apps. What else are you working on? Anything interesting? Allan (53:26.808) No, I've just been working on Meteor 2 .0 and I talked about all those new features. Jon (53:29.41) Okay. Which is, which is important too. mean, I'm liking it. Cause I jumped in right away with the latest preview. I'm like 2 .0 is there out on NuGet? Go for it. Yeah. That's where we like to live. the, the other thing that I've been toying around with that, have you seen my, my content button yet? I think I showed a link to you. Allan (53:38.173) Yeah, he's like, I got the beta. All right. Here on the edge, man. Allan (53:50.741) I have. Yeah, I may actually put it to use. Jon (53:54.27) Okay. Okay. So I, we've had, you know, over the years, there's been a lot of work that's gone into just buttons, which I was talking to someone today who was, who was asking some questions about our team and you know, they're, I started using the example of like, you might think that, you know, something like a button is easy to abstract at a cross platform level. And it just dawned on me. like, that's the perfect example. It's, it's not at all easy to abstract. cross platform level. There's so many little nuances like this last one TJ is as one of the developers on the Maui team. And he spent a lot of time working on figuring out how to make image content and text content layout consistently across platforms and how you might expect it to be with the values you set, given the kind of API constraints we have on that type right now. And Apple is like, my goodness, it's so hard to do properly. And so we had like one more fix that was going into the upcoming RC2 of Net9. And there are some people that saw it kind of come across the list for, know, as we kind of go through approvals and spot checks and stuff. And they're like, this sounds not great. Like why are we being opinionated on what we're doing with like, cause it was one of these weird cases where if you had an image and content and you set, the padding between the two on the native control too low, Apple would start trimming the text on the label. But if you set it high enough, they'd be like, okay, this is what we're gonna do. We're gonna show the whole thing. So there's like this magic number. And by the way, like I always used to kind of have this idea of, like put like. these companies up on a pedestal of like, it's Apple. They got to know what they're doing. They're doing it right. They're doing that. They're just like everyone else, just like we are. Allan (55:51.738) Well, they're so big now, man. The platform is so huge now. Years ago, they could break because there wasn't so many apps. Now they've got to be careful and they've got to do what's best overall. It's almost like politics, right? There's no right answer. We've got to come as close as we can. Jon (55:56.161) Yeah. Jon (56:06.974) But it is, but, but, but even just like something like how somebody implemented, you know, button with certain scenarios in UI kit years ago is just like a weird, in a weird way where they somewhere in that code is probably like, if the, if this is, you know, set to this value or less, you know, do this thing. And it's like, one of those things that you're like, you like to think that they probably don't do that kind of stuff, but we're all developers. We all do that stuff. Allan (56:32.948) Yeah, it happens. Jon (56:33.974) So yeah, this was a really weird work around and you know, essentially there's like, yep, no, this is what we got to do because we, we, basically overrode the value that somebody might set if it's too low and we know it's not going to give them the result that they want because as much as we don't like to, to, know, write code, that's like your opinion's wrong and we're going to change it for you. Sometimes you just have to do that because you don't understand the implications farther down the line anyway. So button is not an easy thing either. Button is hard. And so over the years, we've had enough customers that have been like, I just want to stick whatever random views in a button. Like, can you just let me do that? And it seems reasonable, right? Like, why not? But it's, well, it's not hard to do depending on how you want to do it. Allan (57:19.012) Yeah, it's not hard to do. Allan (57:25.944) Well, and that's fair, right? But you can still do like state transitions and all that stuff just with nothing more than a, I mean, heck, you can put it in a stack layout and. Jon (57:31.53) Yeah. Jon (57:35.968) Absolutely. Tap gesture, recognizer, visual state manager. I actually, you know, we, had something like a customer that was, know, really, you know, like we, we want to be able to do this and like, listen, you can do this yourself if you want today. and so I had like a, I put it like a little gist on GitHub up that had, you know, a content template. and it was basically like a, a button, but using a content view and tap gesture, recognizer and all that stuff. was like visual state manager. can do the depressed color, all the different styles, whatever you want. It looks like a button. Unfortunately, that doesn't by default play nice with things like accessibility. And so there's, there's certain things on the platform that are, some platforms are easier to emulate than others. Like Android, if you have like a, click or a tap list or whatever the thing's called natively, they kind of just treat it like a button. Like it's, it's like, great, this looks like a button. So we're going to put it in the right spot in the accessibility tree, treat it the proper way. Done, easy, not a problem. And then something like Apple, you previously couldn't put sub view, sorry, you couldn't subclass UI button without some pretty severe ramifications. Allan (58:51.706) and getting rejected and stuff and all that good stuff. They used the block on that. Jon (58:54.274) Yeah. And, and since like iOS, well, I was 15 at some point they changed it. You can actually do that now. And so for Apple to try and like make a thing look like a button, like, yeah, there's ways you can kind of influence the, the accessibility story around any UI view. But if you just subclass from UI button, things just would work so much easier and you have to do less work. And so I started kind of doing some looking around that area. I'm like, I had in windows, we were also unsure of what we would do like for an arbitrary view. It's not, there's ways to do it again, but it's not super easy to like make that kind of behave to the system like a button. And so I started the whole path with just like, like doesn't windows let you just put stuff in a button like with windows XAML anyway. So I started looking at it. It's like, yeah, they do that. You can do that. And so I'm like, well, we can just make another handler for this. Let's do a content button that, you know, uses an actual button on windows. Allan (59:44.245) Yes. Jon (59:53.666) puts our own content, our own view in the side of that button. Try that out. I'm like, great, this works. Love it. Let's go to the other platforms. And then I did Android. Android was harder. can't, any of their button types don't ultimately derive from like a layout group. So you can't nest content in their button. Like their button is not a view that can contain sub views. Allan (01:00:19.176) So you had to make that custom then. Jon (01:00:22.88) Yeah, so I actually ended up using the material card because that derived from a layout group, but it had similar behaviors in terms of accepting the different background stuff and borders and things like that. The material button that we currently use does. They're both kind of, they derive from the same hierarchy almost. so I use that and that works okay. And like I said, Android's happy enough if you. put a tap listener on it, it starts to think that it's a button from an accessibility perspective, all that kind of stuff. It even plays the clicky noise on Android. It even plays that just on its own. It just knows. Allan (01:01:00.221) There we go. I mean it should be a buttons not it really doesn't have to be complicated is it that gesture on anything Jon (01:01:08.07) I did shouldn't have to be complicated. It shouldn't, but it is. And then finally iOS, went looking and that one was a pain. And then, you know, I kind of went back and I'm like, I know we don't subclass UI button for a reason, but what was that reason again? Right? Like I want to remember. then in that searching, found out you actually can now, which makes the whole story a lot easier. Cause we were doing this weird thing where Allan (01:01:12.819) Yeah. Jon (01:01:36.226) we were trying to nest a button. We put a button in like another native view so that we could control aspects of it. But then we had to always size the button to the size of that native view. just, was a pain for managing as like an abstraction in the way that we do it. So I figured out, okay, we can do this now. And then button has this new configuration API on UI kit since like iOS 15 and It lets you do more of like the backgrounds and borders and stuff in a more simple manner. So I switched to that. So we have this content button. We'll put a link to it. I haven't finished updates for the new kind of way to do the iOS part of it, but I'm almost done there. then, yeah, it'd be. Allan (01:02:23.607) So this will be a nice easy way to create it. Button with an icon. Jon (01:02:26.368) Yeah. Button with an icon button with whatever, like my sample on the, the repo on the app is like a grid with a image on one side and then a label and then a label, two labels, like one, you know, bigger text, lower text description. And then I put like a little vertical line and then I made this stupid little dot, beside that to look like a, like some kind of indicator light that toggles on and off. And it's like, you can just do whatever you want inside the button. Now it's yeah. So. Allan (01:02:38.583) Okay. Allan (01:02:49.421) Look at that. You went crazy with power. Jon (01:02:55.764) I would personally like people to go try it out and see where it falls down for them because... Allan (01:03:01.485) can it make my flashlight button? Jon (01:03:06.018) Flashlight button like what does that? What did what do you mean? Allan (01:03:09.146) the Apple intelligence button. We were talking about earlier, did I already forget? I gotta get a video of it, all right. I just being a disturber. Jon (01:03:13.216) Yeah, I never saw the button, so I don't know, maybe. Yeah, I'm sure you could. It's just a button and then put whatever you want inside of it. If you can build it like with a normal Maui view, you can put it in here. So go check it out. Allan (01:03:24.343) the outside. Jon (01:03:33.248) Well, we're at an hour. I didn't think we'd go for an hour with all these little topics, but we're there. I'm gonna save my tales from the crypt for another episode. Yeah, because we're at the hour. Allan (01:03:35.563) We're going to know. We always do. Yeah, but. Allan (01:03:45.357) John's keeping it. All right. We have been talking about doing some new some newer content like we've been talking about it. Let us know what you think. We were thinking about doing stuff like here is. I think we've been talking about heads up because I was like, I love this game for my kids and it involves all the sensors. It involves, you know, some text to speech because you can yell the answer and it goes, yep, yep. We heard you say the right words. Ding. Right. Jon (01:03:51.255) Mm Jon (01:04:02.16) yeah. Jon (01:04:13.388) Does it needs to start knowing like who said it first? Allan (01:04:16.944) It's smart, because you can tell pass. So my daughter will be like, have no idea who that is. So she'll just yell out my forehead, pass. And it'll go. So we've talked about doing like, how would you do that? Maybe even a Netflix style, because people keep doing, yeah. Jon (01:04:25.025) Mm -hmm. Jon (01:04:31.596) Yeah, do a little demo screen sharing. I mean, yeah, guess let us know if you are adamantly opposed to listening to that kind of demonstration, or maybe you actually really, really, really, really would like to see that sort of demonstration where we go through and do some coding and you might benefit from watching the YouTube versus the, you know, just listening on the podcast. But I think whatever we do, we'll try and... you know, do enough descriptive audio so that those who are unable to watch it and are only listening can still listen. Allan (01:05:07.202) If nothing, it'll be comedic because John and I, John's nitpicky about UI and I'm nitpicky about back end, so. I'm gonna stay off my lawn. Doot, doot, doot, doot, doot. Nobody knows the Muppet song anymore. My kids, have you brought your kids to the Muppet place in Hollywood Studios at Disney? And they were like, the heck are these things? Jon (01:05:15.296) It'll be like the Muppets, the two old guys. going through building an app. Jon (01:05:32.61) Yeah, of course. Yeah, they're like, what's this? They've watched the, there's been newer Muppet movies the last few years, like a while back now, but like 2012 sometime in not, you know, the last decade ish. Allan (01:05:36.941) Okay. Allan (01:05:48.144) Muppets are great. Muppets are great. Jon (01:05:49.378) They're there the best. All right. Well, if you have suggestions, hate mail, you know, whatever you got for us, if you've got your own, what are they? Waldorf and Stadler or something like that. The old guy, old Muppet guy's names. If you want to heckle us, just like that, you know, please, please do so email us. If you go to gone mobile .io, you will find links to ways to do that. You'll find links to the episode, to the YouTube videos. Allan (01:06:03.184) yeah, it was like, ooh. Jon (01:06:18.358) all the stuff and I think that'll about do it for this week. Thanks all. Allan (01:06:23.844) Thanks everybody. Jon (01:06:30.626) It's been stuck on stopping for a couple seconds.