 I will be leaving some of the sessions today, well, this week. And now we are going to start with a session about debugging. So I'm going to present my screen. Okay, hope you all can see my screen. Yes. Thank you. If you want you can start the recording. So, okay, we're going to talk about debugging because these sessions are going to be a bit more complicated than the first workshop. So knowing about how to debug the application when it's not working well. It's going to help us a lot to be successful in the exercises. So here I'm going to see two tools to see to the back. The first of all is the Android, the Android studio itself. And the other one is Flipper. So let's go. First of all, the Android Studio Debugger will have a logcat where you can see all the login that the Android skeleton app is logging. And also we're going to find this button at the top of the Android Studio. And pressing that button will let you debug the application. So if you click the debugger, you're going to be able to add also some conditional breakpoints or some breakpoints with a dialogue like this one. And then you're going to put this breakpoint here. And when the debugging come to this line, it's going to start. It's going to stop, sorry. And then you're going to have a view like this one with a lot of buttons. I'm going to explain you in a bit. The first step is to resume your program. So if it's stopped in one line, you can resume by clicking here. And you can stop the application with that button. So if you want to show where the execution point is, you can click here and you will see the line where the where you attach the breakpoint. This one is to step over. So you're going to go to the next line. In this one, you're going to go inside this method. So you're going to, in this sample, you're going to go inside the method track entity instance squaring. With this one, you're going to step out to the partner method. And with this one, you can run to the cursor. So if you put a cursor in one line and you click that one. The application is going to run till it finds the cursor. And here you're going to see all the variables at the very same moment that you stop the application. Also, you have an expression evaluator here, which is very useful. If you click in the evaluator expression, you can write here some fragments of code and evaluating without losing the workflow in your application. So you can debug and try it with different filters or different expressions here and clicking the evaluate button. If you want to know more about how to do the back with under studio, you can check this link here. And you can go there. Now, I'm going to talk a bit about the other tool I talked about before. It's Flipper. Flipper is a utility created by Facebook that provides debugging capabilities for Android applications without desktop interface, which is pretty simple. From the SDK, we want you to use Flipper instead under studio for checking the database and the network interface because it's going to be quicker. And if your laptop is not that have not that capabilities, it's going to be easy to use for you. So I recommend you to use Flipper instead the under studio, but I'm going to explain you both. So first of all, for Flipper, you have the download links here. In case you didn't download it now, you didn't download it yet. And just a reminder, you have these requirements. You have to have install OpenSSL Watchman and the Android SDK. The Android SDK will be installed if you have installed the Android Studio toolkit. So here you have a link to get in start with Flipper. And here are some installation steps to install Flipper in your app. We don't have to do these steps now because the Android Skeleton app have already installed Flipper. But you can check these installation steps in case you want to install Flipper in your application. Also, you have here the documentation of how to do it correctly. So how to check that Flipper is working. You're going to have to do that. You have to go to the desktop application and check that Flipper trains the HTTP Skeleton app. And also that you have enabled the database layout and network plugins because these are the three plugins we are going to use. The network plugin is going to look something like that. So here you select the network plugin and you're going to see all the requests and all the traffic that your application is having. And if you go to the database plugin, you're going to be able to select some of the tables and check all the data that are on the database. Also, you can see the logs here and all the logs that your application is logging by the log plugin. What about if you want to do all of this in Android Studio? So we suggest you to use Flipper but in case that you have haven't installed or you cannot install for any reason, you can do the same with Android Studio. Here at the very bottom, you will have the database inspector button. So if you click it, you're going to see as a view similar that the one on Flipper with all the database tables and all the information that the tables contain. Also, you have this profiler plugin that you can use if you want to expect your network. So once you click on the plugin, you're going to see something like that. And then you have to click on network. You can see here CPU, memory, network and energy. We want to check the network. So we're going to click on the network section. And then we can use the plus and less zoom buttons that are here on the top. And then we are going to select the window that we want to check that because and see all the calls. Again, the profiler network has a bit of it consumes like a lot of memory of your computer for that reason, I would suggest you to stop the logcat with a stop button that's here in case you are not using it. And I'm going to show you a quick demo of everything that I just explained. So here you can see that we have the skeleton app up and running. And this is Android Studio. So I just started the the debugger. So I don't have to do it again. And this one is flipper. So first of all, here in the setup doctor, you can see that I have installed the open SSL watchman and SDK you can check it here, clicking by clicking the doctor. I didn't have the highest thing because I'm running Android in Windows. Here, I have this skeleton app connected. And here I can see the databases. I can check, I can switch between the plugins. If I go to the databases, I can click the data tab and then select a table. For example, you can see here, the lay in sets here, the filters, etc. Also, you can see the structure of each table. So here you say that you have the ID, the code name display name, etc. And also you can perform some queries here. If you want, you can select and perform queries here and you're going to see here the result. Also, if you click in one of the rows, for example, if I go to the program one here. This is the program table. You can click in one row and you can go here in the left menu and you can edit the data. So if you want to make some editing, you can click edit here and maybe change the display name here. For example, I can just put my name, Marcos here and save. So after that, if I come here and I go to my programs, I can see that here the name of the program is Marcos now because I changed it. Also, we have the network. I'm going to make it a bit smaller. So here in the network, if I sing, for example, the data, I will see here some of the, I don't know what's not working now. Maybe because there is no new information. Yeah, I think so. Because we are using the last updated query. So the second is have to start the application again. Sorry, sorry for that. Well, here I can, I'm going to clear the data, wipe all the data and try to sing the metadata. Sorry, it's not working now. But it should work if I don't know what's happening right now. It worked all the time. So sorry for that. I'm going to close the application now. I'm going to see so you hope you can do the same in the studio. You can click here in the database specter. If you launch the application, you can come here and select a process here. And then select the Android skeleton app. So once you do that, you're going to, you're going to see here all the tables. And by clicking here, for example, in the same table as before. So the program table, you're going to see that here in the display name is standing Marcos. And you can also edit it here directly. Marcos for example. And so if I come here again, you can see that the display name is updated and you can see the name. So for the profiler, it's the same in the network, you can come here, come to the network, select around. So I select everything. And then I'm going to sing the metadata. I think it's the same problem as before. I don't know what I can see this login here. I'm sorry about that, but it will just work when you when you do it. And if not, I will help you to fix it. I think that's everything. And now we're going to show you some of his exercises. So if you want, you can stop the recording, Alice. Okay, so welcome to the, let's continue with the session about data download. Advanced because it's more advanced that what we saw in the workshop one. So this, yeah, this session is about data download. And so if we take a look at the work and the workflow and we have the initialization of the two login metadata download and then data download. So this is about that part. In the workshop one, we saw, we did some exercises about, about how to download data from the server. And this is what we saw. We saw that in the target entity module, we have the target entity download them. And that there was a method called download to trigger the download. And also that we could include some parameters, like for example, the limit. And which means that we want to download targeted instances. 10. I mean, we want to load only 10. It's time. And the same applies for events. In the event module, even the loader, we can include a limit. And for aggregated, we have the aggregated module that so far has no parameters to that can be included. So this is the, the pretty basic. So now we are going to see more parameters because they don't loader accept a limit to specify the limit, but also more, more things like for example, we can download targeted to be instances by you ID. For example, in case you don't, you don't want to download so many the eyes in your device and you prefer to search online and then download when, when needed. And you can load by you ID. By program you ID, in case you only want to download the eyes for an specific program. And by promise status. If you only care about active. You don't care about completed. Okay, so you can download only the active one. And the limit that we saw two more parameters that are related to the limit that are limit my program and limit by or unit. And they mean that limit by program. By program is set to true. It means that the limit that we have specified in the limit parameter. The limit applies by program. So it means that if we set a limit of 100. And we said limit by program through that limit is per program. So we will have 100 per program. It falls is global 100 in global and the same logic for the transition unit. And then we have parameter called override that it means that anything that is coming from the server, and no matter the status of the data that you have in the device that we are going to talk about that later. The data that is coming from the server or write the data 16 in your device. By default is false. But it can be useful in her case. For events we have quite similar parameters by UID by program. The limit. The property limit and limit by program by or unit. And also, in order to minimize the amount of data that we download from the server. And the SDK uses the last updated property. And this is completely transparent for the application. You don't have to care about that. It's very important that you know that this property is in use. More or less how it works. So, what the SDK does is it keeps track of the latest and the last successful synchronization. For example, if the last successful thing was yesterday at 10pm. And we triggered a synchronization right now. The SDK is going to include the last updated property set to yesterday at 10pm. It means that we only want to download the data from the server that has been modified after yesterday at 10pm. It's quite important because it reduces a lot the data that is uploaded. We have seen that in the query we can specify the program ID. Also the organization unit is relevant. So there are some cases where the last updated property should be used. And some cases where it shouldn't be used. So all that logic is handled by the SDK. You don't have to care about that. But it's important to know that is there. So now we are going to do an exercise about that. So, yeah, at least you can stop the recording if you want. Okay, thank you. So this session is about the Android Settings app. And this is a web app. It's not an Android app. And because, yeah, we saw that in the SDK you can modify some parameters to decide to download only 10 TI's, 100 TI's. Also by program. And also a few more things. These parameters are specified when you develop the application and you compile the application. So once you have compiled the APK and is in the field and the users are running the application, you cannot modify those parameters anymore. So the Android Settings app gives you a chance to be able to modify those parameters in runtime, let's say. So this is related to the test synchronization as well. And this application, what it does is this application is a web app installed in the server. There you can specify some parameters to configure the data synchronization. And then the SDK is going to read these parameters in first place and then use these parameters to parameterize data synchronization. So it means, for example, that you can have a single application that behaves in a different way depending on the server that connects to. So this is, for example, the case of the official Android application. The official Android application is just one application. It's the same application. But depending on the server, you can specify different parameters and the app will behave in a different way. So this application gives some additional and remote control over the Android application. And these settings are where there are some settings that are automatically consumed by the SDK, for example, the synchronization parameters. And other, for example, like how often the applications will synchronize. Those parameters should be consumed by the application itself. So we have here the links to the Settings app documentation, to the web app, and also to how to use these settings in the SDK. But just to have a quick overview about these settings, we have two types of settings so far. The general settings, that here you can specify things like, for example, if you want to encrypt the local database of the device. And so if through the local database of the device, of all the devices that connect to the server, it's going to be encrypted. The number of service values to the load, we will talk about this on Thursday, I think. And also the SMS settings, because the SDK can synchronize data or can upload data using SMS. So here you can specify the configuration of the gateway, also the sender, and a few more things, I think. Yeah, to configure the SMS in the server. And also coming in the next version, we have the Matomo configuration that is a platform to follow up the status of the application. And just to know how many users are using the application to have some statistics about the use of the application in your server. Also we have the synchronization settings section. Here we can specify a few more things for the synchronization of the data. For example, for programs, we can specify limits in global. Also we can specify limits per program, a different limit for each program. We do something that we cannot do using only the SDK. Also TI is enrolled in a certain period, or that has been updated before a certain date. And also if it gives us some additional control over the aggregated data that we want to download. The SDK downloads by default a certain number of periods for each data set. Here we can specify and configure the periods for each data set. For example, for this data set, I only want to download the last five periods, but for this one, I want the 10 last periods, I don't know. And this is what I said that the great thing of these settings is that you can specify both the global settings and also the specific settings per program or per data set. This is something that the SDK does not allow it yet. Okay, so let's start with the exercise and the demo as well. Alice, can you stop there, Gordon?