CRAIG LABENZ: Hello, everybody. Welcome to another episode
of "Observable Flutter." I am your host, Craig
Labenz, and today we have a special episode
that will feature our first guest on the show. So I'm pretty
excited about that. But before we fully
get into it, just to remind everyone that this is
a civil place on the internet, one of the last few remaining. So we are certainly abiding
by the Flutter code of conduct here. Let's all remain respectful
of any technology that we're talking
about, even if we're advocating for something else. That is very important to me. A lot of creators of
these technologies will be in the chat, and they
are donating their time to us so that our apps can be up
and running more quickly. But enough of that. So today, I'm joined by Jose-- and I'm now realizing I've never
said your last name out loud. "U-jia"? "Ooh-jia"? Maybe your first task can
be-- your first assignment can be to clarify exactly how
to pronounce your name, Jose. But he joins me from
Google Pay, and we're going to be talking about their
Flutter integration, which covers not just Google
Pay but also Apple Pay, so extremely handy for us. And let's bring
everybody in here. So I'm going to do this. And Jose, welcome. JOSE UGIA: Hello, hello. CRAIG LABENZ: I think this crop
is awkward, so let's try this. There we go. JOSE UGIA: That looks better. I have to say in
your defense that I don't have an easy surname,
so we can get to that. But before that, as
the slide was saying, I'm joining from the Google Pay
team, the Developer Relations team from Google Pay, and
super happy and excited to be the first guest. Hopefully, this is
something that I can brag about in the future. I think I'll be able to. CRAIG LABENZ: Yeah. If this ever gets
to a stance where people are bragging
about it, then something has gone right with the
"Observable Flutter" show. JOSE UGIA: I hope so. CRAIG LABENZ: So Jose,
do you maybe want to kick us off here with just-- I think a lot of developers-- a lot of people in
the world have-- they're aware of Google
Pay, but maybe don't know exactly what role
it serves, especially if you were coming at
it from the direction of a developer who's going
to put it in your app. So maybe you just
kind of orient us around how we should
think about Google Pay and what problems it solves
from a developer's perspective. JOSE UGIA: So put very
simply, Google Pay is a product that Google builds
to collect payments online that includes Android
applications and websites as well. Sometimes this gets confused
with the billing options in Google Play billing because
if I'm coming from a developer world and I'm used to
probably offering premium features from my app
through Google Play billing, I might be confused. So just like to
separate the two-- they are different products. You will want to use
Google Play billing if you have an Android app
on the Google Play store and you are selling digital
goods like likes, stars, or features of your app. If you're selling
elsewhere, so if you're selling physical services
or physical goods like e-commerce, maybe a food
delivery sharing economy, you can use Google Pay for that. Anything that you are using
a credit card for, you can replace that with-- or you
cannot not replace Google Pay. What Google Pay brings is it
offers merchants or businesses the ability to have
their customers pay with the cards that are
already saved in Google Pay. So the experience is
just much more seamless. It's a one-click experience
if you are logged in already. So that's the main difference. CRAIG LABENZ: Gotcha. Yeah. Yeah, so this is not
in-app purchases. This is e-commerce
kind of purchases. And I always love when a
website pops up Google Pay. I'm like, great, I don't
have to go grab my wallet. JOSE UGIA: Right. CRAIG LABENZ: But
the Flutter way would not be to only
focus on Google Pay because Flutter doesn't only
focus on Android and websites. So the integration
that your team-- and I see you are a
prolific contributor to the integration-- it is more broad than
just Google Pay, right? JOSE UGIA: Yeah. So the objective really is
to enable multiple payment providers, especially those
that are more commonly used on certain platforms. So we started with
Google Pay on Android and then Apple Pay on iOS
because those are the ones which are most frequently used. But our vision for
the plugin is such that other contributors,
including ourselves, can add payment
providers that they think they would like to see there. So the whole point of
it is have a plugin, without making it
too convoluted, that has payment
providers that you may want to use in your
Flutter application. And that may include,
obviously, web going forward. That's something that is
not supported at the moment, but that's the idea. JOSE UGIA: Mm-hmm. OK, nice. Yeah, a lot of plugins
are kind of working on their web coverage. So nice to know that
that's on the roadmap. JOSE UGIA: We are
thinking about it. CRAIG LABENZ: Thinking about it. Thinking about putting
it on the roadmap. Gotcha. Thinking. JOSE UGIA: Oh, well, it's-- yeah. Well, to be precise--
in fact, let's put it in a different way. It's an open source project,
so we have a plan for it, but we will also love to
see this project evolved into something that the
community is also engaged in. We already see a good amount of
engagement from the community, but let me just
reiterate and voice it from here that, hey,
it's an open project and we would love to
hear thoughts, ideas, and [INAUDIBLE]
contributions for sure. CRAIG LABENZ: All right. So I think I'm going to start
by just showing very concretely what we're talking about here,
which is pub.dev/packages/pay. So this is what we're going to
be working with today, right? JOSE UGIA: Yeah,
that's precisely it. Yeah, that's the package. CRAIG LABENZ: Yeah. So folks, we'll be kind of
going through all of this. We're going to set this up. We're going to actually build
out a payment thing and click something and-- I'm not going to
spend any money, but I think we're going to see
some kind of mock something happen, and I'm
excited about that. I don't know-- I have read through
this documentation, but I have not played
with it because I want to be able to
bring the perspective of the new developer
to this conversation. Jose's bringing the expertise. Now Jose, we got a
couple of questions about GPay and whatnot,
and specifically in India. Do you want to take a second and
kind of cover a few of these? JOSE UGIA: Yeah, so
just very briefly, UPI is a payment system that
is only, as far as I know, is only available in India. It's part of the country itself. Google Pay has certain features
that are operational there. The product that we are
going to concentrate on today, the Google Pay
API, is not part of that. So this doesn't cover UPI. This covers online payments that
go through payments processor. So if you-- worldwide, really. So if you're using a
payment processor that supports Google Pay, that
means you can use this API. But that wouldn't cover UPI. CRAIG LABENZ: Gotcha. OK, great. And then there was a name--
this was tripping me up as well. Would you mind clarifying
the actual spelling and how to write the name,
what you like to be called? JOSE UGIA: Yeah. So the name is, in fact, we got
it slightly off in the title. It is Google Pay, actually. GPay is not a name that
we use in the public. So that's something that-- it will be easier
for you to find it if you use Google Pay
and the Google Pay API. Probably saw on
Google I/O this year that now we are
differentiating between Google Wallet and Google Pay, so
hopefully that makes it easier. Google Pay is everything
related to payments, as the name indicates, whereas
Google Wallet is the, let's say, the virtual wallet that
you have on your device where you can have cards and
you can have passes, where you can have boarding
tickets and so on and so forth. Today it will be about Google
Pay and its online API, so collecting payments on
mobile apps and the web. CRAIG LABENZ: Yeah, gotcha. I think that typo
in the show title just came from me because
the Flutter team works with the Google Pay team
a lot to help that app be performant and whatnot. And so-- and like you said,
GPay is the internal name, and so I've heard that
1,000 times and just had lost track of the fact
that it wasn't the full name. It wasn't until you flagged
it that I even had any idea. So that was on me, folks. OK. JOSE UGIA: We're going to have
many more opportunities to fix it in future episodes with
Google Pay, right, Craig? Is that something
that could happen? CRAIG LABENZ: It
sure could, and we can start by me only saying
Google Pay from here on out and not continuing to
say the other name. JOSE UGIA: That works. CRAIG LABENZ: So Jose, do you
think we are ready to begin? JOSE UGIA: Let's do it. If you are ready,
then I'm ready. I'm taking more of a laidback
approach, which I enjoy. CRAIG LABENZ: Yeah. So let me hide some of
these previous things. Oh, this goes back quite a ways. I do pay for Postico on my
personal machine, folks, but I won't right now. So let me grab a terminal here. And-- oh, that's an odd-- look at this aspect ratio
it just popped in with. JOSE UGIA: Hmm, interesting. CRAIG LABENZ: Yeah. Go into my Development folder. Right. Yes. Oh, my goodness. I got cold fingers this morning. It's wintertime. I'll increase my font size
after all these typos. And what should we call our
app that we're going to build? JOSE UGIA: I'd just call it-- do you have a personal
app where you're selling something, Craig? CRAIG LABENZ: I don't currently. JOSE UGIA: OK, so-- CRAIG LABENZ: Should I
quickly found a business? JOSE UGIA: Yeah. So why don't we call
it Craig's Corner? It sounds very appealing to me. CRAIG LABENZ: All right,
Craig's Corner, nice. JOSE UGIA: [INAUDIBLE] CRAIG LABENZ: See, I was going
to call it something terrible like Payments. But Craig's Corner is
a lot more exciting. All right. Here we go. So let's hide this. Go full screen. Let's open the main
file, main.dart, and make sure our font is big enough. I think we're going
to go this big, make sure everyone can read it. OK. So I presume the first
thing that I need to do is install the Pay plugin. That right? JOSE UGIA: That sounds
like a great idea, yeah. CRAIG LABENZ: I've never seen
pubspec.yaml this in my face. This is really something. Let's add a dependency of pay. Wow, the autocomplete
on that is so fast. I don't think there was
time for a network request. I wonder if that extension
periodically caches all of the names locally. It must. It's so fast. JOSE UGIA: Just following
up on a couple of questions. Sorry to interrupt. Google Pay is at the
moment only available on-- for Android devices. On iOS, Google Pay is not
available at the moment. Why is that? I think it's a bit more
complicated to answer, but basically, this
is online-based. So technically, it's something
that could be doable. I think it has a bit more of
a background really starting with very likely Apple iOS users
will be more probably prepared already to pay with Apple Pay. It's definitely
something that has to do with usage
in the end, but I wouldn't be able to give you
the right-- the full answer because I don't have it. CRAIG LABENZ: Yeah, and it
seems vaguely reasonable to me. Apple also has the
requirement that any app that offers a different
payment method must include Apple Pay as well. So it would technically
be possible for GPay to show up in an iOS app,
but Apple Pay must exist. So anyone with an iPhone
probably has Apple Pay set up, so yeah, I can
absolutely imagine that there's a little bit
of diminishing value there. JOSE UGIA: Mm-hmm. CRAIG LABENZ: All right. Any other questions that
you've seen that you want to cover real quick? JOSE UGIA: Anything that I see? Where, in the new app or do you
mean referring to the library? CRAIG LABENZ: One
person, by the way, says that your volume
is a little loud, Jose. Would you mind-- yeah,
maybe just kind of chop 20% off the top. JOSE UGIA: Let me try. CRAIG LABENZ: Thanks
for that, Kenneth. JOSE UGIA: I can start
speaking very softly. Let me try-- CRAIG LABENZ: That's
the old-fashioned way to do it, yeah. You actually just
reduce your vocal cords. Messed up. JOSE UGIA: Sound settings. CRAIG LABENZ: Cannot
deal with technology. JOSE UGIA: Input volume. CRAIG LABENZ: Yeah, thank you,
Kenneth, for that feedback. We obviously are not listening
to ourselves right now. All right, I'm scanning
the other questions. Oh, Rinzin asks, is this
part of the fullstack Dart series or a new format? There will-- fullstack
Dart is, I think, going to be basically
a permanent mainstay on this show, but it won't ever
be the only topic we cover. So there will be
irregular detours into lots of other aspects
of Flutter development, like today, the first one. Also, I should say,
this was originally going to be a "Boring Show."
episode back in the summer. Jose is in Spain,
I am in California, and it is difficult to get two
people from those locations into the same room. So we kept having
scheduling issues. And finally, when I was
starting a livestream, it was like, Jose, I think
I can stop canceling on you if we just meet digitally. So this was many, many,
many months in the making. Jose pitched this forever ago. JOSE UGIA: We really tried. We have to say that. We really, really tried. It just didn't work. Now I'm super happy that we
are going for this new format. We are the newest
kids in the block. CRAIG LABENZ: That's right. OK. So any thoughts on
where we should start? I guess I can just pull up
the documentation again. What do you think? JOSE UGIA: Yeah, so that's
a great way to start. I'll say there's two
potential integration paths. If you-- I'd recommend
most developers to just go ahead and use the basic one,
which is you basically add a button, which is
a widget, and it's similar to any other
widget in Flutter. You add some configuration
and you'll be good to go. That's what you're showing
right there, Craig. For most of you,
that's going to be OK. If you have a more complex
or dedicated integration, there's another,
more customized path. It requires a bit more
coding, but it gives you a lot of freedom. I think probably as much
freedom as you would need. So we have these two options
because there's-- not every payment flow is the same. But I'd say, why don't we
start with the basic one and see how we do? Just, like, to warm up. CRAIG LABENZ: Yeah, absolutely. I do have one question
that I was just curious about on my own. So we can-- as I was reading
the documentation previously. But we see here that
there's reference to these configuration
assets, and they're dedicated JSON files. And they're mentioned
up here in the doc, where it says take a look at
some of the examples, blah, blah, blah. And so I'll just click
over to that real quick. And we see that they're
in the Assets folder, and they're just
hard-coded JSON files that indicate all
kinds of things, like shipping
methods and whatnot. And my first reaction
when I saw this was, does this mean I'm going
to have to ship a new val-- a new version of my
app to respond to on the ground business
changes that might happen? The pricing change of
shipping could fluctuate and now all of a sudden,
I have to release a new version of my app. And I'm wondering,
when you mention that other pathway that has-- involves more coding
but basically opens up the full universe
of flexibility, is this one of the
areas of flexibility that you get where you
maybe have some more dynamic configuration? JOSE UGIA: Not quite. CRAIG LABENZ: I'm putting
you on the spot here. JOSE UGIA: We to have that-- we want to have--
no, that's what we should do the whole time. I'll definitely be
generous with you as well. No, this flexibility
is something we want to bring for every
integration approach. In fact, we right
now have the file, the JSON file that
you are showing. You can still change things
because the display items, so the items where you set the
things that you're purchasing and the price,
that's still dynamic. But there's one pull request
that is going to emerge shortly, probably by the
time-- if you're watching live, maybe not now, but if you're
watching this later on YouTube, probably by this time, it
will be already merged-- that gives you the possibility
to not use files, but use strings directly. So you can form that
string in whichever way is convenient to
you, and then you can receive it from your
server, for example, if you have multiple configurations. And then you can build them into
the widget and [? top ?] it. And we plan to have that
for both integration paths, just to give you that
flexibility, which we think is necessary, to be honest. CRAIG LABENZ: Yep, I agree. It also feels necessary to me. And just to fully close the
loop on what you're saying, this is also a
string, of course. And he's just saying,
you can use strings. But this is a string to an asset
that is then loaded in process. So you're talking about the
raw data gets threaded in-- JOSE UGIA: Precisely. CRAIG LABENZ: --here instead. Yeah. Nice. JOSE UGIA: Precisely. Yeah, one thing
that we'll consider as well is having actual
typed classes with builders so that you can-- if you
want to build them strictly dynamically-- we haven't done
this yet because we don't see a big use case for that. Most of the times,
that configuration is either pretty set or it's
configured somewhere else not in the app because
we are talking about payments, something
that could change, as you pointed out. So we don't see
a clear use case. But that's something that
the community talks about and they bring it up. That's something that
we can do as well. We have been planning
to do it, yeah. CRAIG LABENZ: OK. Well, thank you for
humoring me there. Where should I start? In the documentation,
it also mentions creating these integrations
with Apple or with Google, basically registering your
actual business and whatnot. Is that required for
just to kind of see a Hello World version
of this working locally? Is this where I should begin? JOSE UGIA: Not required. CRAIG LABENZ: Great. JOSE UGIA: 99%
sure not required. So let's see if we
can avoid it, yeah. CRAIG LABENZ: Wonderful. Didn't want to do it. All right, so where
should I start? I've done this so far. That's it. JOSE UGIA: Yeah. You can go ahead and create-- oh, that's a good example. You can go ahead and create the
Google Pay button and Apple Pay buttons in your layout. Just place them where
you feel they fit best and see what we see. CRAIG LABENZ: OK. I'll just start with
the Google Pay button. And you know, I don't even
know if I have an Android emulator running on my machine. We're about to find out. We're about to find out a
lot of things, including why the dictionary
pops up when you just try to highlight stuff. JOSE UGIA: No [INAUDIBLE]. CRAIG LABENZ: OK. Got this code. We're back into main.dart. Let's get rid of
the terminal here. And oh yeah, I've got to
get rid of all the comments. The ceremonial beginning. [INTERPOSING VOICES] CRAIG LABENZ: The first
maneuver of any new project. JOSE UGIA: That's a
quick way, that approach. So Gustavo, we
have a little note at the bottom stating that
it is not an officially supported Google product. It's not a product. It's an open source project. So that's all that it means. We will still keep
on contributing. So much as we expect
to see contributions from the community, we
will still be active to it as much as we can. So it's just like a
note that goes there for non-official products,
like open source projects. CRAIG LABENZ: Yeah, and
so to make sure I fully am understanding
here, this disclaimer is just about this package. I mean, Google Pay is obviously
an officially supported Google product. It's just this Flutter package
that is not an official Google product, is that-- am I-- JOSE UGIA: Correct. CRAIG LABENZ: --reading the
room right-- correctly there? JOSE UGIA: Yeah, and it's
good that you pointed it out, especially since it
involves integrations with other providers. As you can see, it's not
only Google Pay there. And that's the way
we wanted it to be. In fact, like, it
shouldn't matter what we want it to
be because we want this to be something that is
owned by the community, not Google Pay. CRAIG LABENZ: Oh yes,
simulator is what I want. When are you going to launch? There we go, simulator. I actually don't think I've
installed an Android emulator on my computer, which is funny. I used to have one, and then
I got a new work computer and I just don't
think I have since. So we're going to go
the Apple route, which may surprise some folks. But that'll really show the
power of the Pay package. It is not only for Google Pay. So I'm going to add
this button to-- we're just in the
counter app here. Oh yeah, I got to save
to format after the edit. We've got our center thing here. I guess we'll just kind
of put it in this column. And of course, we
have to bring in-- wow, I've never looked
at my editor this big. It's really quite jarring. All right, so we need to give
it our handler, our callback. And the tooltip
is so aggressive. We need-- we owe it the callback
and the actual things that are being purchased. Now, this paymentItems
parameter, this is presumably
not my full inventory. Is this the user's
cart, essentially, that they're buying? JOSE UGIA: Precisely. Yeah, that's precisely it. CRAIG LABENZ: OK. It's there. Great. So I was also wondering about
this status final_price. Can you tell me a little
bit about this parameter and the enum here that
we're dealing with? JOSE UGIA: Yeah, so this is an
area where multiple providers have different
nomenclature, but it comes to say whether a price is
already final or it may change. You may want to
say that price is changing for multiple reasons. For example, if--
let's say you're booking a car sharing ride, so
you don't know ahead of time how much that's going to cost. So that price is not final. Or there might be charges in
terms of taxing or shipping. So if the price is
subject to change, you want to use those
different values. Now again, every provider uses
a different set of values. For now, we have found a good
middle point between Google Pay and Apple Pay. But as we add more
providers, that's something that may
be subject to change. And maybe at some point,
become platform-specific. We are trying to
avoid it, but it's something that could happen. CRAIG LABENZ: Right, right. Yeah, I can imagine if
you get different sets, like imperfectly
overlapping sets of states that different providers offer. But OK, yeah, this
makes sense here. Cool. So I'm going to return. We've got our paymentItems. We still don't have the handler. And I'm going to remind myself
what the signature to that looks like. Oh, it takes a
paymentResult object. Well, that's the very-- JOSE UGIA: It's just basically-- CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: --the result
of the payment, yeah. You will see now. JOSE UGIA: So the type of
this-- oh, it's dynamic. What? This is surprising. JOSE UGIA: Yeah, that's
the result. So that is-- CRAIG LABENZ: Oh. JOSE UGIA: That is the outcome
of the payment selection that you have made on screen. CRAIG LABENZ: Dynamic. All right, so yeah, I want to-- I think I'm just going to print
this to start paymentResult so we can see what
we're dealing with. Which, of course, means
I could have just put-- I could have literally
written print right here and in fact, that
is what I will do because I love a good tearoff. So for now, we are just going
to print what we are returned. So what would happen right
now if I run the app? Is it going to do something? JOSE UGIA: You will need-- so what will happen is
the button won't show. One property that these buttons
have, the basic integration, is that if you cannot pay
with that payment provider, the button hides automatically. And so since we haven't
provided the configuration, it's going to error there
and then hide with-- you can still see
the error on the-- there's a callback
with an error. CRAIG LABENZ: OK. JOSE UGIA: But the
widget will disappear. CRAIG LABENZ: Got it, OK. Yes, as soon as I asked
what would happen, I remembered, and then it was
exactly what you launched into. Now, it's nice that you
said the buttons hide. So does this mean I can
just, in my code, show-- I can just have both
widgets sitting there and I don't need to
actually check the platform, they'll hide themselves? JOSE UGIA: Yes. CRAIG LABENZ: Or
do you still think it's a best practice to check
if iOS and then conditionally show the Apple Pay button? JOSE UGIA: Yeah,
there's different trains of thoughts for that. You probably have an opinion. Maybe there's a
guidance from Flutter that I don't know about. But basically, the basic
way will do it for you. The customized way,
then it's your duty there to take care of that. So it really depends on
what your style is, how you're doing your application. Basically, both
would be supported. If you want to have
control over that, then you can go with
the custom integration. If you're fine just dropping
the buttons and have them do what they need to do, then
you can go for the basic. CRAIG LABENZ: Got it. OK. So I'm just-- first of all,
I've made my Assets directory in the wrong directory. But I'll just call this
apple_payments.json real quick. And then we're going to
move this entire folder. I've copied in the
exact raw data. Oh, thanks for the
reformat, VS Code. That's real nice. OK, let's move this
directory up to the root. One thing I noticed-- I was expecting to see
these assets called out in the pubspec.yaml and
I don't think they were. What is going on
with my terminal? There we go. Well, let's move
lib/assets to just assets. There we go. OK, now our folder is in the
correct location, and this, we simply called-- what did we call it? apple_payments.json. apple_payments. OK. Now, the pubspec.yaml that
I was just talking about, when I looked at the examples-- pubspec.yaml. So we'll go back to the
Example folder and pubspec. In the Assets spot-- oh, it does, actually. I'm just-- I just missed it. OK, that's great. I'll also make this a little
bigger so folks can see. Sorry. Assets, here we go. Doo-doo. And where did this even go? Where did I read that? Oh, right in the Flutter
directory, or the Flutter entry right here. So I'll put it
here under Assets. All right, I think that'll work. So it's building. And now it makes
a lot more sense how that will be pulled in. Oh, you have an
Images directory. Are those images just
for the fake inventory? They're not really-- JOSE UGIA: Yep. CRAIG LABENZ: --the buttons. JOSE UGIA: We have a
shop only with one item that is a T-shirt. So that's the only one we
sell in the sample app. We needed an image
for that, yeah. CRAIG LABENZ: I would buy this. JOSE UGIA: How many times? It's the only one item we have,
so you have to buy it, like, multiple times so-- CRAIG LABENZ: Again
and again and again? Yeah, you get one of those,
like, ultra-utilitarian wardrobes where you just wear
the same shirt every day. Simply so you can test
your e-commerce app. I love it. OK, are we now ready to run? Oh, this is interesting. This is maybe hanging. I think-- JOSE UGIA: Let's see. CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: In the meantime, we
keep on receiving questions. Thank you for them. AMG at 6:25, you do not need a-- to have PC to be
compliant with PCI DSS if you're integrating through
a payment gateway, which is one of the ways in which
you can use Google Pay, with a gateway. If you're doing a direct
integration-- that is, if you are processing
payments yourself-- then you will need to
be PCI DSS compliant. But that's no difference from
your current payments approach. CRAIG LABENZ: I'm
so glad you're here to answer those kinds
of questions, Jose. I don't know the legal
things about payment accepting whatnot. Of course, you do. Boy, you are-- I love it. JOSE UGIA: Yeah. CRAIG LABENZ: Are there
any other questions-- JOSE UGIA: Let's see. Maybe next time, we switch
positions, and I'm coding and you answer questions. CRAIG LABENZ: OK, yeah,
then I can just relax. Any other questions that
you're seeing that you to get to while this builds? JOSE UGIA: Let's see. The GPay source code. If you're talking about the
source code for the plugin that we are working
with, definitely you have it in GitHub. You can find it through
the pub.dev link that Craig's using. And not only find it, but
also hopefully contribute or leave your thoughts. For Google Pay-- for the
Google Pay product source code, we don't have source code
to be shared for you. CRAIG LABENZ: [LAUGHS] I can
only presume they meant-- JOSE UGIA: At this point. CRAIG LABENZ: --the package. That would be a--
that's a bold-- I admire that
question, if they were asking about the actual
Google Pay source code. JOSE UGIA: You have
to be holistic. CRAIG LABENZ: Right, right. Any other questions
while it is-- oh, apparently my volume
is a little quiet. So I'm going to turn
my gain up slightly and we'll see if it works. JOSE UGIA: Oh, there's
a question that I-- it's a bit better. There's a question
that I missed. Mohd Ubaid-- "Are we also
covering Stripe integration with Google Pay?" We are going to cover
the integration with PSP. We're payment gateway agnostic. That means that once you
receive the paymentResult, then what you have to do is
send that payment information to your gateway,
whatever that is. Could be Stripe, could
also be any other. Most PSPs do have
libraries as well to let you send that to them. Or alternatively, you can use-- you can do it through your
backend, like you do today when you receive a credit card
and you send it to your PSP. Concretely for Stripe,
they have a Flutter library as well or Flutter
plugin, and it's well integrated
with Google Pay-- or sorry, with the Pay plugin. So that means that once
you get the paymentResult, you can use the Stripe plugin
to send that information to Stripe to the backend. CRAIG LABENZ: Let's go-- oh, interesting. So-- JOSE UGIA: Huh. CRAIG LABENZ: I-- we didn't-- we don't have "Buy with"
anywhere in our code. JOSE UGIA: You should have a
width, I think, in the button. CRAIG LABENZ: Width. All right, we'll
start with that. And I'll just say 200 for now. OK? Much wider. That worked. JOSE UGIA: Mm-hmm. CRAIG LABENZ: What do
I change "Buy with"? [HUMS] Function,
child, child on error. Wow, I am actually not seeing-- oh nope, that ain't it, either. JOSE UGIA: What
are we looking for? CRAIG LABENZ: Oh, I was just
wondering the "Buy with" text here. What if I wanted this to say-- JOSE UGIA: Oh. CRAIG LABENZ:
--checkout or something? JOSE UGIA: Oh yeah. That's not modifiable
as per, in this case, Apple Pay's guidelines. Google Pay's has those
different types of buttons, but that's why you
have a type property. If you can see on line 70-- CRAIG LABENZ: Oh. JOSE UGIA: --you have multiple
types of buttons there, and that changes the label. CRAIG LABENZ: Whoa. Whoa, whoa, whoa, whoa, whoa. All right. Hey, checkout. Literally what I wanted. JOSE UGIA: Yeah, checkout. Let's go with checkout. CRAIG LABENZ: And
the answer is-- zzz. JOSE UGIA: Let's see. CRAIG LABENZ: Trying to rebuild. JOSE UGIA: What's going on? CRAIG LABENZ: Also, I'm
going to try to make this-- oh, whoops. Let's see if we can get
everything on the screen here. So-- why didn't this rebuild? This still says "Buy with." We'll do a hard restart. JOSE UGIA: Let's
try another one. Maybe that's the default. CRAIG LABENZ: Ah, checkout. JOSE UGIA: Oh, checkout, yeah. CRAIG LABENZ: So-- oh,
I wonder if there's a little hot reload issue
with the implementation of this bug-- or this button. Try again. JOSE UGIA: Maybe. CRAIG LABENZ: Checkout and we'll
go back to, let's say, book. I'm curious what that one is. Oh yeah. JOSE UGIA: Huh. CRAIG LABENZ: I wonder if this
is like a closure or something in there, because I know
those don't get sliced over for a hot reload. JOSE UGIA: Maybe keeping
the state internally. Maybe we don't have
stateful one internally. We'll have to-- CRAIG LABENZ: Pay button is-- JOSE UGIA: Take a look at that. CRAIG LABENZ: --stateful. Yeah, I don't know. Interesting. All right. We can file that one
away for further-- or for future investigation. Are we ready to click
the button, Jose? JOSE UGIA: We can only try. CRAIG LABENZ: Indeed. [INAUDIBLE] no. Output, right? Let's see what we get. JOSE UGIA: Yep. CRAIG LABENZ: Nothing so far. Oh, Debug Console. That's what I wanted. But still nothing. So what did you
expect to happen? Should something have popped up? JOSE UGIA: Let me see. Hmm. Can I take a look at the widget,
the Apple Pay button widget? CRAIG LABENZ: Yeah. JOSE UGIA: The
configuration is there. paymentItems. Yeah, it looks good. onPaymentResult print. onPaymentResult is there. No, that actually
looks good to me. Interesting. Is Apple Pay enabled
on that device? Maybe that could be it. CRAIG LABENZ: Oh,
that's a good question. So I'll go to the home screen. You know, I have no idea
how much of a headache it might be to enable
this on a simulator. We might have to, like, sign in. Which feels like a real hassle. I'd have to look up
my Apple password. JOSE UGIA: Maybe. Let me see. CRAIG LABENZ: Accessibility. Well, let's see what this says. Let's see if this
kind of mentions it. Then we get to use-- oh
here, is this kind of-- no, that's just Apple Wallet. I don't think. That's also different
from Apple Pay. I think I'm going
to have to sign in. So do you think I should get-- I'm probably going to have
the same issue on an Android emulator, aren't I? I think I might
just bite the bullet and sign in, which I will--
will, of course, involve not typing my password on
the stream because it will be my real Apple ID. [LAUGHS] Best not to
broadcast that password to the whole world. I'm looking at-- JOSE UGIA: At this
point, [INAUDIBLE].. CRAIG LABENZ: --right
now in one password. Jose, do you want to take a
few questions while I do this? JOSE UGIA: I was
taking a look at that because I was expecting your
password to be not very short. But let's not disclose
any information about it. OK. So as you will point out, Aksh
Desai, Google Pay in India works a bit differently
and right now, it is not covered in
the Google Pay API-- the Google Pay API,
as a whole, including this library as well-- being UPI is a completely
different method to do real-time payments, which
is, by the way, a great system. But again, Google Pay
API will be applicable if you're using a payment
gateway like Stripe or Braintree, Adyen-- any payment gateway
that is supported, you can use it with Google Pay. In fact, I do believe that
this is a payment collection mechanism that is also
available in India. So if you're doing it through
UPI, you cannot use the API. But if you are using
a PSP, then you can use the Google
Pay API as well. Let me see. What else do we have? I'm trying to concentrate on
questions that I can answer. CRAIG LABENZ: That seems
like a [INAUDIBLE].. JOSE UGIA: Screen share. Flutter web. Yeah, hi, Lima Tech. This is a question from
a bit sometime ago, so hopefully you're
still with us. We are-- we have web
integration in our pipeline. Also, the Flutter team is very
passionate about reminding us of the importance of including
web, which is something that we appreciate. For the time being, we are--
it's not under development. But that's something that we
will consider for next year. But once again, remember that
this is an open source project, so there's a big discussion
open in GitHub about this. So one option is that
we have contributions from a group of external
contributors as well. So this repo doesn't have
to be one or two-- we can share a bit the effort to get. Then that certainly
will speed up things. But yeah, any
thoughts, any feedback. There's a discussion
about web in GitHub. And at the same
time, we are still looking into it ourselves. So hopefully, we can
get to it next year. It will help a lot to hear
your use cases about that as well, by the way, if you
use the comments for that. We see a very solid use case
for using Google Pay in Android. We do support web
as well, but we have seen less interest
than on Android from the Flutter community. So that's something that
we'd love to hear about, if you have different thoughts. CRAIG LABENZ: All right. I suspected I might
be hitting a dead end, so I started to
read the live chat and Karan, Developer
Karan, tells us that we have to use a
real device for this. Is something that you've
encountered, Jose, when you've been testing this? JOSE UGIA: You can
definitely use a simulator. I do have mine set up. But I do believe I'm logged in. It's been a while
since I've used it, but I'm logged in with my
device, and that works fine. You can test your
Apple Pay integration. As you can imagine, I've
tested Google Pay a bit more than Apple Pay, but as
far as I can remember, yeah, that should work. CRAIG LABENZ: So
you think I should be able to do what I'm
trying to do right now. JOSE UGIA: I think so, yeah. CRAIG LABENZ: Now,
the same person also says we have to add a-- I think they meant sandbox ID. Does this ring a bell for
what you might have done? JOSE UGIA: I don't think
that's necessary, no. CRAIG LABENZ: OK. Karan, I very much
appreciate the ideas. Hey, Gianfranco's here. Yesterday on-- or at least
was here four minutes ago. Yesterday was on update Q&A,
offering a lot of great intel. So I don't want to
just spend forever here trying to get
this set up, but we seem to be blocked
on having it set up. JOSE UGIA: So-- CRAIG LABENZ: So that is-- JOSE UGIA: --are we-- CRAIG LABENZ: --something
of a constriction. JOSE UGIA: Were you able to log
in your Apple account, Apple ID? CRAIG LABENZ: I'm
logged in, yeah. My wife and here, like
all the real things. JOSE UGIA: Still the
button doesn't show? CRAIG LABENZ: Oh, you know what? I haven't-- I assumed I was
going to have to activate something here. But no, let's go
back to the app. That could be what's up. JOSE UGIA: Yeah. Try. CRAIG LABENZ: All right,
we're in the corner clicking. Nothing. But let's restart. Clicking. Nothing. Phooey. JOSE UGIA: Yeah, that should
trigger the payment sheet. Open it up from the bottom. So it's something related to
the device or your account. Let me see if I have
cards on my device. CRAIG LABENZ: Yeah, I'm
looking at my real phone now to see where does
Apple Pay show up. Oh, there's Wallet and Apple
Pay is a thing in settings. Did I see that here? It's underneath the App Store. No. [LAUGHS] JOSE UGIA: Does Apple Pay
needs to be enabled, maybe, in that device? CRAIG LABENZ: So
on my real phone, under this section with
General Accessibility and Privacy and Security, then
there's an App Store and Wallet and Apple Pay section. Before Passwords,
it's right in here, and it just isn't showing
up on the emulator. I'm going to read
the real chat again. CRAIG LABENZ: Try this
once-- iOS Simulator, Features, Authorize Apple Pay." OK. Like that. iOS simulator, I think
they might mean-- I'm trying to figure
out what that first-- oh, Features. I see it now. Features. OK. Authorize Apple
Pay is grayed out. JOSE UGIA: Huh. Let's see. CRAIG LABENZ: Well, no,
it's not grayed out. Maybe just the keyboard
shortcut was grayed out. This is an excellent-- JOSE UGIA: One thing. CRAIG LABENZ: --idea. [LAUGHS] JOSE UGIA: It is neat. CRAIG LABENZ: So I don't-- yeah, it's hard to tell
whether or not this has worked. I mean, I clicked it. JOSE UGIA: And me-- I think we're missing also
the integration requirements potentially on the project. We may need to enable the-- we may need to enable Apple Pay. I bet that was already
enabled, but we can check on the
XC workspace to see if Apple Pay's enabled there. Do you have Xcode over there? CRAIG LABENZ: Yeah. Oh, I can. Now, I didn't start
from the sample. So if that's part of the thing-- let's make notes-- JOSE UGIA: Ah, yep. CRAIG LABENZ: --of all-- these are all great
bits of documentation that we should add
to the package. So I'm going to just
open the directory. Cool. JOSE UGIA: Yeah, so that's-- in the requirements, in the
pre section on the Read Me, you have a link to the Google
Pay and Apple Pay requirements. CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: Those that we
jump before, because I said that we can skip them-- OK, we can skip the consoles,
but there are some requirements that we cannot escape. So. CRAIG LABENZ: [LAUGHS] JOSE UGIA: But I think it was
just that one, so let's see. Yeah, that first
step on Apple Pay. CRAIG LABENZ: So this one? Integration requirements? JOSE UGIA: Yeah. Yeah, I think that's it. CRAIG LABENZ: I see-- right. JOSE UGIA: Especially-- CRAIG LABENZ: Take a
look at [INAUDIBLE].. JOSE UGIA: --that one,
Enable Apple Pay Capability. CRAIG LABENZ: In Xcode. Oh, OK. After creating a merchant
identifier-- so we we're still skipping that,
and hopefully that'll work. But we obviously-- JOSE UGIA: I think
we're going to skip it. CRAIG LABENZ: --want
to [INAUDIBLE].. Apple Pay. So open the project, select
the project, choose the target. All right, we're going
to do this one at a time. Here we go. We've got the target. Next. Choose the target from the
app and the popup thing. OK, so I think I did that. Signing and Capabilities. Great. JOSE UGIA: Yeah, in Apple
Pay utility, probably. CRAIG LABENZ: In the toolbar,
click the Library plus button. No, wait, where is that? [INTERPOSING VOICES] CRAIG LABENZ: That could help. What did it say here? In the toolbar, click
the Library button to open the
Capabilities library. Where's this plus button? It didn't make a
provisioning profile and it seems like maybe a-- oh, here we go, Capabilities. OK, Pay. What are you going to do? What? JOSE UGIA: I think I
see Apple Pay there. CRAIG LABENZ: Well, that's good. It makes one of us. Where do you see it? JOSE UGIA: But you don't. CRAIG LABENZ: Oh, on
your Xcode you see it. JOSE UGIA: Yeah. Nice code. CRAIG LABENZ: Goodness gracious. All right. At what point should
we pull the plug and do this in an
Android simulator? Also, are we going to have all
of the exact same headaches in an Android simulator? JOSE UGIA: No. Give me 20 seconds. CRAIG LABENZ: All
right, I'm going to-- JOSE UGIA: Maybe one minute. CRAIG LABENZ: --close
this app as well. Xcode enable Apple
Pay on iPhone. JOSE UGIA: Whoa, I
have way more items. CRAIG LABENZ: That's not even
remotely what I had typed. Apple Pay iOS emulator. JOSE UGIA: Why don't
you try with Wallet? CRAIG LABENZ: I need a paid
developer account, Ray says. I have that. I definitely have a
paid developer account. JOSE UGIA: Used to be-- it used to be Apple Pay before. Maybe it's Wallet now. Why don't you try with
Wallet in the Capabilities? CRAIG LABENZ: OK. Returning to Xcode. JOSE UGIA: Yup. CRAIG LABENZ:
Capabilities, Wallet. JOSE UGIA: Try Wallet. CRAIG LABENZ: I don't
see it here, either. JOSE UGIA: You don't
see that, either? Huh. CRAIG LABENZ: Nothing. Why? JOSE UGIA: Interesting. CRAIG LABENZ: What
a miserable thing. JOSE UGIA: Mm. CRAIG LABENZ: Also, just the
Capability whole plus here is grayed out. JOSE UGIA: A little bit. CRAIG LABENZ: I wonder if
this has anything to do-- I wonder if it's
only willing to do those with a successful
provisioning profile. I've never actually
seen this fail before, but I'm also wondering if,
on my personal machine, this would pass. JOSE UGIA: Right. CRAIG LABENZ:
[INAUDIBLE] I really suspect it would pass
on my personal machine. But I don't know what I didn't-- what I'm missing
on this machine. JOSE UGIA: It could
be that, yeah. But I think if we
can enable it there, I believe that we won't
be able to see it working. CRAIG LABENZ: OK. JOSE UGIA: [INAUDIBLE] CRAIG LABENZ: Should we switch
over to an Android emulator, do you think? JOSE UGIA: Let's try that. CRAIG LABENZ: OK. So I'm going to need to-- first of all, let's kill you. Thank you for your service. And create an Android emulator. That's what I want to do. Oh boy. Yeah, I don't think
I've done any of this since getting my
upgraded work computer. AVD Manager is missing
from the Android SDK. JOSE UGIA: Do you have
Android Studio with that? CRAIG LABENZ: I thought I did. I know I did on my old computer. Nope. We're really starting
from scratch here. [LAUGHS] JOSE UGIA: Just do it-- CRAIG LABENZ: Good stuff. JOSE UGIA: Yeah, Hamza, I'm
standing, because otherwise I get to relax. And I can move around as well. Hopefully that's
not bothering you. Craig is definitely
much more static. Yeah, that standing desk
that has a manual mechanism. So every time I want
to put it up or down, I have to roll a little
knob for a while. But then after a few
seconds, I'm done with it. CRAIG LABENZ: That's
pretty hardcore. JOSE UGIA: It's not bad. But I can justify to
myself the automatic one. I change the height of the
table only a few times per year. CRAIG LABENZ: Mm. So you stand a lot. JOSE UGIA: Yeah,
especially for calls. And it's got one of those,
like, treadmills that people do, although I haven't been
able to concentrate-- I don't think I'll be able
to concentrate if I walk and type at the same time. That must be very hard. CRAIG LABENZ: Yeah,
I've heard that takes a lot of getting used to. I did have a coworker-- JOSE UGIA: [INAUDIBLE] CRAIG LABENZ: --that tried that. He could only walk-- yeah, he had a very
specific-- it was back when I was at Zapier. Great company, by the way. He would-- he was very
precise about the exact speed that if he went above that
speed, he would lose all focus. All right, we're not
importing any settings. Oh, this is all happening
on the wrong window. Let's bring this over. Yeah. Next. I can't click any buttons
other than presumably Cancel. JOSE UGIA: Oh, do you have-- [INTERPOSING VOICES] CRAIG LABENZ: Send usage
statistics to Google. Here we go. OK, Standard, yeah. JOSE UGIA: That. CRAIG LABENZ: Next. JOSE UGIA: Yeah. CRAIG LABENZ: Sure, let's
start with Light Mode-- I mean, Dark Mode. Sure, install the things. I'm going to need the emulator. Probably the build tools. I'm going to need the platform. I'm going to need
all those things. I'm going to need this-- JOSE UGIA: So while
you entertain yourself with the installation
of Android Studio, I have a question
for you, Craig. Well, actually, TEC
has that question. And they are curious
about whether you're using a virtual background. Or is that your real room? CRAIG LABENZ: Oh. Hmm-mm. No, there's no plant here. Also, my hand doesn't
actually cease to exist when I go
too far to the right. So keen eye. It is a virtual background. I have a green screen behind me
and a bunch of lights in front to light up the
green screen so I don't cast a big shadow on it. And why isn't this
letting me do it? I can't press any
of the buttons. JOSE UGIA: Accept. You have to accept all of
them, that one as well. CRAIG LABENZ: Oh, there's more. I see. JOSE UGIA: Yep. CRAIG LABENZ: Got it. JOSE UGIA: Train
Of Thought, I've been using M1 for
about a year now. And I was expecting
some bumps on the road, but I have to say that I haven't
probably experienced any-- maybe only a couple of them. Even with things like Docker,
it's been pretty smooth. So I don't foresee
you having issues developing Flutter with M1. I'd actually expect
the opposite-- that it, it works fine for you. CRAIG LABENZ: Yeah, I
haven't had any issues. Every now and then, you'll
run into a weird one, like the gRPC
package for Python, they had not released the
correct universal binary for a 1 version of Python. So it was like, on a
project that I had, I couldn't update to the latest. I had to stay on, like,
Python 3.9 instead of 3.10 or something for a long time
because the gRPC thing just wouldn't compile. So you'll run into these
really random gotchas. But in general, it's
all quite ironed out at this point and quite smooth. Also, I am taxing my laptop
absolutely to the max right now. I've got OBS running,
we're streaming, got video calls going. And my old Intel Mac could
have heated the planet if I tried to do that. And on the M1 Mac that I'm using
now, the fan's not even on. It's like cool to the touch. Honestly. It's not above room temperature. So it is just unreal
how powerful they are and how efficient they
are with that power. All right. JOSE UGIA: Cool. CRAIG LABENZ: I've done this. We're not making any-- JOSE UGIA: If you
can get to the SDK. So that on the menu on the
top for Android Studio, you should be able
to see the simulator. Oh yeah. CRAIG LABENZ: Oh, this is-- JOSE UGIA: Oh,
that's still missing? CRAIG LABENZ: All right. Yeah. So what-- presumably Android
Studio is the correct place to walk through
setting this up, right? JOSE UGIA: Yeah. Do you have-- can you
see the menu at the top? I cannot see it
on the livestream, the menu for Android Studio. CRAIG LABENZ: Oh,
it's very limited. It just says Android
Studio, File, and Help. JOSE UGIA: OK. Ah, that one. CRAIG LABENZ: That
might be because I need to get into a project. So I think I'm
just going to make an empty project real quick. Basic Activity, I guess. Oh, I'll make one with GPay. Woo-hoo, that might
save some time. JOSE UGIA: Yeah, fantastic idea. CRAIG LABENZ: And
sure do love all this. JOSE UGIA: Yeah, that looks OK. CRAIG LABENZ: Finish. JOSE UGIA: OK, so now at
the top right, we can-- CRAIG LABENZ: An inch. JOSE UGIA: --access the
simulator from there and see what's missing
and install it. CRAIG LABENZ: All right. We're in Android Studio. JOSE UGIA: All
right, so you have that little icon next to the
elephant on the right side. Or Device Manager,
that works too, yeah. CRAIG LABENZ: All right. JOSE UGIA: Oh yeah, your device. CRAIG LABENZ: This
seems familiar. I knew I had it on my old one. I don't know how I
got migrated over. Let's see if it runs. If it does, then-- yeah, a Kotlin IDE
error has occurred. Are we running the device? OK, it says it's
connected to the emulator. JOSE UGIA: Mm-hmm. CRAIG LABENZ: Sure,
use whatever you want. Eavesdrop on me. [LAUGHS] Imagine if emulators
had that capability. That would be the most
devious thing in the world. It would also be deduced
in, like, a minute. Wow, the emulator is running
tucked into this corner. JOSE UGIA: Yeah. , You
can make it come out or-- CRAIG LABENZ: I'll pop it out. JOSE UGIA: --make that
window a bit bigger. With the-- so if you-- CRAIG LABENZ: How
about I pop it out? I think that's what-- JOSE UGIA: Minimize-- CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: At least you
can minimize the window above in the Device Manager. You can make that small. CRAIG LABENZ: Oh, OK. All right. JOSE UGIA: And then
your device will be big. CRAIG LABENZ: Now, is this-- JOSE UGIA: [INAUDIBLE]
you get it out. CRAIG LABENZ: Yeah, I
would like to do that. Oh, that wasn't it. Full screen. Yeah, I don't know. I'm not seeing how to do it. Maybe if we re-- right-clicking's
not doing anything. These buttons don't
seem to do anything. This is not it. Showing Maps and whatnot. I don't see Payment
here, so we'll see. All right, I've got
an emulator running. Even though this is tucked
into Android Studio, do you think we're
going to see it from-- JOSE UGIA: You should
be able to see it. CRAIG LABENZ: Yeah, I was hoping
it would just kind of show up here. Let's-- JOSE UGIA: Yep, should show. CRAIG LABENZ: --reload this. How do you even reload VS Code? I'm blanking on this. JOSE UGIA: We'll need
to reopen it again. CRAIG LABENZ: Wow. JOSE UGIA: I wonder why you
don't see the SDK in there. Maybe it's your
Flutter path to-- your Flutter config
to the Android SDK is not properly set. CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: One of those things
that you do once 10 years ago and you don't have
to do it again. CRAIG LABENZ: Never do it again. Right? And then you get a new computer
and you have to do it again, but you don't realize till
you're on a livestream. JOSE UGIA: [INAUDIBLE] CRAIG LABENZ: One
of those things. JOSE UGIA: That's
how it happens. CRAIG LABENZ: So do you remember
how to just kind of restart VS Code? I guess I can also-- I've never used Android
Studio, honestly, but I could try to use the
Flutter project from here. JOSE UGIA: You could-- CRAIG LABENZ: Do you use
Android Studio or VS Code? JOSE UGIA: Or you can-- why don't you use the
Flutter command line to take a look at the devices? Isn't there, like-- I recall it was some Flutter
devices, something like that. CRAIG LABENZ: Yeah, I
don't know what it is. But it does exist. Or just Flutter devices,
list all connected devices. [HUMS] By the way, Jose,
feel free to keep your eye on the live chat to
see if anyone is-- JOSE UGIA: OK, so
it shows that-- CRAIG LABENZ: --has the
correct answer for us here. CRAIG LABENZ: Yeah,
you have it there. CRAIG LABENZ: So it's
just the VS Code thing. So I guess we can just can run-- JOSE UGIA: So you can-- yeah,
you can try flutter run. CRAIG LABENZ: Oh, but also let's
put in the Google Pay button now instead. JOSE UGIA: All right. That'll be a good idea. CRAIG LABENZ: Go back--
let's go to Packages. JOSE UGIA: True, you
could do Flutter-- do you know if we have
the Flutter plugin? Do you get this laptop from
the box right now out, Craig? You can tell us. CRAIG LABENZ: [LAUGHS] No,
I've had it for some time, but I've never used
Android Studio. As we all saw, I just
had to download it. All right,
onGooglePayResult. This, we're still just
going to put print. And then-- JOSE UGIA: Yeah, that works. CRAIG LABENZ: I've got
to grab the other asset. So let's do that real quick. Let's grab the Google asset. Get the wrong-- JOSE UGIA: Yeah, we may need
the Flutter plugin for VS Code, if we don't have it yet. CRAIG LABENZ: Oh, the
Flutter plugin for VS Code? Yeah, I have that. Yeah, yeah. JOSE UGIA: Oh, you have that. CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: Oh, you
have it because you can see the play button, yeah. CRAIG LABENZ: New
file, there we go. Google Pay. And we'll call this-- put it in the Assets folder. google_payments. There we go. JOSE UGIA: So Lalit Kumar, you
can integrate in-app payments on Apple Pay with a plugin. I believe there's
a plugin for that. This payments plugin is for-- if
you remember at the beginning, we mentioned that this
is for physical payments. So anything that is outside
of the scope of the Apple Store or the Google Play store. I cannot talk about the
App Store guidelines, but the Google Play ones will be
constrained to digital assets. So if you're doing
digital assets, you can use any type of digital
payments in pub.dev to do that. For the Pay plugin,
we'll be [INAUDIBLE] for physical
payments, so remember things like e-commerce,
clothing, tools, some physical services like
gym membership, food delivery, and things like that. CRAIG LABENZ: One
quick thought for you, Jose-- when you bump your table,
we hear that loud and clear. JOSE UGIA: I'm not paying
[INAUDIBLE] since I'm standing. CRAIG LABENZ: It just was
more pronounced for me. All right, we are building
to the device, which-- JOSE UGIA: Progress. CRAIG LABENZ: --we may
only see launch here. That will be really quite an
adventure, but we'll find out. All right, I'm going to look
at some questions as well, see if we have any
unrelated to this. Waiting for Material
3 update for GPay. Will it come soon? Do you know what
they mean by this? This question was from
almost an hour ago. JOSE UGIA: So the
Google Pay button has its own style guidelines
and its own design that will come with the plugin. So you don't have
to worry about that. Whether we keep that consistent
with the Material 3 style, I'm sure that's something
that the team is trying. But for the purpose
of this plugin, you can simply go with the
designs that are provided to make it easier for you. That's assembling. Yeah, I love the restart
tips that we are getting. This is so many times useful. So-- CRAIG LABENZ: Oh,
to see the thing. JOSE UGIA: --thanks for that. CRAIG LABENZ: Yeah,
I was just blanking on how to restart the IDE. I thought it was like-- there is a way to restart
it in place, right? What am I-- JOSE UGIA: I see. CRAIG LABENZ: --blanking
on for VS Code? JOSE UGIA: I don't know
about it, if there's a way. I always-- I may have been
doing it wrong for ages now, but always was close
it and open it again. I know Android Studio
has one way to restart, but I didn't know
that was in VS Code. CRAIG LABENZ: Higher Android
SDK version, of course. So we need to set our-- do you know what the
version we want to set is? JOSE UGIA: Yeah, try 21. CRAIG LABENZ: 21, OK. JOSE UGIA: Is-- CRAIG LABENZ: Right,
what do we have set? JOSE UGIA: If you go-- if
you search minSDK, yeah. JOSE UGIA: We'll do
[? hardcoded ?] for now. CRAIG LABENZ: 21, you said? JOSE UGIA: Yeah. CRAIG LABENZ: OK. JOSE UGIA: So. CRAIG LABENZ: All right. JOSE UGIA: Can restart
with Command-Shift-P. Ah, reload the window. That's what you
wanted, probably. CRAIG LABENZ: Uh. JOSE UGIA: That's it. CRAIG LABENZ: Thank you. JOSE UGIA: [INAUDIBLE] CRAIG LABENZ: I had some muscle
memory of typing "reload" and I just was suddenly blanking
on where I would type that. 10 points to House Gryffindor
or whatever house the person who said that wants
them forwarded to. And it seized the emulator. Can you believe it? JOSE UGIA: [INAUDIBLE] CRAIG LABENZ: So I'm going
to just try to click Run up here, Start Debugging. That's what I always press. Aha. All right. JOSE UGIA: All right. CRAIG LABENZ: It's thinking. Can you believe it? All right, I'm also scanning. I need to set the
path to Android tools in your shell file. Oh, someone's pointing out
further setup for this. Now, we might have it
working at this point. But thank you, Kishan,
I appreciate that. Hey, Felix. How you doing? We are just running in place
over here today, Felix. [LAUGHS] Doing a lot of setup. It's been-- JOSE UGIA: Storebought for
a new laptop and one hour integration. CRAIG LABENZ: [LAUGHS] New-ish. New-ish. I think I got it in October. All right, let's see here. So-- JOSE UGIA: So that must
be running already. CRAIG LABENZ: I think so. So is it-- hey, it is! OK. So I'm going to
click the button. JOSE UGIA: Are you nervous? CRAIG LABENZ: Requires a
Google account on this device. JOSE UGIA: Aha. Yep. CRAIG LABENZ: Progress! JOSE UGIA: Yep. CRAIG LABENZ: OK. So let me sign into
Google on this device. JOSE UGIA: And don't worry--
your users of your apps, they will have that already
set up on their device. They will have a Google
account already set up, so-- CRAIG LABENZ: Why do you
always have to do this? JOSE UGIA: --don't worry. This is just like a
Craig and Jose problem. CRAIG LABENZ: Here's
an exciting thing-- the normal sidebar
Chrome for the emulator. How do I start doing this? Where do I go-- oh, maybe I go here? Is this going to-- I don't want to screenshot. Go back, that should--
is this right? JOSE UGIA: Yeah, no, that's--
yeah, any of those would work. So if you pull-- CRAIG LABENZ: Do
I go to Settings? JOSE UGIA: Yeah. Yeah, that's fine. And then account. Something that
should be searchable. CRAIG LABENZ: I
have a Pixel myself. But again, I've only
signed in once ever, so. JOSE UGIA: Try Account. CRAIG LABENZ: Not a very snappy
experience on this emulator, I got to say. JOSE UGIA: No, yeah. CRAIG LABENZ: Ooh! And by not snappy,
I mean unusable. [LAUGHS] JOSE UGIA: Hmm. CRAIG LABENZ: Wow,
can't do anything. Oh, do I have to
literally type here? JOSE UGIA: You could-- CRAIG LABENZ: Also, what input? JOSE UGIA: --if you set-- you have to select-- yeah,
the input is not selected. Let's see if we can
select the Settings. CRAIG LABENZ: It says
don't [INAUDIBLE].. JOSE UGIA: Yeah, like
emulators now are very quick. CRAIG LABENZ: Non-responsive. JOSE UGIA: That's
something from 2012. At max, there's a Pixel 3a API. CRAIG LABENZ: So
I wouldn't mind. Can I turn this off and let's
try to launch it from VS Code. Because that might launch it
outside of whatever embedded universe that this is in. JOSE UGIA: That will
launch it outside, yeah. Yeah. CRAIG LABENZ: Right,
yeah, it certainly won't-- JOSE UGIA: Got to try. CRAIG LABENZ: --get
fired up in here again. All right, so let's-- JOSE UGIA: It looks like
the Android SDK now, so you can try-- CRAIG LABENZ: Stop. Yep, I do. So we're going to go
back to this Pixel. Here we go. Sure. Aha. This is the UI
I'm used to, which allows for-- actually, those
were the same buttons they were showing. Now, maybe in here can
I do account things? No. JOSE UGIA: No. This is just for mocking
and configuring the device and mocking some information. CRAIG LABENZ: Awesome. It says, check if
you have Google Pay. Well, I did. Create this-- oh no, that
was that project I made that we're not using anymore. We will have to check if we
have Google Pay on this device once it boots. JOSE UGIA: The simulator
seems really slow. So why don't you try a new
simulator, because this image is, what, 3-- [INAUDIBLE] 3. Try the new one. It's ARM64, so you
should be fine. But maybe you can
try create a new one. Maybe this one is filled with-- oh, you are there. CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: OK. CRAIG LABENZ: It
wants to record audio. No for sure. While we're using the app? Go away, please. All right. So this should tell us we
need an account again, right? So now we're back to-- JOSE UGIA: So that's
snappy enough. CRAIG LABENZ: --doing
account things. OK, here we go. Clicked the thing. It may work. JOSE UGIA: I hope so. CRAIG LABENZ: It's
working a lot better. JOSE UGIA: Yeah. CRAIG LABENZ: Typing "account." JOSE UGIA: There you go. CRAIG LABENZ: When I
clicked Google Assistant, I'm not sure if this was-- JOSE UGIA: That works. CRAIG LABENZ: --correct or not. This is the-- JOSE UGIA: Yeah, that works. CRAIG LABENZ: --direction
I should follow? OK. JOSE UGIA: If you sign
into that account, it will sign into
other accounts as well. CRAIG LABENZ: Luckily,
I have one password to access all of my passwords. JOSE UGIA: So. Kristi Codes-- this is the
life of the developer most of the time-- setup, more setup,
and less coding. And I think that's partially the
purpose of this, right, Craig? CRAIG LABENZ: Indeed. JOSE UGIA: To illustrate a
real integration process. CRAIG LABENZ: Yep. We're carrying the torch forward
of "The Boring Show," which was Filip's old creation,
for those who've been around Flutter for a while. Filip Hracek left Google
about a year and a half ago, but he was the original creator. It was his idea to have "The
Boring Show" to just show developers from the Flutter
team not knowing what they were doing, getting stuck. And we are certainly
living that energy today. All right, I'm
signing in offscreen. I have to say, this emulator
is still incredibly slow. I don't know if it's
because it's realistically provisioning Pixel 3,
like, memory and whatnot. It's not too snappy. Anyway, finding my password. Carry on, Jose. JOSE UGIA: Yeah. So lots of great tips over here. Thank you for that. And thank you for the support. I'm glad to hear that this type
of setups are useful to you. It's definitely--
yeah, some config. But those are the kind of
things that you do once. And during your
development process, it's only just
like the new parts that you have to
configure again. So-- but it's great to see the
support coming from your end, and the empathy as well. Glad that you can see reflected. CRAIG LABENZ: All
right, I'm signing in. I've completed the two-factor. It wants me to-- JOSE UGIA: That's very
quick for a two-factor. CRAIG LABENZ:
Yeah, Google Apps-- JOSE UGIA: I believe that's
a skill that we need, just the signing
in and dull bit. CRAIG LABENZ: Yeah,
sure, whatever. I'm in. Oh, sorry, I wasn't
saying that to you. I was saying it to
all these popups. I love what you
were saying, Jose. All right, switching back
over, now that I'm not typing my password. Hello, Craig. Hello there. JOSE UGIA: All right. CRAIG LABENZ: Hello, John. Hello, John. A little "Jurassic
Park" for you. Oh my goodness. I wish there was a mode
that was like, this is fake. JOSE UGIA: VS Code? Yeah. CRAIG LABENZ: This
is not a real phone that I will be using
for the rest of my life. JOSE UGIA: The I
don't care mode. The developer mode? Yeah, there's some
from a developer mode. It could be useful there for
account creation as well. CRAIG LABENZ: Man,
I can't believe how slow this emulator is. Every click is just like, I'll
take that under advisement. JOSE UGIA: Hmm. CRAIG LABENZ: We can even see
here-- look at the frame rate. Those were not dropped frames
on the stream of the spinner. It was just struggling. Now it's working,
but it was just struggling to spin the spinner. All right, do we have any
other exciting questions? JOSE UGIA: Just seeing
that it's so useful to-- well, try again. It's so useful to have that
help coming from a few dozen-- CRAIG LABENZ: Oh, it's trying
to connect to Assistant. JOSE UGIA: --hundreds
of developers. CRAIG LABENZ: I don't
care about Assistant. I just want to be-- [INTERPOSING VOICES] CRAIG LABENZ:
--which think I am, because I'm not worried
about Assistant. Yeah, yeah, yeah. JOSE UGIA: It might [INAUDIBLE]. CRAIG LABENZ: This
should be good. Hopefully it shows
me here in Accounts. This would mean that we're in. Yeah, we're in. All right. Don't care about Assistant. Go away. Go back. Home. JOSE UGIA: It must be something
with the configuration devices. These days, simulators
are very quick. CRAIG LABENZ: Yeah,
something's not right. All right, start debugging. JOSE UGIA: There we go. I think this is the one, Craig. This is it. CRAIG LABENZ: We're going
to see something print. It's going to happen. JOSE UGIA: This is it, I think. CRAIG LABENZ: [HUMS] JOSE UGIA: Ah, so the
loading widget, Kenneth, with this plugin, at
least, we have given you a little property in
the Google Pay widget that allows you to send any
type of widget that shows while the button is loading. So you can-- we have a
basic load indicator, but you can have
anything you want there. It's just basically a
widget, so you can configure that the way you want to. There's the property you can see
right now on the screen called a loading indicator. We have a circular
progress indicator, but you can add there
whatever you find convenient. CRAIG LABENZ: Yep. And you can add those anywhere. JOSE UGIA: And so that
was like an easy way. Yeah. CRAIG LABENZ: OK. I clicked it. JOSE UGIA: I think
it didn't catch it. Now it caught it. But the simulator is
gone now from screen. Oh, it's behind the-- CRAIG LABENZ: Oh,
yeah, yeah, yeah. JOSE UGIA: --VS Code. CRAIG LABENZ: Oh, it's thinking. JOSE UGIA: Yes. CRAIG LABENZ: Oh-ho-ho. It did not immediately
reject our attempt. So great. JOSE UGIA: On a
connection that allows us to see all the different
colors in the Google spinner. Then yellow again and
then green, all of them. Fast connection to the internet. CRAIG LABENZ: I wonder how
they picked those colors. [LAUGHS] JOSE UGIA: Can't guess. CRAIG LABENZ: All right. Oh, that's my old address still. App is currently running
in a test environment. Transaction will not
result in an actual charge. Great. Strongly preferred. JOSE UGIA: Mm-hmm. CRAIG LABENZ: That's a nice-- JOSE UGIA: That's why it's read. CRAIG LABENZ: Nice
DX there, yeah. JOSE UGIA: That text was
changed two weeks ago. And it's more descriptive now. Hopefully that's the case. CRAIG LABENZ: Nice. OK. And it crashed. [LAUGHS] JOSE UGIA: Wait for
it, wait for it. CRAIG LABENZ: All right,
let's find exception main. Failure delivering
result. Activity. More-- [LAUGHS] JOSE UGIA: I think this is
the result of your simulator. Pretty sure. I think you clicked the
button twice and too intense. CRAIG LABENZ: OK. JOSE UGIA: We're
probably coming back. CRAIG LABENZ: All right. JOSE UGIA: Give it another go. CRAIG LABENZ: In theory, it
would cease to accept taps after the first one. [HUMS] Looking at the live-- ah, yes. Julian or "Hulian" says, oof. And I feel you. But maybe 12th time's
the charm, as they say. That is what they say, right? OK. I'm going to flick
it but one time. JOSE UGIA: [INAUDIBLE] CRAIG LABENZ: I've clicked it. I saw a line appear here. JOSE UGIA: Yep. CRAIG LABENZ: And we switch
back and we have a sheet. And it thinks. And it gives us the screen. So we click Continue. But once. And it spins. JOSE UGIA: Very much so. CRAIG LABENZ: I'm
not going to lie, I think it's going to crash. JOSE UGIA: I don't think so. CRAIG LABENZ: Because-- JOSE UGIA: Take a bet. CRAIG LABENZ: All right! I bet you-- JOSE UGIA: [INAUDIBLE] CRAIG LABENZ: --this is
when it crashed before. After it stopped spinning,
it went back to this. [GASPS] I never decided what-- I never said what I
was going to bet you, but where did it print? JOSE UGIA: Whatever that was
that you were going to bet, it's coming my way. At least you got print. CRAIG LABENZ: I was going to
say a drink when I see you next, which will also be the first
time we ever see each other. So-- JOSE UGIA: Easy bet. CRAIG LABENZ: It didn't print. But it also didn't crash. JOSE UGIA: Yeah, let's-- we can try debugging
to make sure that print is doing the right thing. Print-- JOSE UGIA: Yeah, so-- JOSE UGIA: Apple Pay. No, it's fine. CRAIG LABENZ: Yeah. Same signature, so even though
the name isn't the same. Where is print? Here we go. All right. Here we are. Hot restart because anonymous
functions don't behave how you might want them to
in hot reload all the time, so we've got to
be cautious there. All right, I'm
going to clear this. Now I'm going to
click the button. JOSE UGIA: So the JSON
file should be fine. AlphaRadeon, thanks for the tip. If the JSON file is not right,
you will get an error back, and this screen that you're
seeing right now won't load. CRAIG LABENZ: Yeah, so I did-- JOSE UGIA: Our button is-- CRAIG LABENZ: --switch
us to the sample as well. JOSE UGIA: Yeah, so-- CRAIG LABENZ: But
good, very good idea. Because we started
with the Apple one, so that absolutely would've
been an easy thing to forget. OK, we're here again. Continue. Oh, you know what I didn't do
was put in a debug statement. I don't think putting a debug
here is going to matter. I mean, it's just obviously
not getting to this result because we've not even-- even if it was null,
if it was empty, we should see a blank line. JOSE UGIA: Mm-hmm. We had a print-- CRAIG LABENZ: So I think it's-- JOSE UGIA: --on it before. CRAIG LABENZ: Right, which
was doing the same thing. That was identical
functionality. And yeah, same-- nothing. Have you ever seen this, Jose? It doesn't print. JOSE UGIA: No. Well, the callback
is not being called. But wait, is the screen gone
already on the simulator? CRAIG LABENZ: Sorry,
no, it's still-- oh, the sheet is gone, yeah. JOSE UGIA: Yeah,
the sheet is gone. Huh, no. CRAIG LABENZ: All
right, I'll move this over so they
can share the screen. JOSE UGIA: Are we debugging? CRAIG LABENZ: Mm. JOSE UGIA: Oh yeah,
we're debugging, right? CRAIG LABENZ: Yeah. Yep, yep, yep. I always run start debugging. So one thing we still didn't
do was any setup for Google. So the integration requirements. JOSE UGIA: No,
it's not necessary. Oh, print. Ha, is print going to
do what we want to do? I'm using all the
time debugprint. CRAIG LABENZ: I
never use debugprint, but I know it's a thing. So what does
debugprint take for us? A string, so this, we'll
need to jsonEncode this map. And then we'll have
to import convert. So this will be dart/convert. This needs to be a colon. OK, now we have jsonEncode. All right, debugprint. I don't think it's going
to make a difference, but I'm willing to
test that theory and be proven wrong for the 50th
time on national television. All right, I can't tell-- JOSE UGIA: I'm more
with you this time. Not betting this time, though. Yeah, I think we'd be
much better off with the-- if we could maybe try
with a fast simulator. Every single time, it's
taking us a little bit. I don't know if
that's an option, but maybe that's
something we can do. CRAIG LABENZ: Yeah, let's-- I'll just start the download
on a good simulator. So also, as everyone can see,
I don't do this very much. Oh, Tools. This is where it was, right? Device Manager. So this is where we'd
add a new device. So how about a Google-- a Pixel
6, that should do it, huh? JOSE UGIA: Mm-hmm. CRAIG LABENZ: So I'll say Next. API 33, that looks good. Next. Now, I want one with
Google Play, Google-- what does it say here? JOSE UGIA: Ah, go to. CRAIG LABENZ: --APIs. JOSE UGIA: Yeah, no, but
that's-- it should say-- no, go back. Yeah, I know, I know what
the issue is with this. So Pixel 6 doesn't have it. You have to go to one
that has the Play Store. Do you see the little icon
with the Play in Pixel 4? CRAIG LABENZ: Oh, like
this one here, yeah, OK. JOSE UGIA: So that's
where you want to. CRAIG LABENZ: I have to go
all the way back to Pixel 4? JOSE UGIA: Mm-hmm. CRAIG LABENZ: Interesting. Why do the new
ones not have that? JOSE UGIA: And then you
see Google Play, right, on the target. On the right side,
you see Google Play. CRAIG LABENZ: Hmm. Yep, yep, yep. JOSE UGIA: Yeah, that's
a good [INAUDIBLE].. CRAIG LABENZ: So I'm going
to need to download-- do I need to download
these, it looks like? JOSE UGIA: Yeah, it looks
like you don't have it. Which may explain--
might be that the Pixel 3 was running on a non-Google
Play services image. No, otherwise the button
wouldn't show, I think. CRAIG LABENZ: Well-- [INTERPOSING VOICES] CRAIG LABENZ:
Something's not right. JOSE UGIA: Might be that. CRAIG LABENZ: I've killed that. We're going to do the new one. Luckily, it's downloading
pretty quickly. Use Pixel 4, Muhammad says. Good eye. You and Jose were vibing. We've got more, more
people figuring it out. And then we had,
use Pixel money. Let's go with the-- JOSE UGIA: [INAUDIBLE] CRAIG LABENZ:
--sticky Shift key. [LAUGHS] JOSE UGIA: Pixel
pay your device. CRAIG LABENZ: Yeah, I love it. Pixel pay, Pixel money. OK. It's doing-- checking
the existing file, sure. [HUMS] JOSE UGIA: All right,
so that's unzipping. Is that actually an M1 that
you're running on right now? CRAIG LABENZ: It is. I was just bragging about
how well it can multitask and here it is multitasking in
front of everyone's very eyes. JOSE UGIA: Oh, it's
going back to-- CRAIG LABENZ: And
doing an OK job of it. All right, so-- JOSE UGIA: All
right, so we can-- CRAIG LABENZ: I appear to
also need to download this. JOSE UGIA: No, you can
cancel that and use Tiramisu. [INAUDIBLE] CRAIG LABENZ: Oh, it
just wasn't clicked. That's right. OK, good, good, good. JOSE UGIA: Yeah,
that looks good. CRAIG LABENZ: All
right, here we go. We're going to add that
it has Google Play, just for my future reference
because I will forget. All right. Here we are. JOSE UGIA: For
our future videos. You may need to log
into that one as well. But let's see if it's faster. Should be faster. CRAIG LABENZ: It
seems very likely. Oh, I didn't want
to launch it here. This was a terrible mistake. JOSE UGIA: Oh. Mm-hmm. Or you can-- CRAIG LABENZ: Well, I
can still sign in here. JOSE UGIA: You can
sign in there, yeah. CRAIG LABENZ: All
right, full screen. Seems a lot faster. This image is also
literally a 10th-- no a 20th the size
of my Google 3 image. That was 10 gigabytes. This is 500 megabytes. JOSE UGIA: True. CRAIG LABENZ: I
have no idea how-- JOSE UGIA: Oh, I
believe that's the side. I think that's probably the
external disk, probably. CRAIG LABENZ: Oh, like-- JOSE UGIA: Let's see if the-- CRAIG LABENZ: --the
provision to disk. JOSE UGIA: Yeah,
that's what I believe. Is this any faster? CRAIG LABENZ: It
sure seems faster. JOSE UGIA: Well. Well. CRAIG LABENZ: It's not amazing. If I bought a new phone
and it behaved like this, I would be upset. But it's faster
than the other one. All right. Account. JOSE UGIA: Yeah, this brings me
back to 2014 simulator issues. CRAIG LABENZ: It
is also possible that it's all the calls in
the streaming and whatnot. JOSE UGIA: That's probable. CRAIG LABENZ: I'll test
it again off stream and see if it kind of wakes up. JOSE UGIA: Probably. CRAIG LABENZ: All right, good. Account has no results. JOSE UGIA: Yeah, it will
be called differently now in the new settings. This is a different image. Tiramisu. What about-- CRAIG LABENZ: I would
expect this to just be at the top and incredibly easy. JOSE UGIA: I think it's
Passwords and Accounts, yeah. Yeah, I wonder why it
didn't find Accounts if you typed Accounts. Yeah. CRAIG LABENZ: Got Accounts. JOSE UGIA: Accounts. CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: Now here's
another opportunity for us to see your password again. CRAIG LABENZ: All right. I'll try to avoid-- JOSE UGIA: Not like [INAUDIBLE] CRAIG LABENZ: [LAUGHS]
You can read all my spam email if you log in. You can see all-- my energy
company, PG&E, Pacific Gas and Electric, has been sending
me, like, three emails a day. And thankfully, they're not
like, you didn't pay your bill. I checked to make sure that
there was no problem with that. It's just like random nonsense. JOSE UGIA: I see. CRAIG LABENZ: All right. I'm typing values. This isn't very fast. I think if this doesn't work, we
should basically cut our losses and just talk
philosophically about things and pretend it printed. What do you think about that? JOSE UGIA: Yeah,
that sounds good. I think we went anyway the full
way through the integration, which is the objective. And it will work fine
on normal computers with normal simulators,
so don't worry. But I have a feeling
that what we were missing is a new device with
Google Play services. So I think that one is
going to give us a result. CRAIG LABENZ: I'm two-factor-- JOSE UGIA: I'm pretty sure. CRAIG LABENZ: --right now. JOSE UGIA: Android Studio
instead of VS Code. Well, Android Studio's,
FredWP, pretty much you can develop with whatever you're
comfortable with these days, which is very nice, both
the Flutter and Android. I personally find useful if
you're doing Android-specific things and you have to fiddle
with Gradle with a simulator, with some polls, I think an IDE
or Android Studio is useful. At the same time, I think
there's a good reason to use light, more lightweight
IDEs like VS Code or Sublime Text. I personally use it
for smaller projects, I use VS Code or Sublime Text. And if I have to do-- if I have
to handle a lot of dependencies and deal with Android stuff,
then I use Android Studio. But both work. CRAIG LABENZ: So
I just signed in and then it took me
back to the screen where I would begin signing in. It just didn't work
even though it did work. I think we should call it. I don't think me signing
in to another emulator and having it choke and think
for five seconds on every click is too useful. But yeah, folks saw how
to get started and-- oh man, we hoped to get a
lot further in this episode than we got. The malfunctioning,
basically non-existent-- Uh-oh. Jose, I think you need
to plug in your computer. But you probably
know that, because it looks like it just turned off. What an amazing bit of-- oh, he's back. Was it your camera or your
computer whose battery just struggled? You're muted as well. You might need to juggle
your audio inputs. JOSE UGIA: What about now? CRAIG LABENZ: Now we hear you. You look-- JOSE UGIA: So the camera-- CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: --that
was 100% charged thought that that was too much
as well, so switched off on me. CRAIG LABENZ: It reached
zero charge, huh? JOSE UGIA: Right. CRAIG LABENZ: Yeah, I have a-- there's a battery that
actually just plugs in. It's like a faux battery-- just kind of provides
the physical interface, but otherwise draws
power from the wall. And that is a nice thing. All right, well, let's just take
some questions here and wrap up a little bit. There's a lot of hard
questions we didn't get to and a lot, honestly, a
lot of Google Pay things we didn't really get
to, unfortunately. JOSE UGIA: A quick
comment, maybe, before-- CRAIG LABENZ: What's up? JOSE UGIA: If I may. A quick comment, if I may. And that is that
just for you to know that this is really the full
integration where we did. So with just the bits that
you see right now that Craig implemented, that
should be good enough to get you going
with integration. So as you can see, it's
only a few lines of code. That's for the
basic integration. We're thinking or considering
doing the Customized one. We didn't get time to
get to it this time. Maybe at another time. But just for you
to know that if you have a more specific
checkout process, you can use that custom path to
integrate payments in your app as well. CRAIG LABENZ: Oh. JOSE UGIA: So the question is-- CRAIG LABENZ: Julian
says, increase the memory. JOSE UGIA: I think
simulators typically come with a good
configuration already now. Like, it's been a while since-- I haven't looked at it. So you do that on
the Device Manager. So if you go-- if you
close this and go to the-- if you close this
on the right side, you can see on the
right of the simulator, you can see Device Manager. So there you can change
the hardware settings if you edit it. CRAIG LABENZ: Oh, this I think
really is what we would do. JOSE UGIA: Yeah. Let's see. See Advanced Settings. CRAIG LABENZ: --telling it-- ah, here we go, OK. So internal storage, 2 gigs. Yeah, where is its memory? Oh, RAM, here we go. A gig and a half? That feels like it
should be plenty, right? JOSE UGIA: Yeah,
should be good enough. CRAIG LABENZ: Good
idea, though, for sure. JOSE UGIA: Yep. CRAIG LABENZ: Yeah, this
feels all definitely fine. Very odd. All right. Well, good thought for sure. Click on Settings. JOSE UGIA: So-- CRAIG LABENZ: On the right. And you can stick it
out in Android Studio. OK, I did want to do this. Settings. JOSE UGIA: Oh, that
icon above the pointer. You have it like-- CRAIG LABENZ: Over here? JOSE UGIA: --that one, maybe. CRAIG LABENZ: View Mode. Ah, here we go. Undock or Float? I don't know which
one we'll want. Where did it go? Come back! Oh, it just disappeared. I can't find it. JOSE UGIA: Maybe it's
on Kristi's screen. CRAIG LABENZ: Android Studio. Oh, wait. All right, let's try again here. View Mode. Let's try Float. Nope. Float is back to what we had. View Mode. Oh, I clicked Float and then
it just put it to Dock Pinned. JOSE UGIA: What about Window? There you go. CRAIG LABENZ: Also not
what I expected, but OK. [LAUGHS] I think
Float was it and it just failed for some
reason and had a fallback. JOSE UGIA: It does
looks like it. CRAIG LABENZ: Yeah. JOSE UGIA: Varon, you can
use Google Pay for free. Yeah, the integration
is-- comes at no cost. You can just simply get the API,
sign up, and you're good to go. CRAIG LABENZ: Julian,
we're in trouble. If you're out of here,
we got no chance. [LAUGHS] Have a
good one, though. All right. Well, I don't personally
run an e-commerce app, but this is absolutely
where I would start if I did, especially
with the cross-platform opportunities. But yeah, I feel like
sometimes with Firebase, obviously we had
it a bit with Pay-- whenever you just kind of
leave that raw application code layer of your app and
you start to integrate with more advanced
third parties, especially if they
relate to the device, then you can just have
quite a bit of setup. And had I anticipated
that, I would have gone through it in advance. Unfortunately, I
wanted to enter this with a very fresh perspective
so I could ask questions on the stream. And then that led to asking
questions about how to set up an emulator on the screen. So very exciting. Jose, any last
thoughts on your end? JOSE UGIA: What I
would like to say is that keep in mind that this
is something that we wanted to build for the community
as an open source project, just have it-- think of
it as your home, really. We have a package
page in pub.dev and we have a repo
page in GitHub, so again, hopefully it
feels like home to you. And we accept-- it's really easy
to get set up, to contribute. We have a code of conduct and
good practices for the repo that you just can go
ahead, take a look, and jump in, if you want
to make any contributions. We want this repo to be
something that necessarily doesn't necessarily live
on Google Pay's end, although we'll keep
on contributing and support into it. So yeah, just wanted
to call that out. Any thoughts-- CRAIG LABENZ: Do you have
a contributing guide? JOSE UGIA: --or
ideas are welcome. Go ahead. Yeah. CRAIG LABENZ: Yeah, you do. I'm not seeing it. Am I missing it? JOSE UGIA: If you go
to Flutter plugin, so if you go one
level up, you're now in Flutter plugin Pay. CRAIG LABENZ: Oh,
right, right, right. Google Pay was the org. I was thinking Flutter
plugin was the org. That makes no sense. Yeah, yeah. OK, here we go. Great, great,
great, great, great. Nice. JOSE UGIA: Yeah. CRAIG LABENZ: Nice. JOSE UGIA: So yeah. Yeah, feel free to come
leave your thoughts and code. We'll be happy to
help with that-- CRAIG LABENZ: [INAUDIBLE] JOSE UGIA: --and
hopefully it's useful. CRAIG LABENZ: Nice, very nice. All right, Jose, thank
you so much for joining. Men, when you do stuff
live, sometimes you bump into unexpected things,
like you have a new machine and haven't set things up. And I'm sorry that I
subjected you to that, but you're a real trooper. And I think we
covered the basics. We had hoped to cover some
stuff beyond the basics, but we didn't get there. But I really
appreciate you joining. It's getting into the evening
for you in Spain, right? What time is it right now? JOSE UGIA: It's about 7:30
PM, which is a perfect time to livestream with you. CRAIG LABENZ: [LAUGHS] Too kind. Well, it's also
maybe a perfect time to have some dinner, so I'm
going to release you to that. And folks, this will be our
final "Observable Flutter" for the year. Next week on December 29, I'm
going to be in space cadet mode and not thinking
about the real world. And then we'll be
back in January. So I look forward to
seeing everyone again. I don't know what
the first topic yet is going to be in January,
but I'll figure it out, and we'll tease it a bit or
just announce it outright-- JOSE UGIA: (WHISPERING)
Google Pay. CRAIG LABENZ:
--before the episode. Jose's volunteering to return. He wants more of this. Although-- JOSE UGIA: [INAUDIBLE] CRAIG LABENZ: --if you drive,
it'll probably go 1,000 times better. So maybe-- all right, folks,
until then, happy holidays, happy New Year. We'll see you all in 2023
with your freshly discarded resolutions. JOSE UGIA: Happy days. Thanks for joining. Bye.