From 53af9f2ecbf83c8f1cf3d570c4e064ba257a18b4 Mon Sep 17 00:00:00 2001 From: jrosendo Date: Mon, 12 Dec 2022 17:24:15 +0000 Subject: [PATCH] docs(mobile-dev): add mobile branch subjects to public --- subjects/mobile-dev/01-maps/README.md | 38 ++ subjects/mobile-dev/01-maps/audit/README.md | 35 ++ subjects/mobile-dev/bizz-card/README.md | 81 +++ subjects/mobile-dev/bizz-card/audit/README.md | 17 + subjects/mobile-dev/bloc-counter/README.md | 94 ++++ .../mobile-dev/bloc-counter/audit/README.md | 13 + subjects/mobile-dev/bouncer/README.md | 27 + subjects/mobile-dev/bouncer/audit/README.md | 19 + subjects/mobile-dev/circle/README.md | 63 +++ subjects/mobile-dev/data-structures/README.md | 56 +++ subjects/mobile-dev/favorite-images/README.md | 34 ++ .../favorite-images/audit/README.md | 17 + subjects/mobile-dev/hacker-news/README.md | 36 ++ .../mobile-dev/hacker-news/audit/README.md | 17 + subjects/mobile-dev/intro/README.md | 27 + subjects/mobile-dev/max-num/README.md | 28 ++ subjects/mobile-dev/movie-list/README.md | 64 +++ .../mobile-dev/movie-list/audit/README.md | 23 + subjects/mobile-dev/movie-list/movies.json | 471 ++++++++++++++++++ .../mobile-dev/named-optional-sum/README.md | 37 ++ .../mobile-dev/named-required-sum/README.md | 8 + subjects/mobile-dev/optional-sum/README.md | 32 ++ subjects/mobile-dev/package/README.md | 85 ++++ subjects/mobile-dev/package/audit/README.md | 25 + subjects/mobile-dev/person/README.md | 101 ++++ subjects/mobile-dev/plain-sum/README.md | 22 + subjects/mobile-dev/quizz-app/README.md | 85 ++++ subjects/mobile-dev/quizz-app/audit/README.md | 31 ++ subjects/mobile-dev/secure-notes/README.md | 72 +++ .../mobile-dev/secure-notes/audit/README.md | 23 + subjects/mobile-dev/sky-map/README.md | 41 ++ subjects/mobile-dev/sky-map/audit/README.md | 25 + subjects/mobile-dev/stock-market/README.md | 41 ++ .../mobile-dev/stock-market/audit/README.md | 29 ++ subjects/mobile-dev/student/README.md | 49 ++ subjects/mobile-dev/university/README.md | 43 ++ subjects/mobile-dev/variables/README.md | 23 + 37 files changed, 1932 insertions(+) create mode 100644 subjects/mobile-dev/01-maps/README.md create mode 100644 subjects/mobile-dev/01-maps/audit/README.md create mode 100644 subjects/mobile-dev/bizz-card/README.md create mode 100644 subjects/mobile-dev/bizz-card/audit/README.md create mode 100644 subjects/mobile-dev/bloc-counter/README.md create mode 100644 subjects/mobile-dev/bloc-counter/audit/README.md create mode 100644 subjects/mobile-dev/bouncer/README.md create mode 100644 subjects/mobile-dev/bouncer/audit/README.md create mode 100644 subjects/mobile-dev/circle/README.md create mode 100644 subjects/mobile-dev/data-structures/README.md create mode 100644 subjects/mobile-dev/favorite-images/README.md create mode 100644 subjects/mobile-dev/favorite-images/audit/README.md create mode 100644 subjects/mobile-dev/hacker-news/README.md create mode 100644 subjects/mobile-dev/hacker-news/audit/README.md create mode 100644 subjects/mobile-dev/intro/README.md create mode 100644 subjects/mobile-dev/max-num/README.md create mode 100644 subjects/mobile-dev/movie-list/README.md create mode 100644 subjects/mobile-dev/movie-list/audit/README.md create mode 100644 subjects/mobile-dev/movie-list/movies.json create mode 100644 subjects/mobile-dev/named-optional-sum/README.md create mode 100644 subjects/mobile-dev/named-required-sum/README.md create mode 100644 subjects/mobile-dev/optional-sum/README.md create mode 100644 subjects/mobile-dev/package/README.md create mode 100644 subjects/mobile-dev/package/audit/README.md create mode 100644 subjects/mobile-dev/person/README.md create mode 100644 subjects/mobile-dev/plain-sum/README.md create mode 100644 subjects/mobile-dev/quizz-app/README.md create mode 100644 subjects/mobile-dev/quizz-app/audit/README.md create mode 100644 subjects/mobile-dev/secure-notes/README.md create mode 100644 subjects/mobile-dev/secure-notes/audit/README.md create mode 100644 subjects/mobile-dev/sky-map/README.md create mode 100644 subjects/mobile-dev/sky-map/audit/README.md create mode 100644 subjects/mobile-dev/stock-market/README.md create mode 100644 subjects/mobile-dev/stock-market/audit/README.md create mode 100644 subjects/mobile-dev/student/README.md create mode 100644 subjects/mobile-dev/university/README.md create mode 100644 subjects/mobile-dev/variables/README.md diff --git a/subjects/mobile-dev/01-maps/README.md b/subjects/mobile-dev/01-maps/README.md new file mode 100644 index 000000000..f3fa5ccc0 --- /dev/null +++ b/subjects/mobile-dev/01-maps/README.md @@ -0,0 +1,38 @@ +# 01 Maps + +### Introduction + +Create an app where you can save the list of your favorite places and show them in the app. + +In this raid, your team should implement an app which uses google maps. + +### Objective + +Implement following functionality: + +- Tabbar app with 3 screens: + - Google maps screen [example](https://codelabs.developers.google.com/codelabs/google-maps-in-flutter#0) + - List of your favorite places. + - Info about your app. Names of the authors, their email adresses, and general description of what your application does. + +On map there must be: + +- Your favorite places as markers (with infoView) (places must be saved after reopenig the app) +- When some place is tapped, open dialog window with title and description textfields +- A button, which will navigate to current position of device +- Search bar to search for addresses, places, use google places API. When suggested address is tapped on, navigate map to that place + +On FavouritesList Screen: + +- List of favorite places, which you can delete + +On InfoPage Screen: + +- Your names as developers, year, etc + +- Note: don't forget about info.plist: + +``` +NSLocationWhenInUseUsageDescription +NSLocationAlwaysUsageDescription +``` diff --git a/subjects/mobile-dev/01-maps/audit/README.md b/subjects/mobile-dev/01-maps/audit/README.md new file mode 100644 index 000000000..ec78cae06 --- /dev/null +++ b/subjects/mobile-dev/01-maps/audit/README.md @@ -0,0 +1,35 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Does the application run without crashes? + +###### Does the application have Bottom tabbar? + +###### Does the application show google maps? + +###### Does the application show list of favorite places? + +###### Does the application show list of favorite places after reopening application? + +###### Does the application contain an information page? + +###### Does map show markers with favorite places? + +###### When map is tapped, does dialog window show 2 textfields: name and description? + +###### Does the application have current location button. If so, does it lead you to your current place? + +###### Does the application have searchbar? + +###### Tap the searchbar. Does the application show list of suggestions? + +###### Tap an item in suggestion list. Does the map navigate to place? + +###### Can you delete a place from favorites places list? + +###### Delete place from list. Does the application remove it from map? + +###### Does the application work both on android and ios? + +###### Tap on marker. Do you see relevant information about the place? diff --git a/subjects/mobile-dev/bizz-card/README.md b/subjects/mobile-dev/bizz-card/README.md new file mode 100644 index 000000000..96173b975 --- /dev/null +++ b/subjects/mobile-dev/bizz-card/README.md @@ -0,0 +1,81 @@ +# Bizz Card + +### Introduction + +### What is Flutter? + +Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase. (c) [https://flutter.dev/](https://flutter.dev/) + +### How to start? + +You can build Flutter apps using any text editor. It is recommended to use editors that have both Dart and Flutter plugins (Android Studio, IntelliJ, VS Code). + +You should already have all installed on school computers, but if you want to set up your PC, then follow the official [installation guide](https://flutter.dev/docs/get-started/install). + +Before we start take a look at Flutter's [official documentation](https://flutter.dev/docs) + +Hint: You can see some Flutter samples [here](https://flutter.github.io/samples/#?type=cookbook) 👩🏽‍🍳 + +### Objective + +### Making your first app + +BizzCard is a simple application which shows a static card with your personal information. + +This subject is divided into 3 parts. Overall objective is for you to learn: + +- About and apply the essence of Flutter - widgets. +- Basic structure of a Flutter app. +- How to run Flutter app on physical device or Android/iOS emulator. + +- Note: only standard Flutter packages and url_launcher (for bonus) are allowed + +### First Part + +In this part: + +- Run Flutter generated counter app +- Understand structure of the Flutter app + +To create your first Flutter application open Android Studio or similar IDE and follow the steps: + +1. Open the IDE and select **Start a new Flutter project**. +2. Select **Flutter Application** as the project type. Then click **Next**. +3. Specify path to **Flutter SDK’s location** + (select **Install SDK…** if the text field is blank). +4. Enter the project name (for example, `myapp`). Then click **Next**. +5. Click **Finish**. +6. Wait for Android Studio to install the SDK and create the project. + +See the Run the app section [here](https://flutter.dev/docs/get-started/test-drive?tab=androidstudio#create-app) to run a sample app. + +The starter point in Flutter app is in lib/main.dart. Change this file to change app's behavior. + +### Second Part: + +In this part: + +- Build your first app + +You should display static information about yourself, i.e. name, surname, age, phone number, email, and image. +Try to make it as it is shown in the example below: + + +
+ + +
+ +Possible [diagram](https://flutter.dev/docs/development/ui/layout) of widget tree for the app. + +#### Helpful keywords for research: + +- AppBar +- Column to align text in a card +- Stack to place image on Container +- Padding to add paddings to Container +- Use DecorationImage inside BoxDecoration to style image + +### **Bonus** + +- Add qr code below the image, so anyone can scan it and get your full contact diff --git a/subjects/mobile-dev/bizz-card/audit/README.md b/subjects/mobile-dev/bizz-card/audit/README.md new file mode 100644 index 000000000..cc5895d59 --- /dev/null +++ b/subjects/mobile-dev/bizz-card/audit/README.md @@ -0,0 +1,17 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Was the app committed within the required time period? + +###### Does the app run without crashes? + +###### Only standard Flutter packages and url_launcher (for bonus) are allowed, is that the case in the app? + +###### Does the app display image, full name, age, email address, phone number? + +#### Bonus: + +###### +Does the app use local assets to store an image? + +###### +Does the app generate qr-code that displays information shown as text? diff --git a/subjects/mobile-dev/bloc-counter/README.md b/subjects/mobile-dev/bloc-counter/README.md new file mode 100644 index 000000000..3866a41b8 --- /dev/null +++ b/subjects/mobile-dev/bloc-counter/README.md @@ -0,0 +1,94 @@ +# Bloc Counter + +### Introduction + +Usually, when projects get bigger and more complex, managing all the widges, their states, and updating their children's states will become troublesome. To avoid possible complexity, we recommend using **Patterns**. +Patterns are built in a way that lets developers control the hierarchy of widgets much easier, and a popular one in the Flutter is - BLoC. + +Implement simple counter app using Bloc Pattern. +When you start writing your own application, you will need to structure your app first. + + + +### Objective + +- Observe state changes with `BlocObserver`. +- `BlocProvider`, Flutter widget which provides a bloc to its children. +- `BlocBuilder`, Flutter widget that handles building the widget in response to new states. + +In this subject you will implement Bloc pattern, which is created by Google. +BLoC pattern uses Reactive Programming to handle the flow of data within an app. + +Bloc consist of 2 concepts : + +- `Streams` +- `Sinks` + , which are provided by `StreamController`. + +
+
+💡 See this article  Architect your Flutter project using BLoC pattern, by Sagar Suri.
+ 
+
+ + + +
+
+💡 Documentation https://bloclibrary.dev/#/gettingstarted.
+ 
+
+ +### Part 1 + +- Create new flutter app, so it will generate sample Counter App +- Add flutter_bloc as a dependecy of your app +- App structure should be similar to: + +```bash + —lib + —bloc + —counter_bloc.dart + —counter_event.dart + -widgets + —yourwidgets.dart + —.. + —main.dart +``` + +### Part 2 + +- add enum to bloc/couter_event.dart + +```jsx +enum CounterEvent { + increment +} +``` + +- go to bloc/counter_bloc.dart and create `CounterBloc` class which extends from `CounterBloc` + +> 💡 note: you can generate bloc files using vscode extension + +- implement override of `mapEventToState` function in `CounterBloc` class, so it will be switching between different events, and return value as an int. In our case we only have case with increment state + +### Part 3 (UI and getting data) + +- Inside MyApp class wrap your home page with BlocProvider class. + +```jsx +return MaterialApp( + home: BlocProvider( + create: (context) => CounterBloc(), + child: Home(), + ), +); +``` + +- Inside Home class create instance of CounterBloc class +- Use BlocBuilder to state from CounterBloc +- Add "+" button to call CounterEvent.increment + +### Bonus + +- add button and event to handle decrementing counter diff --git a/subjects/mobile-dev/bloc-counter/audit/README.md b/subjects/mobile-dev/bloc-counter/audit/README.md new file mode 100644 index 000000000..f5e2fa912 --- /dev/null +++ b/subjects/mobile-dev/bloc-counter/audit/README.md @@ -0,0 +1,13 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Does the app run without any crashes? + +###### Can you increment counter? + +###### Can you decrement counter? + +###### Is the BLoC pattern implemented properly? Do you see blockobserver, blockprovider, blockbuilder explicitly? + +###### Are incrementing and decrememting implemented using BLoC pattern? diff --git a/subjects/mobile-dev/bouncer/README.md b/subjects/mobile-dev/bouncer/README.md new file mode 100644 index 000000000..0f385c25d --- /dev/null +++ b/subjects/mobile-dev/bouncer/README.md @@ -0,0 +1,27 @@ +# Bouncer + +### Introduction + +Some apps require using phone's hardware. In this app you are presented such an opportunity. + +Develop an app that uses [accelerometer](https://www.credencys.com/blog/accelerometer/#:~:text=What%20does%20an%20accelerometer%20in,the%20orientation%20of%20your%20app.). The app should be a smaller version of the 90s game of bouncing ball, where ball would be moving around, and player’s objective is to prevent it from touching the bottom part of the screen. + +### Rules of the game + +- Ball moves in a linear manner +- Ball changes its direction when it hits wall or tiles. The direction change happens by the [rule](https://www.toppr.com/ask/en-af/question/1865186/): the degree it came with should be degree it goes out, similar to real life experience. +- All tiles except player's tile disappear when they are hit with a ball +- Game ends when ball touches bottom part of the phone or all the tiles are disappeared. +- Player's tile moves according to phone's tiltiness. If phone is tilted more towards right side, so does the tile, the same with left side. + +### Objective + +- Working with phone hardware. + +### Example + +
+ + + +
diff --git a/subjects/mobile-dev/bouncer/audit/README.md b/subjects/mobile-dev/bouncer/audit/README.md new file mode 100644 index 000000000..fe28cac05 --- /dev/null +++ b/subjects/mobile-dev/bouncer/audit/README.md @@ -0,0 +1,19 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Was the app committed within the required time period? + +###### Does the app run without crashes? + +###### Does the ball collide properly, i.e. each time it touches walls or tiles, its angle changes according to the rule: it leaves with the same angle it came? + +###### Does player's tile move in the same direction as phone is tilted? + +###### Do tiles disappear when ball bounces off them? + +###### When player's tile reaches the end of the display, it should not be going out of display's dimensions, is that the case? + +###### Does the game end when all tiles disappear? + +###### Does the game end when ball hits bottom part of display? diff --git a/subjects/mobile-dev/circle/README.md b/subjects/mobile-dev/circle/README.md new file mode 100644 index 000000000..e6671ad9b --- /dev/null +++ b/subjects/mobile-dev/circle/README.md @@ -0,0 +1,63 @@ +# Circle + +### Instructions + +Create a class named `Circle`. + +Its attributes: + +- x - `double` +- y - `double` +- radius - `double` +- getters: + + - area + - perimeter + - rightMostCoordinate (x axis) + - leftMostCoordinate (x axis) + - highestCoordinate (y axis) + - lowestCoordinate (y axis) + +- Constructor: + - x - `required` + - y - `required` + - radius - `required` + +### Getters and setters + +To work with objects, either getting some information or changing it, we should use methods as it might not be a good idea to directly change objects fields. + +An example of this principle is hunger - you should not change person's hunger level directly, but feed them instead. Since it is common to set or get these values, we use getters and setters in OOP. + +In Dart, when you specify getters and setters, you must treat them as **fields**. + +Syntax of the getters and setters: + +```dart +class Rectangle { + double l, t, w, h; + + Rectangle(this.l, this.t, this.w, this.h); + + double get right => this.l + this.w; + + set left(double value) { + if (value >= 0) { + this.l = value; + } else { + throw new FormatException(); + } + } + + double get bottom => this.t - this.h; + +} + +void main() { + var rect = Rectangle(3, 4, 20, 15); + rect.left = 12; + print(rect.l); +} +``` + +- Note: Do not use math library, pi = 3.14 diff --git a/subjects/mobile-dev/data-structures/README.md b/subjects/mobile-dev/data-structures/README.md new file mode 100644 index 000000000..18c82a877 --- /dev/null +++ b/subjects/mobile-dev/data-structures/README.md @@ -0,0 +1,56 @@ +# Data Structures + +### Instructions + +In this exercise you will work with the following data structures: List, Set, and Map. + +Declare and initialize following variables: + +- `listNum` of type `List` containing a list of integers (list length >= 5); +- `listObj` of type `List` containing a list of items of different types (list length >= 4); +- `listStr` of type `List` containing a list of strings (list length >= 3); +- `listList` of type `List>` containing a list of lists containing `listNum`, `listObj`, `listStr`; +- `setStr` of type `Set` containing at least 3 items; +- `mapStr` of type `Map` containing at least 3 pairs; + +### Usage + +### List + +List is an array of elements. In dart lists are initialized as following: + +```dart +var listNum1 = [1, 2, 3]; +// or ... +List listNum2 = [1, 2, 3]; +``` + +### Set + +Set is an unordered collection of unique items. Sets are created as follows: + +```dart +var set1 = {'Germany', 'Kazakhstan', 'France', 'England'}; +// or ... +Set set2 = {'Germany', 'Kazakhstan', 'France', 'England'}; +``` + +### Map + +Map is a key-value data structure. Maps are created as: + +```dart +var mapRadius = { + 'Earth': 6378.1, + 'Jupiter': 71492, + 'Moon': 1738.1, +}; +// or ... +Map mapRadius = { + 'Earth': 6378.1, + 'Jupiter': 71492, + 'Moon': 1738.1, +}; +``` + +- Note: main is not needed! diff --git a/subjects/mobile-dev/favorite-images/README.md b/subjects/mobile-dev/favorite-images/README.md new file mode 100644 index 000000000..49dfc31c1 --- /dev/null +++ b/subjects/mobile-dev/favorite-images/README.md @@ -0,0 +1,34 @@ +# Favorite Images + +### Introduction + +Nowadays, it is very difficult to imagine a popular app that does not work with storing, accessing images. +In this app you will get a chance to practise it. +You should create your gallery, where you can load images from phone library or take a picture and immediately upload it. + +Allowed package: [image_picker](https://pub.dev/packages/image_picker). + +### First Part + +- Create an appbar with **IconButton**. +- When you click on a button you should see 2 options: open camera or a gallery. +- See the usage of [image_picker](https://pub.dev/packages/image_picker) package. +- Don't forget to add special keys to Info.plist file under ios folder to access the camera and gallery, see [example](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/AboutInformationPropertyListFiles.html). +- Show "No images selected" message if no images are loaded. + +
+ + +
+ +### Second Part + +- When user is done picking image or taking picture it should be added to GridList +- When an image is tapped, user should see the whole image +- Add an ability to zoom in, zoom out the image, see [example](https://api.flutter.dev/flutter/widgets/InteractiveViewer-class.html). + +
+ + + +
diff --git a/subjects/mobile-dev/favorite-images/audit/README.md b/subjects/mobile-dev/favorite-images/audit/README.md new file mode 100644 index 000000000..9ab39f485 --- /dev/null +++ b/subjects/mobile-dev/favorite-images/audit/README.md @@ -0,0 +1,17 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Does the app show "No images selected" message when no images are loaded + +###### Does the app have a select image button in the appbar + +###### Tap on the select image button. Do you have an option to choose an image from gallery and take a picture? + +###### Does the camera work both in iOS and Android? + +###### Does the app load chosen image? + +###### Tap on the image. Does it become full-size? + +###### Can you zoom in, zoom out the image? diff --git a/subjects/mobile-dev/hacker-news/README.md b/subjects/mobile-dev/hacker-news/README.md new file mode 100644 index 000000000..4b8c1c65b --- /dev/null +++ b/subjects/mobile-dev/hacker-news/README.md @@ -0,0 +1,36 @@ +# Hacker news + +### Introduction + +Create your own hackernews [app](https://news.ycombinator.com/)! + +Hacker News is a social news website, which mainly focusses on Computer Science and Entrepreneurship. You will make a client consisting of all the main features of the website. + +### Objective + +Your objective for this raid is to create UI for [HackerNewsAPI](https://github.com/HackerNews/API). + +Your app should have following functionality: + +- Show list of all fetched posts on main screen: + - Login button + - Each Post has an Upvote option to vote the post + - Each Post displays Total Votes and Total Comments on them + - Displays the Username of the Creator + - Displays the Submission Time + - Open link in a [Webview](https://codelabs.developers.google.com/codelabs/flutter-webview#0) when post is tapped. + +On the website, we can Post, Comment, or reply **only when we have an account**. + +- You have to register using the [website](https://news.ycombinator.com/). +- Login using your app. Observe how log in is done on the [website](https://news.ycombinator.com/), and emulate it. + +When users logged in, they should be able to: + +- Create new posts. They should have: + - Title, URL and the Description. +- Delete own post. +- Make up-vote or hide their vote. +- Log out. + +- Note: if user is not loggen in, but tries to access above mentioned actions, send user to login page of the app. diff --git a/subjects/mobile-dev/hacker-news/audit/README.md b/subjects/mobile-dev/hacker-news/audit/README.md new file mode 100644 index 000000000..7bfd5b283 --- /dev/null +++ b/subjects/mobile-dev/hacker-news/audit/README.md @@ -0,0 +1,17 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Does app shows all fetched posts? + +###### Tap any post, does it open webview of the content? + +###### Can you go back to the main page? + +###### Tap login page. Does it open route to login? + +###### Can you login with actual login and password from the website? + +###### After loggen in, try to upvote, comment, hide upvote on posts and see that it is reflected on the actual website. + +###### You should **not** be able to create posts, upvote, etc as **not** logged in user. Is that the case? diff --git a/subjects/mobile-dev/intro/README.md b/subjects/mobile-dev/intro/README.md new file mode 100644 index 000000000..d90580aa3 --- /dev/null +++ b/subjects/mobile-dev/intro/README.md @@ -0,0 +1,27 @@ +# Intro + +### Instructions + +Dart is a programming language designed for client development, such as for the web and mobile apps. It is developed by Google and can also be used to build server and desktop applications. Dart is an object-oriented, class-based, garbage-collected language with C-style syntax. + +Dart (within Flutter framework) is used to develop cross platform applications for Android, iOS, Linux, macOS, Windows, Google Fuchsia, and the web from a single codebase. + +Let's start with standard programming language tradition, write your first `"Hello, world!"` in Dart. + +Create a file named `intro.dart` with the following content and run it! + +### Expected function + +```dart +void main() { + print("Hello, World!"); +} +``` + +### Usage + +To run the program, execute a command: + +```console +dart intro.dart +``` diff --git a/subjects/mobile-dev/max-num/README.md b/subjects/mobile-dev/max-num/README.md new file mode 100644 index 000000000..a961fdd85 --- /dev/null +++ b/subjects/mobile-dev/max-num/README.md @@ -0,0 +1,28 @@ +# Max Num + +### Instructions + +Write a function called `maxNum()` that takes three integers as arguments and returns the maximum number of the three. + +### Ternary operators + +One can do different things with ternary operators. It comes handy when one wants to do actions based on some condition. +This operation also keeps less amount of code, and hopefully more readable. + +Typical form of the ternary operator is: + +``` +condition ? (value for true condition) : (value for false condition) +``` + +```dart +bool four_greater_than_five = 4 > 5 ? true : false; +``` + +- Note: The same could be achieved with simple if and else, but this approach reduces code length. + +### Usage + +```dart +int maxNum(int first, int second, int third) {...} +``` diff --git a/subjects/mobile-dev/movie-list/README.md b/subjects/mobile-dev/movie-list/README.md new file mode 100644 index 000000000..77189cff4 --- /dev/null +++ b/subjects/mobile-dev/movie-list/README.md @@ -0,0 +1,64 @@ +# Movie List + +### Introduction + +When developing a fullly functional app, you will most likely use some external files to display on your app. One of the most popular file types is JSON. +Develop an app to work with JSON. You are given a file with information about different movies. +You must display top rated movies with descending rating on the first page of the app. By tapping on a movie, a new route with more detailed information regarding the movie must be displayed. +Searching for a movie via search bar must be included. Searching must be done by movie name, Entered string must be completely within movie name, i.e. if "vatar" is searched, "Avatar" must be included in the response. Basically, search must work like SQL's **_ilike_** comparision. + +### Objective + +- Infinite scroll +- ListView +- Json Serialization +- Routes/Push +- AppBar actions +- Images +- Futures, async +- Provider + +### Part 1 + +Create a ListView which will show the image, title and description of movies from JSON file (see **Assets** section); + +Create a class with properties: + +``` +class Movie { + final String genre; + final String imdbRating; + final String title; + final String poster; + + Movie(this.genre, this.imdbRating, this.title, this.poster); +} +``` + +Add fromJson method to make a json serialization, see more on [here](https://flutter.dev/docs/development/data-and-backend/json). + +Your ListView should use [FutureBuilder](https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html) to wait for data from JSON file and then show it once it is loaded. + +
+ +
+ +### Part 2 + +Create a page with detailed information about the movie. + +It should have an image of the movie, at least 5 parameters from the film's information, i.e. when it was filmed, main actors, anything else you might consider useful. Use scroll bar if the info doesn't fit in one page. + +The appbar should have a name of the film and go back button. + +Visit [documentaion](https://flutter.dev/docs/cookbook/navigation/named-routes) to see how to implement routing. + +### **Assets** + +[Movies](movies.json). + +### **Bonus** + +- Make [navigation transition](https://docs.flutter.dev/resources/platform-adaptations) when switching routes. +- Make [back navigation](https://docs.flutter.dev/resources/platform-adaptations#back-navigation). +- Animate [overscroll behaviour](https://docs.flutter.dev/resources/platform-adaptations#overscroll-behavior). diff --git a/subjects/mobile-dev/movie-list/audit/README.md b/subjects/mobile-dev/movie-list/audit/README.md new file mode 100644 index 000000000..7d99b3c05 --- /dev/null +++ b/subjects/mobile-dev/movie-list/audit/README.md @@ -0,0 +1,23 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Was the app committed within the required time period? + +###### Does the app run without crashes? + +###### Does the first page contain top rated movies with descending rating? + +###### Does every movie icon contain name, image, release date, rating, duration? + +###### Is the new route created when the movie icon is tapped? + +###### Does the movie profile page display at least 5 parameters regarding the tapped movie? + +###### Does the search bar look for only the movies by movie name, as does SQL's **_ilike_** comparision? + +###### When no search query is supplied, does the app show all items? + +###### Widgets should not be overflowed. Is it the case in both routes? + +###### Does the app behave as it is supposed to? diff --git a/subjects/mobile-dev/movie-list/movies.json b/subjects/mobile-dev/movie-list/movies.json new file mode 100644 index 000000000..d6a4b7156 --- /dev/null +++ b/subjects/mobile-dev/movie-list/movies.json @@ -0,0 +1,471 @@ +[ + { + "Title": "Avatar", + "Year": "2009", + "Rated": "PG-13", + "Released": "18 Dec 2009", + "Runtime": "162 min", + "Genre": "Action, Adventure, Fantasy", + "Director": "James Cameron", + "Writer": "James Cameron", + "Actors": "Sam Worthington, Zoe Saldana, Sigourney Weaver, Stephen Lang", + "Plot": "A paraplegic marine dispatched to the moon Pandora on a unique mission becomes torn between following his orders and protecting the world he feels is his home.", + "Language": "English, Spanish", + "Country": "USA, UK", + "Awards": "Won 3 Oscars. Another 80 wins & 121 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMTYwOTEwNjAzMl5BMl5BanBnXkFtZTcwODc5MTUwMw@@._V1_SX300.jpg", + "Metascore": "83", + "imdbRating": "7.9", + "imdbVotes": "890,617", + "imdbID": "tt0499549", + "Type": "movie", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjEyOTYyMzUxNl5BMl5BanBnXkFtZTcwNTg0MTUzNA@@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BNzM2MDk3MTcyMV5BMl5BanBnXkFtZTcwNjg0MTUzNA@@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTY2ODQ3NjMyMl5BMl5BanBnXkFtZTcwODg0MTUzNA@@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTMxOTEwNDcxN15BMl5BanBnXkFtZTcwOTg0MTUzNA@@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTYxMDg1Nzk1MV5BMl5BanBnXkFtZTcwMDk0MTUzNA@@._V1_SX1500_CR0,0,1500,999_AL_.jpg" + ] + }, + { + "Title": "I Am Legend", + "Year": "2007", + "Rated": "PG-13", + "Released": "14 Dec 2007", + "Runtime": "101 min", + "Genre": "Drama, Horror, Sci-Fi", + "Director": "Francis Lawrence", + "Writer": "Mark Protosevich (screenplay), Akiva Goldsman (screenplay), Richard Matheson (novel), John William Corrington, Joyce Hooper Corrington", + "Actors": "Will Smith, Alice Braga, Charlie Tahan, Salli Richardson-Whitfield", + "Plot": "Years after a plague kills most of humanity and transforms the rest into monsters, the sole survivor in New York City struggles valiantly to find a cure.", + "Language": "English", + "Country": "USA", + "Awards": "9 wins & 21 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMTU4NzMyNDk1OV5BMl5BanBnXkFtZTcwOTEwMzU1MQ@@._V1_SX300.jpg", + "Metascore": "65", + "imdbRating": "7.2", + "imdbVotes": "533,874", + "imdbID": "tt0480249", + "Type": "movie", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTI0NTI4NjE3NV5BMl5BanBnXkFtZTYwMDA0Nzc4._V1_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTIwMDg2MDU4M15BMl5BanBnXkFtZTYwMTA0Nzc4._V1_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTc5MDM1OTU5OV5BMl5BanBnXkFtZTYwMjA0Nzc4._V1_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTA0MTI2NjMzMzFeQTJeQWpwZ15BbWU2MDMwNDc3OA@@._V1_.jpg" + ] + }, + { + "Title": "300", + "Year": "2006", + "Rated": "R", + "Released": "09 Mar 2007", + "Runtime": "117 min", + "Genre": "Action, Drama, Fantasy", + "Director": "Zack Snyder", + "Writer": "Zack Snyder (screenplay), Kurt Johnstad (screenplay), Michael Gordon (screenplay), Frank Miller (graphic novel), Lynn Varley (graphic novel)", + "Actors": "Gerard Butler, Lena Headey, Dominic West, David Wenham", + "Plot": "King Leonidas of Sparta and a force of 300 men fight the Persians at Thermopylae in 480 B.C.", + "Language": "English", + "Country": "USA", + "Awards": "16 wins & 42 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMjAzNTkzNjcxNl5BMl5BanBnXkFtZTYwNDA4NjE3._V1_SX300.jpg", + "Metascore": "52", + "imdbRating": "7.7", + "imdbVotes": "611,046", + "imdbID": "tt0416449", + "Type": "movie", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTMwNTg5MzMwMV5BMl5BanBnXkFtZTcwMzA2NTIyMw@@._V1_SX1777_CR0,0,1777,937_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTQwNTgyNTMzNF5BMl5BanBnXkFtZTcwNDA2NTIyMw@@._V1_SX1777_CR0,0,1777,935_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTc0MjQzOTEwMV5BMl5BanBnXkFtZTcwMzE2NTIyMw@@._V1_SX1777_CR0,0,1777,947_AL_.jpg" + ] + }, + { + "Title": "The Avengers", + "Year": "2012", + "Rated": "PG-13", + "Released": "04 May 2012", + "Runtime": "143 min", + "Genre": "Action, Sci-Fi, Thriller", + "Director": "Joss Whedon", + "Writer": "Joss Whedon (screenplay), Zak Penn (story), Joss Whedon (story)", + "Actors": "Robert Downey Jr., Chris Evans, Mark Ruffalo, Chris Hemsworth", + "Plot": "Earth's mightiest heroes must come together and learn to fight as a team if they are to stop the mischievous Loki and his alien army from enslaving humanity.", + "Language": "English, Russian", + "Country": "USA", + "Awards": "Nominated for 1 Oscar. Another 34 wins & 75 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMTk2NTI1MTU4N15BMl5BanBnXkFtZTcwODg0OTY0Nw@@._V1_SX300.jpg", + "Metascore": "69", + "imdbRating": "8.1", + "imdbVotes": "1,003,301", + "imdbID": "tt0848228", + "Type": "movie", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTA0NjY0NzE4OTReQTJeQWpwZ15BbWU3MDczODg2Nzc@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjE1MzEzMjcyM15BMl5BanBnXkFtZTcwNDM4ODY3Nw@@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjMwMzM2MTg1M15BMl5BanBnXkFtZTcwNjM4ODY3Nw@@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTQ4NzM2Mjc5MV5BMl5BanBnXkFtZTcwMTkwOTY3Nw@@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTc3MzQ3NjA5N15BMl5BanBnXkFtZTcwMzY5OTY3Nw@@._V1_SX1777_CR0,0,1777,999_AL_.jpg" + ] + }, + { + "Title": "The Wolf of Wall Street", + "Year": "2013", + "Rated": "R", + "Released": "25 Dec 2013", + "Runtime": "180 min", + "Genre": "Biography, Comedy, Crime", + "Director": "Martin Scorsese", + "Writer": "Terence Winter (screenplay), Jordan Belfort (book)", + "Actors": "Leonardo DiCaprio, Jonah Hill, Margot Robbie, Matthew McConaughey", + "Plot": "Based on the true story of Jordan Belfort, from his rise to a wealthy stock-broker living the high life to his fall involving crime, corruption and the federal government.", + "Language": "English, French", + "Country": "USA", + "Awards": "Nominated for 5 Oscars. Another 35 wins & 154 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMjIxMjgxNTk0MF5BMl5BanBnXkFtZTgwNjIyOTg2MDE@._V1_SX300.jpg", + "Metascore": "75", + "imdbRating": "8.2", + "imdbVotes": "786,985", + "imdbID": "tt0993846", + "Type": "movie", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BNDIwMDIxNzk3Ml5BMl5BanBnXkFtZTgwMTg0MzQ4MDE@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTc0NzAxODAyMl5BMl5BanBnXkFtZTgwMDg0MzQ4MDE@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTExMDk1MDE4NzVeQTJeQWpwZ15BbWU4MDM4NDM0ODAx._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTg3MTY4NDk4Nl5BMl5BanBnXkFtZTgwNjc0MzQ4MDE@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTgzMTg4MDI0Ml5BMl5BanBnXkFtZTgwOTY0MzQ4MDE@._V1_SY1000_CR0,0,1553,1000_AL_.jpg" + ] + }, + { + "Title": "Interstellar", + "Year": "2014", + "Rated": "PG-13", + "Released": "07 Nov 2014", + "Runtime": "169 min", + "Genre": "Adventure, Drama, Sci-Fi", + "Director": "Christopher Nolan", + "Writer": "Jonathan Nolan, Christopher Nolan", + "Actors": "Ellen Burstyn, Matthew McConaughey, Mackenzie Foy, John Lithgow", + "Plot": "A team of explorers travel through a wormhole in space in an attempt to ensure humanity's survival.", + "Language": "English", + "Country": "USA, UK", + "Awards": "Won 1 Oscar. Another 39 wins & 134 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMjIxNTU4MzY4MF5BMl5BanBnXkFtZTgwMzM4ODI3MjE@._V1_SX300.jpg", + "Metascore": "74", + "imdbRating": "8.6", + "imdbVotes": "937,412", + "imdbID": "tt0816692", + "Type": "movie", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjA3NTEwOTMxMV5BMl5BanBnXkFtZTgwMjMyODgxMzE@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMzQ5ODE2MzEwM15BMl5BanBnXkFtZTgwMTMyODgxMzE@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTg4Njk4MzY0Nl5BMl5BanBnXkFtZTgwMzIyODgxMzE@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMzE3MTM0MTc3Ml5BMl5BanBnXkFtZTgwMDIyODgxMzE@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BNjYzNjE2NDk3N15BMl5BanBnXkFtZTgwNzEyODgxMzE@._V1_SX1500_CR0,0,1500,999_AL_.jpg" + ] + }, + { + "Title": "Game of Thrones", + "Year": "2011–", + "Rated": "TV-MA", + "Released": "17 Apr 2011", + "Runtime": "56 min", + "Genre": "Adventure, Drama, Fantasy", + "Director": "N/A", + "Writer": "David Benioff, D.B. Weiss", + "Actors": "Peter Dinklage, Lena Headey, Emilia Clarke, Kit Harington", + "Plot": "While a civil war brews between several noble families in Westeros, the children of the former rulers of the land attempt to rise up to power. Meanwhile a forgotten race, bent on destruction, plans to return after thousands of years in the North.", + "Language": "English", + "Country": "USA, UK", + "Awards": "Won 1 Golden Globe. Another 185 wins & 334 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMjM5OTQ1MTY5Nl5BMl5BanBnXkFtZTgwMjM3NzMxODE@._V1_SX300.jpg", + "Metascore": "N/A", + "imdbRating": "9.5", + "imdbVotes": "1,046,830", + "imdbID": "tt0944947", + "Type": "series", + "totalSeasons": "7", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BNDc1MGUyNzItNWRkOC00MjM1LWJjNjMtZTZlYWIxMGRmYzVlXkEyXkFqcGdeQXVyMzU3MDEyNjk@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BZjZkN2M5ODgtMjQ2OC00ZjAxLWE1MjMtZDE0OTNmNGM0NWEwXkEyXkFqcGdeQXVyNjUxNzgwNTE@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMDk4Y2Y1MDAtNGVmMC00ZTlhLTlmMmQtYjcyN2VkNzUzZjg2XkEyXkFqcGdeQXVyNjUxNzgwNTE@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BNjZjNWIzMzQtZWZjYy00ZTkwLWJiMTYtOWRkZDBhNWJhY2JmXkEyXkFqcGdeQXVyMjk3NTUyOTc@._V1_SX1777_CR0,0,1777,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BNTMyMTRjZWEtM2UxMS00ZjU5LWIxMTYtZDA5YmJhZmRjYTc4XkEyXkFqcGdeQXVyMjk3NTUyOTc@._V1_SX1777_CR0,0,1777,999_AL_.jpg" + ] + }, + { + "Title": "Vikings", + "Year": "2013–", + "Rated": "TV-14", + "Released": "03 Mar 2013", + "Runtime": "44 min", + "Genre": "Action, Drama, History", + "Director": "N/A", + "Writer": "Michael Hirst", + "Actors": "Travis Fimmel, Clive Standen, Gustaf Skarsgård, Katheryn Winnick", + "Plot": "The world of the Vikings is brought to life through the journey of Ragnar Lothbrok, the first Viking to emerge from Norse legend and onto the pages of history - a man on the edge of myth.", + "Language": "English, Old English, Norse, Old, Latin", + "Country": "Ireland, Canada", + "Awards": "Nominated for 7 Primetime Emmys. Another 17 wins & 49 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BOTEzNzI3MDc0N15BMl5BanBnXkFtZTgwMzk1MzA5NzE@._V1_SX300.jpg", + "Metascore": "N/A", + "imdbRating": "8.6", + "imdbVotes": "198,041", + "imdbID": "tt2306299", + "Type": "series", + "totalSeasons": "5", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjM5MTM1ODUxNV5BMl5BanBnXkFtZTgwNTAzOTI2ODE@._V1_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BNzU2NDcxODMyOF5BMl5BanBnXkFtZTgwNDAzOTI2ODE@._V1_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjMzMzIzOTU2M15BMl5BanBnXkFtZTgwODMzMTkyODE@._V1_SY1000_SX1500_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTQ2NTQ2MDA3NF5BMl5BanBnXkFtZTgwODkxMDUxODE@._V1_SY1000_SX1500_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTcxOTQ3NTA5N15BMl5BanBnXkFtZTgwMzExMDUxODE@._V1_SY1000_SX1500_AL_.jpg" + ] + }, + { + "Title": "Gotham", + "Year": "2014–", + "Rated": "TV-14", + "Released": "01 Aug 2014", + "Runtime": "42 min", + "Genre": "Action, Crime, Drama", + "Director": "N/A", + "Writer": "Bruno Heller", + "Actors": "Ben McKenzie, Donal Logue, David Mazouz, Sean Pertwee", + "Plot": "The story behind Detective James Gordon's rise to prominence in Gotham City in the years before Batman's arrival.", + "Language": "English", + "Country": "USA", + "Awards": "Nominated for 4 Primetime Emmys. Another 3 wins & 22 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMTY2MjMwNDE4OV5BMl5BanBnXkFtZTgwNjI1NjU0OTE@._V1_SX300.jpg", + "Metascore": "N/A", + "imdbRating": "8.0", + "imdbVotes": "133,375", + "imdbID": "tt3749900", + "Type": "series", + "totalSeasons": "3", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BNDI3ODYyODY4OV5BMl5BanBnXkFtZTgwNjE5NDMwMDI@._V1_SY1000_SX1500_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjA5OTExMTIwNF5BMl5BanBnXkFtZTgwMjI5NDMwMDI@._V1_SY1000_SX1500_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTA3MDY2NjA3MzBeQTJeQWpwZ15BbWU4MDU0MDkzODgx._V1_SX1499_CR0,0,1499,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjM3MzYzNDgzOV5BMl5BanBnXkFtZTgwMjQwOTM4ODE@._V1_SY1000_CR0,0,1498,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjQwODAyNjk0NF5BMl5BanBnXkFtZTgwODU4MzMyODE@._V1_SY1000_CR0,0,1500,1000_AL_.jpg" + ] + }, + { + "Title": "Power", + "Year": "2014–", + "Rated": "TV-MA", + "Released": "N/A", + "Runtime": "50 min", + "Genre": "Crime, Drama", + "Director": "N/A", + "Writer": "Courtney Kemp Agboh", + "Actors": "Omari Hardwick, Joseph Sikora, Andy Bean, Lela Loren", + "Plot": "James \"Ghost\" St. Patrick, a wealthy New York night club owner who has it all, catering for the city's elite and dreaming big, lives a double life as a drug kingpin.", + "Language": "English", + "Country": "USA", + "Awards": "1 win & 6 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BOTA4NTkzMjUzOF5BMl5BanBnXkFtZTgwNzg5ODkxOTE@._V1_SX300.jpg", + "Metascore": "N/A", + "imdbRating": "8.0", + "imdbVotes": "14,770", + "imdbID": "tt3281796", + "Type": "series", + "totalSeasons": "3", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTc2ODg0MzMzM15BMl5BanBnXkFtZTgwODYxODA5NTE@._V1_SY1000_SX1500_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTcyMjA0MzczNV5BMl5BanBnXkFtZTgwNTIyODA5NTE@._V1_SY1000_SX1500_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTk0MTI0NzQ2NV5BMl5BanBnXkFtZTgwMDkxODA5NTE@._V1_SY1000_SX1500_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTQ4Mzk1ODcxM15BMl5BanBnXkFtZTgwNDQyODA5NTE@._V1_SY1000_SX1500_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTUwNTE0NDI1M15BMl5BanBnXkFtZTgwMDQyODA5NTE@._V1_SY1000_SX1500_AL_.jpg" + ] + }, + { + "Title": "Narcos", + "Year": "2015–", + "Rated": "TV-MA", + "Released": "28 Aug 2015", + "Runtime": "49 min", + "Genre": "Biography, Crime, Drama", + "Director": "N/A", + "Writer": "Carlo Bernard, Chris Brancato, Doug Miro, Paul Eckstein", + "Actors": "Wagner Moura, Boyd Holbrook, Pedro Pascal, Joanna Christie", + "Plot": "A chronicled look at the criminal exploits of Colombian drug lord Pablo Escobar.", + "Language": "English, Spanish", + "Country": "USA", + "Awards": "Nominated for 2 Golden Globes. Another 4 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMTU0ODQ4NDg2OF5BMl5BanBnXkFtZTgwNzczNTE4OTE@._V1_SX300.jpg", + "Metascore": "N/A", + "imdbRating": "8.9", + "imdbVotes": "118,680", + "imdbID": "tt2707408", + "Type": "series", + "totalSeasons": "2", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTk2MDMzMTc0MF5BMl5BanBnXkFtZTgwMTAyMzA1OTE@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjIxMDkyOTEyNV5BMl5BanBnXkFtZTgwNjY3Mjc3OTE@._V1_SY1000_SX1500_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjA2NDUwMTU2NV5BMl5BanBnXkFtZTgwNTI1Mzc3OTE@._V1_SY1000_CR0,0,1499,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BODA1NjAyMTQ3Ml5BMl5BanBnXkFtZTgwNjI1Mzc3OTE@._V1_SY1000_CR0,0,1499,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTU0NzQ0OTAwNl5BMl5BanBnXkFtZTgwMDAyMzA1OTE@._V1_SX1500_CR0,0,1500,999_AL_.jpg" + ] + }, + { + "Title": "Breaking Bad", + "Year": "2008–2013", + "Rated": "TV-14", + "Released": "20 Jan 2008", + "Runtime": "49 min", + "Genre": "Crime, Drama, Thriller", + "Director": "N/A", + "Writer": "Vince Gilligan", + "Actors": "Bryan Cranston, Anna Gunn, Aaron Paul, Dean Norris", + "Plot": "A high school chemistry teacher diagnosed with inoperable lung cancer turns to manufacturing and selling methamphetamine in order to secure his family's financial future.", + "Language": "English, Spanish", + "Country": "USA", + "Awards": "Won 2 Golden Globes. Another 132 wins & 218 nominations.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMTQ0ODYzODc0OV5BMl5BanBnXkFtZTgwMDk3OTcyMDE@._V1_SX300.jpg", + "Metascore": "N/A", + "imdbRating": "9.5", + "imdbVotes": "889,883", + "imdbID": "tt0903747", + "Type": "series", + "totalSeasons": "5", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTgyMzI5NDc5Nl5BMl5BanBnXkFtZTgwMjM0MTI2MDE@._V1_SY1000_CR0,0,1498,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTQ2NDkwNDk5NV5BMl5BanBnXkFtZTgwNDM0MTI2MDE@._V1_SY1000_CR0,0,1495,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTM4NDcyNDMzMF5BMl5BanBnXkFtZTgwOTI0MTI2MDE@._V1_SY1000_CR0,0,1495,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTAzMTczMjM3NjFeQTJeQWpwZ15BbWU4MDc1MTI1MzAx._V1_SY1000_CR0,0,1495,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjA5MTE3MTgwMF5BMl5BanBnXkFtZTgwOTQxMjUzMDE@._V1_SX1500_CR0,0,1500,999_AL_.jpg" + ] + }, + { + "ComingSoon": true, + "Title": "Doctor Strange", + "Year": "2016", + "Rated": "N/A", + "Released": "04 Nov 2016", + "Runtime": "N/A", + "Genre": "Action, Adventure, Fantasy", + "Director": "Scott Derrickson", + "Writer": "Scott Derrickson (screenplay), C. Robert Cargill (screenplay), Jon Spaihts (story by), Scott Derrickson (story by), C. Robert Cargill (story by), Steve Ditko (comic book)", + "Actors": "Rachel McAdams, Benedict Cumberbatch, Mads Mikkelsen, Tilda Swinton", + "Plot": "After his career is destroyed, a brilliant but arrogant and conceited surgeon gets a new lease on life when a sorcerer takes him under her wing and trains him to defend the world against evil.", + "Language": "English", + "Country": "USA", + "Awards": "N/A", + "Poster": "http://ia.media-imdb.com/images/M/MV5BNjgwNzAzNjk1Nl5BMl5BanBnXkFtZTgwMzQ2NjI1OTE@._V1_SX300.jpg", + "Metascore": "N/A", + "imdbRating": "N/A", + "imdbVotes": "N/A", + "imdbID": "tt1211837", + "Type": "movie", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjM3ODc1ODI5Ml5BMl5BanBnXkFtZTgwODMzMDY3OTE@._V1_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTgxNTAyNTU0NV5BMl5BanBnXkFtZTgwNzMzMDY3OTE@._V1_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjE5NDc5NzUwNV5BMl5BanBnXkFtZTgwMDM3MDM2NzE@._V1_.jpg" + ] + }, + { + "ComingSoon": true, + "Title": "Rogue One: A Star Wars Story", + "Year": "2016", + "Rated": "N/A", + "Released": "16 Dec 2016", + "Runtime": "N/A", + "Genre": "Action, Adventure, Sci-Fi", + "Director": "Gareth Edwards", + "Writer": "Chris Weitz (screenplay), Tony Gilroy (screenplay), John Knoll (story), Gary Whitta (story), George Lucas (characters)", + "Actors": "Felicity Jones, Riz Ahmed, Mads Mikkelsen, Ben Mendelsohn", + "Plot": "The Rebellion makes a risky move to steal the plans to the Death Star, setting up the epic saga to follow.", + "Language": "English", + "Country": "USA", + "Awards": "1 nomination.", + "Poster": "https://images-na.ssl-images-amazon.com/images/M/MV5BMjQyMzI2OTA3OF5BMl5BanBnXkFtZTgwNDg5NjQ0OTE@._V1_SY1000_CR0,0,674,1000_AL_.jpg", + "Metascore": "N/A", + "imdbRating": "N/A", + "imdbVotes": "N/A", + "imdbID": "tt3748528", + "Type": "movie", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjE3MzA4Nzk3NV5BMl5BanBnXkFtZTgwNjAxMTc1ODE@._V1_SX1777_CR0,0,1777,744_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BNDMxMTQzMjQxM15BMl5BanBnXkFtZTgwNzAxMTc1ODE@._V1_SX1777_CR0,0,1777,744_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTUyNjkxOTk5NV5BMl5BanBnXkFtZTgwODAxMTc1ODE@._V1_SX1777_CR0,0,1777,744_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BNjM4MzExNDAyNl5BMl5BanBnXkFtZTgwOTAxMTc1ODE@._V1_SX1777_CR0,0,1777,744_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjE3NTgxMDcyNV5BMl5BanBnXkFtZTgwMDExMTc1ODE@._V1_SX1777_CR0,0,1777,744_AL_.jpg" + ] + }, + { + "ComingSoon": true, + "Title": "Assassin's Creed", + "Year": "2016", + "Rated": "N/A", + "Released": "21 Dec 2016", + "Runtime": "N/A", + "Genre": "Action, Adventure, Fantasy", + "Director": "Justin Kurzel", + "Writer": "Bill Collage (screenplay), Adam Cooper (screenplay), Michael Lesslie (screenplay)", + "Actors": "Michael Fassbender, Michael Kenneth Williams, Marion Cotillard, Jeremy Irons", + "Plot": "When Callum Lynch explores the memories of his ancestor Aguilar and gains the skills of a Master Assassin, he discovers he is a descendant of the secret Assassins society.", + "Language": "English", + "Country": "UK, France, USA, Hong Kong", + "Awards": "N/A", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMTU2MTQwMjU1OF5BMl5BanBnXkFtZTgwMDA5NjU5ODE@._V1_SX300.jpg", + "Metascore": "N/A", + "imdbRating": "N/A", + "imdbVotes": "N/A", + "imdbID": "tt2094766", + "Type": "movie", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BN2EyYzgyOWEtNTY2NS00NjRjLWJiNDYtMWViMjg5MWZjYjgzXkEyXkFqcGdeQXVyNjUwNzk3NDc@._V1_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTYwOWYzOTctOTc4My00ZmJkLTgzMTctMmUxNDI5ODQzYzNjXkEyXkFqcGdeQXVyNDAyODU1Njc@._V1_SX1500_CR0,0,1500,999_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BZTY5ZGUxMTAtYTU0OC00NGQ2LTkzNzgtZGZmNjlmNjY3MGU0XkEyXkFqcGdeQXVyNTY0MTkxMTg@._V1_SY1000_CR0,0,1500,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BZjA0MWYwZTEtYzc5Yi00NGM2LTg1YTctNjY2YzQ0NDJhZDAwXkEyXkFqcGdeQXVyNDAyODU1Njc@._V1_SY1000_CR0,0,1499,1000_AL_.jpg" + ] + }, + { + "ComingSoon": true, + "Title": "Luke Cage", + "Year": "2016–", + "Rated": "TV-MA", + "Released": "30 Sep 2016", + "Runtime": "55 min", + "Genre": "Action, Crime, Drama", + "Director": "N/A", + "Writer": "Cheo Hodari Coker", + "Actors": "Mahershala Ali, Mike Colter, Frankie Faison, Erik LaRay Harvey", + "Plot": "Given superstrength and durability by a sabotaged experiment, a wrongly accused man escapes prison to become a superhero for hire.", + "Language": "English", + "Country": "USA", + "Awards": "N/A", + "Poster": "http://ia.media-imdb.com/images/M/MV5BMTcyMzc1MjI5MF5BMl5BanBnXkFtZTgwMzE4ODY2OTE@._V1_SX300.jpg", + "Metascore": "N/A", + "imdbRating": "N/A", + "imdbVotes": "N/A", + "imdbID": "tt3322314", + "Type": "series", + "totalSeasons": "1", + "Response": "True", + "Images": [ + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjMxNjc1NjI0NV5BMl5BanBnXkFtZTgwNzA0NzY0ODE@._V1_SY1000_CR0,0,1497,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjI1MDg3NjY2OF5BMl5BanBnXkFtZTgwNDE1NDU4OTE@._V1_SY1000_CR0,0,1497,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BOTYzOTQyNDYxNl5BMl5BanBnXkFtZTgwNzA1NDU4OTE@._V1_SY1000_CR0,0,1498,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMTgxMjA3MTQ5Ml5BMl5BanBnXkFtZTgwOTA1NDU4OTE@._V1_SY1000_CR0,0,1498,1000_AL_.jpg", + "https://images-na.ssl-images-amazon.com/images/M/MV5BMjMyNjg5ODYwNF5BMl5BanBnXkFtZTgwMTE1NDU4OTE@._V1_SY1000_CR0,0,1477,1000_AL_.jpg" + ] + } + ] \ No newline at end of file diff --git a/subjects/mobile-dev/named-optional-sum/README.md b/subjects/mobile-dev/named-optional-sum/README.md new file mode 100644 index 000000000..1b5939c8d --- /dev/null +++ b/subjects/mobile-dev/named-optional-sum/README.md @@ -0,0 +1,37 @@ +# Named Optional Sum + +### Instructions + +Write a function called `namedOptionalSum()` that accepts named parameters `first`, `second`, `third` and returns the sum of them. + +- All the parameters are integers. +- Absent parameters should be considered as 0. + +### Named parameters + +In Dart you can declare functions that require explicit naming for arguments. Compare 2 functions below. + +```dart +// Example 1 +void someFunction(bool bold, bool hidden) {...} + +someFunction(true, false); +``` + +```dart +// Example 2 +// Now you must specify which argument you are referring to +void someFunction({bool? bold, bool? hidden}) {...} + +someFunction(bold: true, hidden: false); +``` + +This way you must specify the name of argument each time you call a function. You can also skip the parameter by simply not specifying its name and value. What do you think will be the default value for skipped parameters? + +### Null safety + +You might be wondering what does "?" sign in bool? mean. + +As Dart's documentation suggests - "...types in your code are non-nullable by default, meaning that variables can’t contain null unless you say they can. With null safety, your runtime null-dereference errors turn into edit-time analysis errors." + +What happens if the argument of the function is optional and it is omitted? It should be null, but the Dart's null safety does not allow it, and you will get error from compiler. In order to let Dart's compiler understand that certain variable should be able to accept null, you **must** initialize primitives with question sign. More on null safety [here](https://dart.dev/null-safety). diff --git a/subjects/mobile-dev/named-required-sum/README.md b/subjects/mobile-dev/named-required-sum/README.md new file mode 100644 index 000000000..b0ab6da45 --- /dev/null +++ b/subjects/mobile-dev/named-required-sum/README.md @@ -0,0 +1,8 @@ +# Named Required Sum + +### Instructions + +Write a function called `namedRequiredSum()` that accepts *required* named parameters `first`, `second`, `third` and returns their sum. All the parameters are integers. + +- Note: Find out how to make required [named parameters](https://dart.dev/guides/language/language-tour). + diff --git a/subjects/mobile-dev/optional-sum/README.md b/subjects/mobile-dev/optional-sum/README.md new file mode 100644 index 000000000..df8bc9d63 --- /dev/null +++ b/subjects/mobile-dev/optional-sum/README.md @@ -0,0 +1,32 @@ +# Optional Sum + +### Instructions + +Write a function called `optionalSum()` that accepts two integer arguments, and an optional integer argument. Return the sum of all the arguments. + +### Optional parameters + +In Dart you can also make function arguments optional, meaning that a function can work even if the optional argument is omitted. If the optional parameter is omitted, it is considered to be null. + +### Usage + +Example of function with optional parameters: + +```dart +void someFunction(int firstParameter, int secondParameter, [int? optionalParameter]) { + if (optionalParameter != null) { + print('${firstParameter}, ${secondParameter}, ${optionalParameter}'); + } else { + print('${firstParameter}, ${secondParameter}'); + } +} +void main() { + + someFunction(1, 2); + someFunction(1, 2, 3); +} +``` + +- Note: Optional parameters must come after the required parameters. + +- Note: You cannot use both optional and named parameters, you should choose only one of them. diff --git a/subjects/mobile-dev/package/README.md b/subjects/mobile-dev/package/README.md new file mode 100644 index 000000000..08ae405b9 --- /dev/null +++ b/subjects/mobile-dev/package/README.md @@ -0,0 +1,85 @@ +# Package + +Package can be used to organize and share a set of functions in Dart. It is simply a sharable library or modules. +Package is similar to Dart Application except that Dart Package does not have application entry point - main. +A minimal package consists of the following: + +- pubspec.yaml: + A metadata file that declares the package name, version, author, etc. +- lib: + The lib directory contains the public code of the package, at least one .dart file. + +### Instructions: + +Create a Flutter package for your Secure Notes app. You should write +your own package which will work with sqflite and have CRUD +functionality. +Your package should consist of Database.dart class and Note class which +will allow easy access to SQLite database. +In the end you should be able to import it like: + +``` +import 'package:note/note.dart'; + +``` + +### Objective: + +- Dealing with existing, large apps +- Reusing packages across multiple apps +- Local vs remote (git) packages + +### Database.dart + +``` +class Database { +Database _db; + + Future create() async { + Directory path = await getApplicationDocumentsDirectory(); + String dbPath = join(path.path, "database.db"); + + _db = await openDatabase(dbPath, version: 1); + } +} + +``` + +Example of Database class, where you should create table "Note" with 4 parameters : + +- id +- title +- body +- date + +Database class should also have CRUD methods like getAllNotes, deleteAllNotes, addNote, deleteNote, updateNote. + +- getAllNotes() +- deleteAllNotes() +- addNote(note: Note) +- deleteNote(note: Note) +- updateNote(oldNote: Note, newNote: Note) + +### Note.dart + +Model class for Note object. + +``` +class Note { + int id; + String title; + String body; + String date; + + Note({ + this.id, + this.title, + this.body, + this.date; + }); + +``` + +### Hints: + +[https://pub.dev/packages/sqflite](https://pub.dev/packages/sqflite) [https://flutter.dev/docs/development/packages-and-plugins/developing-packages](https://flutter.dev/docs/development/packages-and-plugins/developing-packages) diff --git a/subjects/mobile-dev/package/audit/README.md b/subjects/mobile-dev/package/audit/README.md new file mode 100644 index 000000000..bd1d68332 --- /dev/null +++ b/subjects/mobile-dev/package/audit/README.md @@ -0,0 +1,25 @@ +#### Functional + +###### Does the app run without crashes? + +###### Is there a dependency in pubspec.yaml to note package? + +###### Was the package created with `flutter create --template=package hello` command + +###### Do adding/deleting the notes button work appropriately? + +###### Can you edit the notes? + +###### Does the app show all the notes from database? + +###### Can you delete note? + +###### Can you add note? + +###### Can you delete all notes? + +###### Can you edit note? + +###### Does the package have a good file structure + +###### Does the app behave as it is supposed to? diff --git a/subjects/mobile-dev/person/README.md b/subjects/mobile-dev/person/README.md new file mode 100644 index 000000000..c80e7e1b8 --- /dev/null +++ b/subjects/mobile-dev/person/README.md @@ -0,0 +1,101 @@ +# Person + +### Instructions + +Create a class named `Person`. + +Its attributes: + +- name - `string` +- surname - `string` +- cityOfOrigin - `string` +- age - `int` +- height - `int` + +Constructor: + +- name - `required` +- cityOfOrigin - `required` +- age - `required` +- height - `required` +- surname - `optional` + +### Object Oriented Programming + +Dart supports object oriented programming which Flutter framework relies on. Classes have 2 main concepts: attributes and methods. Attributes are needed to store various data in the instance of Class and methods are functions, which can use Class attributes for various manipulations. To understand OOP and its difference from functional programming visit [this website](https://www.freecodecamp.org/news/object-oriented-programming-concepts-21bb035f7260/). + +Here is an example of the Class in Dart: + +```dart +class Point { + double x = 0; // attribute initialized to 0 + double y = 0; // attribute initialized to 0 +} +``` + +**Point** - name of the class, **x, y** - are attributes. + +What if you want to initiate a Point with different x and y? To do that declare a **_Constructor_** - which is a function that specifies how to create object of a class given a set of parameters. + +```dart +class Point { + double x = 0; // attribute + double y = 0; // attribute + + // Constructor + Point(double x, double y) { + this.x = x; // initializing attributes + this.y = y; + } +} +``` + +In Dart we can also use Constructor declaration of type **_Constructor(param1, param2...);_** thus saving a few lines of code if all we want to do is to pass arguments to values. + +```dart +class Point { + double x = 0; + double y = 0; + + Point(this.x, this.y); // "this" is meant for current class. +} +``` + +Now let's instantiate two objects of class Point: + +```dart + +var p1 = Point(5, 4); +var p2 = Point(8, 3); +``` + +What if we would like to know what is the distance between these 2 points? We can do that by declaring a class function (or method of the class) and passing one of the objects as a parameter: + +```dart + +import 'dart:math'; + +class Point { + double x = 0; // field + double y = 0; // field + +Point(double x, double y) { // constructor + this.x = x; // initializing field + this.y = y; // initializing field + } + // method + double distanceTo(Point end) { + return sqrt(pow((end.x - this.x), 2) + pow((end.y - this.y), 2)); + } +} +``` + +```dart + +var p1 = Point(5, 4); +var p2 = Point(8, 3); + +print(p1.distanceTo(p2)); +``` + +- Note: please see the [documentation](https://dart.dev/guides/language/language-tour#classes) for examples. diff --git a/subjects/mobile-dev/plain-sum/README.md b/subjects/mobile-dev/plain-sum/README.md new file mode 100644 index 000000000..b1aa0b312 --- /dev/null +++ b/subjects/mobile-dev/plain-sum/README.md @@ -0,0 +1,22 @@ +# Plain Sum + +### Instructions + +Write a function `int plainSum(int, int, int)` which takes 3 integers and returns their sum. + +Functions in Dart are declared as follows: + +```dart +bool isEven(int num) { + return num % 2; +} +``` + +### Usage + +```dart +void main() { + var res = plainSum(1, 2, 3); + print(res); // prints 6 +} +``` diff --git a/subjects/mobile-dev/quizz-app/README.md b/subjects/mobile-dev/quizz-app/README.md new file mode 100644 index 000000000..cc4946975 --- /dev/null +++ b/subjects/mobile-dev/quizz-app/README.md @@ -0,0 +1,85 @@ +# Quizz App + +### Introduction + +Develop a [**stateful Quizz app**](https://docs.flutter.dev/development/ui/interactive) that displays categories that you can choose questions from. +Possible categories: history, pop culture, math, geography, etc (appropriate name, image must be added to all categories). + +After tapping on the category the new route must show a corresponding image to the category, the question itself, true/false buttons. + +After the question has been answered, you must let the user know if the question was answered correctly. + +After the quizz is finished, a user must see their result. + +### Objective + +- Applying stateful widget +- Routing +- Structuring app +- State management +- Network image cache +- Splash screen +- Timer + +### First Part: + +### Categories page: + +- **Grid list** view of categories with appropriate images and names. Make at least 5 categories and at least 10 questions to each quizz. Show 2 categories in a row. +- Your app should have models for Question and Categories: + +```jsx +//models/Question.dart +class Question { + String question; + bool answer; + + Question(this.question, this.answer); +} + +//models/Category.dart + +class Category { + String name; + String imageUrl; + List questions; + + Category(this.name, this.imageUrl, this.questions); +} +``` + +- Note: you can style the app as you want + +- Note: only standard Dart package, package:flutter are allowed. + +
+ +
+ +### Second Part + +### Navigation and routing: + +- When tapping on category push screen to **DetailedView**, which shows appropriate image, question and true/false buttons +- Create a stateful widget, so you can change page's [state](https://flutter.dev/docs/development/ui/interactive). +- When answering question change color of button or background, so the user know that answer is right or wrong. + +
+ + + +
+ +### Third part + +When all questions are answered show the score on a new page. + +- It should have Text with score and button which returns user to the main page + +
+ +
+ +### **Bonus** + +Add a timer to each question, so the user must answer a question in a fixed time. After time is up, question should be marked as answered incorrectly and omitted. diff --git a/subjects/mobile-dev/quizz-app/audit/README.md b/subjects/mobile-dev/quizz-app/audit/README.md new file mode 100644 index 000000000..f29c94769 --- /dev/null +++ b/subjects/mobile-dev/quizz-app/audit/README.md @@ -0,0 +1,31 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Does the app run without crashes? + +###### Does the app change states as it is being used, i.e. is it stateful? + +###### Are there at least 5 categories? + +###### Are there at least 10 questions to each category? + +###### Does every category have a name, appropriate image? + +###### Does tapping the category switch from first route? + +###### Are there question text, image, and true/false buttons on the page containing questions? + +###### Does tapping the true/false button let the user know the answer, and contribute to score correctly? + +###### Does the last page correctly display the score, and button to go to main page? + +###### Does the app behave as it is supposed to? + +#### Bonus: + +###### +Are there images for all the questions? + +###### +When question is not answered within given time, is it considered as not answered? + +###### +When question is not answered within given time, is it omitted and next one shown? diff --git a/subjects/mobile-dev/secure-notes/README.md b/subjects/mobile-dev/secure-notes/README.md new file mode 100644 index 000000000..9b612bee0 --- /dev/null +++ b/subjects/mobile-dev/secure-notes/README.md @@ -0,0 +1,72 @@ +# Secure Notes + +### Introduction + +The app where you can add your own notes. It should behave as normal notes app where you can add, modify, remove old notes, but the app should be secure. Being secure means that the notes should only be accessible through the app, and only after biometric authentication. + +Packages: _sqflite_ package. + +### Objective + +- Work with textfields +- Work with keyboard +- Editing +- Deleting +- Reordering + +### First Part + +- Main Screen displayd list of notes with title, and description. +- Implement ReordableListView to reorder items in list +- Add ability to delete item by swiping +- Add "add" button, which opens screen with 3 text fields + + + + + +### Second Part + +- Screen to add new notes. +- If any of the fields is empty, show error. + +### Third Part + +- Edit Screen. +- Show text in textfields to edit. + +### Fourth Part + +Add sqflite package, so your notes will be saved, even when app reloads. +When app loads it should get notes from database. + +```jsx +class Database { +Database _db; + + Future create() async { + Directory path = await getApplicationDocumentsDirectory(); + String dbPath = join(path.path, "database.db"); + + _db = await openDatabase(dbPath, version: 1); + } +} +``` + +Database class should also have CRUD methods like getAllNotes, deleteAllNotes, addNote, deleteNote, updateNote. + +- getAllNotes +- deleteAllNotes +- addNote +- deleteNote +- updateNote + +### Fifth Part + +Make a biometric authentication. Make sure that notes are not accessible without firstly authenticating user. + +- Note: you may use local_auth + +### Sixth Part + +[Localize](https://flutter.dev/docs/development/accessibility-and-localization/internationalization) your apllication. diff --git a/subjects/mobile-dev/secure-notes/audit/README.md b/subjects/mobile-dev/secure-notes/audit/README.md new file mode 100644 index 000000000..554cc3afe --- /dev/null +++ b/subjects/mobile-dev/secure-notes/audit/README.md @@ -0,0 +1,23 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Does the app run without any crashes? + +###### Can you add a new note? + +###### Can you delete a note? + +###### Can you delete all notes? + +###### Can you edit a note? + +###### Is the note saved after editing? + +###### Does the app show error when any field is empty? + +###### Do you see all notes after closing and opening app back? + +###### Add a note, save it, close the app, open it, change the same note, close app, open app. Do you see updated value? + +###### Does app has valid biometrical authentication? It may be either fingerprint or via camera. diff --git a/subjects/mobile-dev/sky-map/README.md b/subjects/mobile-dev/sky-map/README.md new file mode 100644 index 000000000..f401082c6 --- /dev/null +++ b/subjects/mobile-dev/sky-map/README.md @@ -0,0 +1,41 @@ +# Sky map + +### Exercise + +Develop an app intended to work with GPS, accelerometer, magnetometer and real-time update. Updating an image at least 10 times in a second is considered to be real-time update. +You will be using the hardware's sensor information to determine your location, and position of the device. + +With the data from the sensors, you will send the data to the public [API](https://google.com), rerieve information about celestial objects, and display them on the black canvas. + +By tapping on the object, you must display a short descripton of the object. +Make sure to manage states via any of the following patterns: + +- BLoC +- Provider + +Objects to be diplayed: + +- All planets of our solar system +- Sun and Moon +- 3 constellations of your choice + +### Objectives + +- Working with hardware sensors +- Collecting all the celestial object in OOP style +- Rendering objects in real-time +- Work with APIs +- Provider - [documentation](https://pub.dev/packages/provider) + +Possible examples of the app: + +
+ + + +
+ +
+ + +
diff --git a/subjects/mobile-dev/sky-map/audit/README.md b/subjects/mobile-dev/sky-map/audit/README.md new file mode 100644 index 000000000..832b1f67d --- /dev/null +++ b/subjects/mobile-dev/sky-map/audit/README.md @@ -0,0 +1,25 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Was the app committed within the required time period? + +###### Does the app run without crashes? + +###### Does the app display celestial objects on black canvas? + +###### Check with the current position of the sun, is it accurate? + +###### Are moon, Mars, and Venus visible in the app? + +###### Ask student about constellations of their choice, and find them in the app? + +###### Check if the retrieved data is either from API or from a file. If the data comes from file, check its validity? + +###### Try moving the phone around, does it change the celestial objects shown on the display? + +###### Try tapping on the sun, mars. Does the app display basic information about objects, such as mass, name. + +###### Ask student about pattern implementation. If they used BLoC ask them to explain the pattern, and [check](https://pub.dev/packages/flutter_bloc) whether they implemented it correctly. + +###### Ask student about pattern implementation. If they used Provider ask them to explain the pattern, and [check](https://pub.dev/packages/provider) whether they implemented it correctly. diff --git a/subjects/mobile-dev/stock-market/README.md b/subjects/mobile-dev/stock-market/README.md new file mode 100644 index 000000000..1d2d13a3e --- /dev/null +++ b/subjects/mobile-dev/stock-market/README.md @@ -0,0 +1,41 @@ +# Stock Market + +### Exercise + +Develop an app that will simulate a `real-time` stock market. You may use [Yahoo](https://algotrading101.com/learn/yahoo-finance-api-guide/#:~:text=Why%20should%20I%20use%20the%20Yahoo%20Finance%20API%3F,-Free&text=One%20good%20reason%20is%20because%20it%20can%20be%20completely%20free.) API for data retrieval. + +For any new user, provide them with `1,000,000$` fake dollars, so that they can do operations within your app. These operations include: + +- Log in/out +- Buy/hold stocks +- See historical charts of stock prices +- Retrieve data about a particular stock for the last year or since the company went public +- Updating data about a stock (Updating data atleast 5 times in a second is considered real-time) + +Make sure to manage states via any of the following patterns: + +- BLoC +- Provider +- MVC + +### Todo list + +- Route for login/signup page +- Route with all the purchased stocks +- Route to display historical data of the chosen stock +- All the data must be fetched in real-time +- Choose 20 stocks to monitor + +### Objective + +- Fetching data in real-time +- Visualizing custom widgets in real-time +- Making authentication and authorization services +- Use of patterns + +
+ + + + +
diff --git a/subjects/mobile-dev/stock-market/audit/README.md b/subjects/mobile-dev/stock-market/audit/README.md new file mode 100644 index 000000000..009021b0a --- /dev/null +++ b/subjects/mobile-dev/stock-market/audit/README.md @@ -0,0 +1,29 @@ +#### Functional + +#### In order to run and hot reload app either on emulator or device, follow the [instructions](https://docs.flutter.dev/get-started/test-drive?tab=androidstudio#run-the-app). + +###### Does the app run without crushes? + +###### Signup as new user, and login to your account. Do you have 1000000$ of fake dollars? + +###### After logging in, buy 100 shares of AAPL stock. Check current price of the stock and see if stock appear in your wallet, and your fake dollars are decrease to the according amount. + +###### Do similar operations with 4 other stocks of your choice. Does the app behave accordingly? + +###### Try to sell everything that you bought, do stock disappear from your wallet and fake dollars increase in the amount accordingly? + +###### Can you see historical data for any stock? You should be able to see the data either since company became public or for the past year. + +###### Can you see historical data in days, weeks, and months slice? + +###### Ask student about pattern implementation. If they used BLoC ask them to explain the pattern, and [check](https://pub.dev/packages/flutter_bloc) whether they implemented it correctly. + +###### Ask student about pattern implementation. If they used Provider ask them to explain the pattern, and [check](https://pub.dev/packages/provider) whether they implemented it correctly. + +###### Ask student about pattern implementation. If they used MVC ask them to explain the pattern, and [check](https://pub.dev/packages/mvc_pattern) whether they implemented it correctly. + +###### Logout and try everything you just did with new account. Do you see similar behaviour? + +#### Bonus: + +###### +Did any of your 2 accounts profit from transactions? diff --git a/subjects/mobile-dev/student/README.md b/subjects/mobile-dev/student/README.md new file mode 100644 index 000000000..b33de3550 --- /dev/null +++ b/subjects/mobile-dev/student/README.md @@ -0,0 +1,49 @@ +# Student + +### Instructions + +Create a class named `Student` that extends class named `Person` that you have previously created. + +Its attributes: + +- batch - `public integer` +- level - `public integer` +- secretKey - `private string`, by default equal to "01". +- Constructor: + - name - `required string` + - cityOfOrigin - `required string` + - age - `required int` + - height - `required int` + - batch - `required int` + - level - `required int` + +### Inheritance + +Classes can inherit other classes methods and fields, by doing so, every public field and method will be visible to the child class. It can be useful when some class is completely in the set of other class and you don't want to copy all the code you wrote for another class. If necessary, behavior of certain methods can be changed in the inferior class by "@override" command. + +```dart +class TV { + void turnOn() { + _illuminateDisplay(); + _activateIrSensor(); + } + // ··· +} + +class SmartTV extends TV { +@override +void turnOn() { + super.turnOn(); + _bootNetworkInterface(); + _initializeMemory(); + _upgradeApps(); + } + // ··· +} +``` + +We know that every SmartTV is a TV, therefore we can extend all the methods and fields of the TV class to the SmartTV class. + +By writing `@override`, we are overriding the behavior of the parent class, so that it meets our needs, and if we want to call the parent classes method, we simply put `super` before the name of the method. + +- Note: Use the constructor of parent class. diff --git a/subjects/mobile-dev/university/README.md b/subjects/mobile-dev/university/README.md new file mode 100644 index 000000000..6f29a7c16 --- /dev/null +++ b/subjects/mobile-dev/university/README.md @@ -0,0 +1,43 @@ +# University + +### Instructions + +Create a class named `University`. + +Its attributes: + +- name - `private string` +- city - `private string` +- ranking - `private int?` +- getters: + - name + - city + - ranking +- Constructor: + - name - `required` + - city - `required` + - ranking - `optional` + +### Encapsulation + +Sometimes we need to limit access to class attributes so that it can be accessed only from the class itself. This concept is called **Encapsulation.** + +In Dart we can make attributes **private** (meaning that they can be changed or used only in the instances of this class) by putting underscore (\_) in the beginning of fields' or methods' name. + +Bear in mind that in Dart there is no Encapsulation on a class level. According to Dart's documentation: + +- Importing libraries can help you create a modular and shareable code base. Libraries not only provide APIs, but are unit of privacy: private variables, i.e. starting with an underscore (\_) are visible only inside the library. Every Dart app is a library, even if it doesn’t use a library directive. + +Still, even on a class level it is a good practice to declare private values and not to use values that are intended to be private. + +```dart + +class Person { + bool _hunger = true; + + void feed() { + this._hunger = false; + } + +} +``` diff --git a/subjects/mobile-dev/variables/README.md b/subjects/mobile-dev/variables/README.md new file mode 100644 index 000000000..c058948db --- /dev/null +++ b/subjects/mobile-dev/variables/README.md @@ -0,0 +1,23 @@ +# Variables + +### Instructions + +In Dart you can declare variables in two ways: + +```dart +var strPatrick = 'Patrick'; +// or ... +String strSpongebob = 'Spongebob'; +``` + +- The first way declares using `var` which detects variable types automatically. +- The second way explicitly declares using variable's type, in the example it is `String`. + +Declare and initialize following variables: + +- `obj` of type `Object` containing any value; +- `planet` of type `String` containing planet's name you live on; +- `year` of type `int` containing current year; +- `lucky` of type `bool` containing true of false (you decide); +- constant `pi` of type `double` containing pi value with 2 decimal points; +- Note: no main needed!