Pinned Repositories
advent_of_code_2019
aoc
50 stars collected for year 2020. 50 stars collected for year 2021.
BookListing
Books information retriever. Get books information according to user-input-keywords from the Google Books website through its API. Remove the space if user input space between keywords. Open the app to get a list of books summaries according to user-input-keywords. Use TaskLoader together with activity to trigger the same task, when different activity instances are created, e.g., rotating the screen. Implement an AsyncTaskLoader to asynchronously load data from the API. A progress bar is displayed while the app sending the request and waiting for the response. The JSON response is parsed to get the expected data. Exceptions like no network connection, no expected data, retrieving books information which has no authors information are handled. StringBuilder method are covered because the retrieved authors information from JSON is in an array.
Budapest
A traveler's guide of Budapest: recommendations from local people. Scroll to browse the list of places in the same category e.g. restaurant. Swipe to change the category e.g. from restaurants to shopping places. Used TabLayout and RelativeLayout to organize tabs and items respectively. Customized FragmentPagerAdapter and ArrayAdapter to build data models. Images, brief descriptions and contact info are provided for each place. Followed good practice to keep strings in string layout resource file. Images are carefully chosen and edited to 5 different sizes to support different devices. They are stored as drawable resources.
CoffeeShop
A small app to take coffee orders. It records toppings and quantities of coffees. Order confirmations will be sent to customers, including details like price. Localization is supported.
LiveRates
Kotlin Version of Currency application implemented using Clean Architecture + MVVM, RxJava 2, Dagger 2, Jetpack, Mockito, Espresso, Robolectric
Pets
Store pets information in a SQLite Database, including name, breed, gender and weight. Implemented ContentProvider to read(query), create(insert), update and delete all pets' information from the database. Implemented CursorAdapter to display all pets' information in the ListView of main screen. Add one pet information by clicking the floating button in the right bottom corner of main screen. Use Spinner to choose gender of a pet. Type in pet's name, breed and weight. Implemented Option Menu both in Main screen and Edit Screen. Implemented sanity check: Name cannot be empty. If breed is empty, display on the main screen "Unknown breed" instead of blank. If weight is empty, use default value 0 and store in the database. Otherwise a Toast message will be displayed. Click each pet item in the ListView of main screen to edit this pet's information. Toast message shows at the bottom to indicate user whether the saving or updating pet information is successful or not. Ask user confirmation before deleting a pet's or all pets' information. Warn user about losing unsaved changes. An empty state is implemented when there is no pets' information in the database. Also show a message in the empty view to instruct user how to start adding a pet's information into the database.
PopularMovies
Present users with a grid arrangement of movie posters upon launch. Allow users to change sort order via a setting: The sort order can be by most popular or by highest-rated (movie data fetched from the Internet with the MovieDB API) or by favorite movies (movie data fetched from the local database). Allow users to choose enabling offline use or not via a setting: When enabling offline use is checked, movie posters and movies' basic information will be saved to users' local app cache folder for future offline usage, and will be automatically updated approximately every 24 hours. Created three tables (Movie, Trailer, Review) in one local database. Implemented Content Provider to access the database to fetch favorite movies data. Allow users to tap on a movie poster and transition to a detail screen with additional information such as: original title / movie poster image thumbnail / a plot synopsis / user rating / release date / trailers / reviews. Allow users to view and play trailers via an Intent either to launch in Youtube app or a web browser (if Youtube app isn't installed on the user's phone). Allow users to mark a movie as a favorite in the details view by tapping the star floating action button. Allow users to delete a movie from the favorite movie database by tapping the star button again. Color grey on the star indicates the movie is not stored in the database. To display the details requires an API request. Color yellow on the star indicates the movie is stored in the database (including trailers and reviews). To display the details does not require an API request. Implemented sharing functionality to allow the user to share the first trailer's Youtube URL from the movie details screen. Allow users to interact with the app via a widget: When click the widget title, the app main screen opens directly. When click one of the widget movies' list, the clicked movie detail screen opens directly. Implemented deep links, so that when users go back from one movie's detail screen, it will come back to the app's main screen instead of jumping out of the app directly. Allow users to get a highest-rated popular movie notification every day. Incorporated libraries to simplify the amount of code, such as: Using Picasso to fetch images and load them into views. Using RecyclerView and ConstraintLayouts to implement efficient layout design. Used adapters and viewholders to populate list views. Used databinding to populate details views. Support custom layout-land design to use up white spaces when the phone is rotated to landscape mode. Support different dimensions on Android tablets. Support default language: English and another language: Chinese. Support accessibility for vision-limited users. Stored all the strings in string.xml. Stored all the dimens in dimens.xml.
StockHawk
Find stock prices from the Yahoo Finance API. Allow users to add stocks to track. A toast message will display when users search for a non-existent stock. Allow users to change stock change format via a menu item: The stock change format can be by "$" or "%". Each stock quote on the main screen is clickable and leads to a new screen which graphs the stock's value over time. Used external libraries, like MPAndroidChart to draw those history value charts. Created a collection widget which has a scrollable list. The title on the widget is clickable and leads to the app's main screen. Each item on the widget is clickable and leads to a detail page with its history value chart. Widget change accordingly when users add/delete stock quotes or change stock change format preference. Accessible to sight-impaired users. Support layout mirroring (RTL). Allow localization for distribution in other countries. Implemented Toolbar instead of using ActionBar by default.
UrsviksInventory
Allow Ursviks small store to keep track of its inventory of products by storing products information in a SQLite Database, including picture, name, price, supplier email and current quantity of products. Implemented ContentProvider to read(query), create(insert), update and delete all products' information from the database. Implemented CursorAdapter to display all products' information in the ListView of main screen. Add one product information by clicking the ADD button at the bottom of the main screen. Add or change product's picture by taking photo or choosing from library. Implemented Runtime Permission Handling for Android 6.0+ and Android API 23+. Also implemented Permission Handling for early versions of Android. Type in product's name, price, supplier email and current quantity. Implemented Option Menu both in Main screen and Edit Screen. Implemented sanity check: If picture is empty, the ImageView on the single item view is invisible. Name, price and current quantity cannot be empty. Supplier email must be valid if provided. Numbers cannot be negative. Otherwise a Toast message will be displayed. Click each product item in the ListView of main screen to edit this product's information. Toast message shows at the bottom to indicate user whether the saving or updating product information is successful or not. Track products' current quantities by tracking the number of sale products or receive products. Click the SALE button on each single item view to track the sale of one product and store the current quantity into the database. In the edit view, type in sale quantity or receive quantity to track large amount sale or receive. Toast message shows at the bottom if there are not enough products for sale. Click Order button in the edit mode to open the Email App to send an order email to the product's supplier using product's information in the database. Ask user confirmation before deleting a product's or all products' information. Warn user about losing unsaved changes. An empty state is implemented when there is no products' information in the database. Also show a message in the empty view to instruct user how to start adding a product's information into the database.
jinyanliu's Repositories
jinyanliu/aoc
50 stars collected for year 2020. 50 stars collected for year 2021.
jinyanliu/AboutMe
jinyanliu/and-nd-firebase-1.00-starting-point
jinyanliu/andfun-kotlin-android-trivia
jinyanliu/andfun-kotlin-dessert-pusher-master
Start code
jinyanliu/andfun-kotlin-gdg-finder
jinyanliu/andfun-kotlin-guess-it-starter-code
Starter code
jinyanliu/andfun-kotlin-mars-real-estate-Starter-Code
jinyanliu/andfun-kotlin-sleep-tracker-starter-code
jinyanliu/andfun-kotlin-sleep-tracker-with-recyclerview-starter-code
jinyanliu/animation-samples
Multiple samples showing the best practices in animation on Android.
jinyanliu/Bug-ConstraintLayoutRoomBugOnSamsung6
jinyanliu/Bug-MarginProblemOnDrawerLayoutOnAndroid6
jinyanliu/Bug-MaterialLibTextInputLayoutAutoScrollingIssue
jinyanliu/Bullseye
jinyanliu/CodeLabJetpackCompose
jinyanliu/CollapsingToolbar
CollapsingToolbarWithRecyclerView
jinyanliu/compose-samples
jinyanliu/Hello_Kotlin
jinyanliu/kattis
jinyanliu/KMPCourseDailyPulse
jinyanliu/KMPSample
jinyanliu/KotlinCoroutinesDeepDiveExperiments
jinyanliu/KotlinCoroutinesDispatchers
jinyanliu/KotlinCoroutinesQuizCodeSamples
jinyanliu/kotlinHero
jinyanliu/KotlinHeroes
jinyanliu/SharedFlow
jinyanliu/TestingKotlinCoroutines
jinyanliu/Yocipe