├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── values-b+it │ │ │ │ └── strings.xml │ │ │ ├── drawable │ │ │ │ ├── cartoon.png │ │ │ │ ├── ic_round_up.xml │ │ │ │ ├── ic_send.xml │ │ │ │ ├── ic_school_tutorial.xml │ │ │ │ ├── ic_store.xml │ │ │ │ ├── ic_add.xml │ │ │ │ ├── ic_boy.xml │ │ │ │ ├── ic_edit.xml │ │ │ │ ├── ic_navigate_next.xml │ │ │ │ ├── ic_about.xml │ │ │ │ ├── ic_girl.xml │ │ │ │ ├── ic_quiz_question_answer.xml │ │ │ │ ├── ic_message.xml │ │ │ │ ├── ic_quotes.xml │ │ │ │ ├── ic_thumbs_up.xml │ │ │ │ ├── ic_timer.xml │ │ │ │ ├── ic_contact_support.xml │ │ │ │ ├── ic_voice_call.xml │ │ │ │ ├── ic_price_euro.xml │ │ │ │ ├── ic_runner.xml │ │ │ │ ├── ic_family.xml │ │ │ │ ├── ic_discount.xml │ │ │ │ ├── ic_plants.xml │ │ │ │ ├── ic_filter_zone_plants.xml │ │ │ │ └── ic_kid.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── layout │ │ │ │ ├── activity_bubble.xml │ │ │ │ ├── fragment_people.xml │ │ │ │ ├── item_message.xml │ │ │ │ ├── fragment_photo.xml │ │ │ │ ├── activity_plants.xml │ │ │ │ ├── activity_quiz.xml │ │ │ │ ├── activity_lifecycle_demo.xml │ │ │ │ ├── fragment_main.xml │ │ │ │ ├── fragment_aboutinfo.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── activity_new_notes.xml │ │ │ │ ├── activity_drawer_base.xml │ │ │ │ ├── fragment_plants.xml │ │ │ │ ├── nav_header_layout.xml │ │ │ │ ├── activity_container_main_layout.xml │ │ │ │ ├── item_chat.xml │ │ │ │ ├── activity_notes.xml │ │ │ │ ├── activity_voice_call.xml │ │ │ │ ├── recycler_item_view.xml │ │ │ │ ├── fragment_quiz_result.xml │ │ │ │ ├── activity_quotes.xml │ │ │ │ ├── list_item_topic.xml │ │ │ │ ├── activity_people.xml │ │ │ │ ├── list_item_plant.xml │ │ │ │ ├── fragment_chat.xml │ │ │ │ └── activity_slot.xml │ │ │ ├── menu │ │ │ │ ├── options_menu.xml │ │ │ │ └── navdrawer_menu.xml │ │ │ ├── values-night │ │ │ │ └── themes.xml │ │ │ ├── navigation │ │ │ │ ├── quiz_nav_graph.xml │ │ │ │ └── main_nav_graph.xml │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── themes.xml │ │ │ │ ├── dimens.xml │ │ │ │ └── strings.xml │ │ │ └── animator │ │ │ │ └── shr_next_button_state_list_anim.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── niranjan │ │ │ │ └── androidtutorials │ │ │ │ ├── options │ │ │ │ ├── ContactsHelpFragment.kt │ │ │ │ └── AboutInfoFragment.kt │ │ │ │ ├── uimodel │ │ │ │ ├── GenericUiModel.kt │ │ │ │ ├── MainItemUiModel.kt │ │ │ │ └── TopicItemUiModel.kt │ │ │ │ ├── plants │ │ │ │ ├── model │ │ │ │ │ ├── GrowZone.kt │ │ │ │ │ └── Plants.kt │ │ │ │ ├── Utils.kt │ │ │ │ ├── view │ │ │ │ │ ├── PlantsActivity.kt │ │ │ │ │ ├── PlantDetailBindingAdapters.kt │ │ │ │ │ ├── MaskedCardView.kt │ │ │ │ │ └── PlantsAdapter.kt │ │ │ │ ├── db │ │ │ │ │ ├── PlantsDatabase.kt │ │ │ │ │ └── PlantsDao.kt │ │ │ │ ├── viewmodel │ │ │ │ │ └── Injector.kt │ │ │ │ └── network │ │ │ │ │ └── NetworkService.kt │ │ │ │ ├── quiz │ │ │ │ ├── QuizUiModel.kt │ │ │ │ ├── QuizResultFragment.kt │ │ │ │ └── QuizActivity.kt │ │ │ │ ├── AndroidConcepts.kt │ │ │ │ ├── slot │ │ │ │ ├── SlotData.kt │ │ │ │ └── SlotActivity.kt │ │ │ │ ├── quotes │ │ │ │ ├── network │ │ │ │ │ ├── Executors.kt │ │ │ │ │ ├── QuotesNetwork.kt │ │ │ │ │ ├── RefreshMainDataWork.kt │ │ │ │ │ └── SkipNetworkInterceptor.kt │ │ │ │ ├── viewmodel │ │ │ │ │ └── ViewModelHelpers.kt │ │ │ │ ├── db │ │ │ │ │ └── QuotesDatabase.kt │ │ │ │ └── view │ │ │ │ │ └── QuotesActivity.kt │ │ │ │ ├── runner │ │ │ │ ├── StopWatchViewModel.kt │ │ │ │ ├── RunnerLocationManager.kt │ │ │ │ └── RunnerActivity.kt │ │ │ │ ├── people │ │ │ │ └── PeopleActivity.kt │ │ │ │ ├── notes │ │ │ │ ├── db │ │ │ │ │ ├── NotesEntity.kt │ │ │ │ │ ├── NotesDao.kt │ │ │ │ │ └── NotesDatabase.kt │ │ │ │ ├── model │ │ │ │ │ └── NotesRepository.kt │ │ │ │ ├── view │ │ │ │ │ ├── NewNotesActivity.kt │ │ │ │ │ ├── NotesAdapter.kt │ │ │ │ │ └── NotesActivity.kt │ │ │ │ └── viewmodel │ │ │ │ │ └── NotesViewModel.kt │ │ │ │ ├── MainFragment.kt │ │ │ │ ├── TutorialApplication.kt │ │ │ │ ├── kotlin │ │ │ │ ├── KotlinRunnerClass.kt │ │ │ │ ├── KotlinInterfaceConcept.kt │ │ │ │ ├── KotlinInheritanceConcepts.kt │ │ │ │ ├── KotlinFunctionConcepts.kt │ │ │ │ └── KotlinClassConcepts.kt │ │ │ │ ├── foto │ │ │ │ └── workers │ │ │ │ │ ├── CleanupWorker.kt │ │ │ │ │ ├── SyncPlantsImagesWorker.kt │ │ │ │ │ ├── SaveImageToFileWorker.kt │ │ │ │ │ └── BlurWorker.kt │ │ │ │ ├── MainConstants.kt │ │ │ │ ├── lifecycle │ │ │ │ ├── LifecycleDemoFragment.kt │ │ │ │ └── LifecycleDemoActivity.kt │ │ │ │ ├── price │ │ │ │ └── PriceCalculatorActivity.kt │ │ │ │ ├── MainAdapter.kt │ │ │ │ ├── DummyData.kt │ │ │ │ └── MainActivity.kt │ │ ├── assets │ │ │ └── custom_plant_sort_order.json │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── niranjan │ │ │ └── androidtutorials │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── com │ │ └── niranjan │ │ └── androidtutorials │ │ └── ExampleInstrumentedTest.kt ├── proguard-rules.pro └── build.gradle ├── .idea ├── .name ├── .gitignore ├── codeStyles │ ├── codeStyleConfig.xml │ └── Project.xml ├── compiler.xml ├── kotlinc.xml ├── vcs.xml ├── inspectionProfiles │ └── Project_Default.xml ├── gradle.xml └── misc.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── settings.gradle ├── gradle.properties ├── gradlew.bat └── README.md /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | AndroidTutorials -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-b+it/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/cartoon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/drawable/cartoon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/options/ContactsHelpFragment.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.options 2 | 3 | class ContactsHelpFragment { 4 | } -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niranjk/android_tutorial/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/uimodel/GenericUiModel.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.uimodel 2 | 3 | open class GenericUiModel( 4 | val key: Int = 0 5 | ) 6 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/assets/custom_plant_sort_order.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"plantId": "citrus-x-sinensis"}, 3 | {"plantId": "helianthus-annuus"}, 4 | {"plantId": "vitis-vinifera"}, 5 | {"plantId": "persea-americana"} 6 | ] -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/uimodel/MainItemUiModel.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.uimodel 2 | 3 | data class MainItemUiModel( 4 | val title: String = "" 5 | ): GenericUiModel() 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/plants/model/GrowZone.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.plants.model 2 | 3 | @JvmInline 4 | value class GrowZone(val number: Int) 5 | val NoGrowZone = GrowZone(-1) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/uimodel/TopicItemUiModel.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.uimodel 2 | 3 | data class TopicItemUiModel( 4 | val topics: String = "" 5 | ): GenericUiModel() 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/quiz/QuizUiModel.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.quiz 2 | 3 | data class QuizUiModel( 4 | var question: String = "", 5 | var answers: List = listOf() 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/AndroidConcepts.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials 2 | 3 | sealed class AndroidConcepts { 4 | object Topics : AndroidConcepts() 5 | object Description : AndroidConcepts() 6 | } -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/slot/SlotData.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.slot 2 | 3 | data class SlotData( 4 | var firstSlot: String, 5 | var secondSlot: String, 6 | var thirdSlot: String, 7 | ) 8 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Oct 16 06:44:59 CEST 2022 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/quotes/network/Executors.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.quotes.network 2 | 3 | import java.util.concurrent.Executors 4 | 5 | /** 6 | * An executor service that can run [Runnable]s off the main thread. 7 | */ 8 | val BACKGROUND = Executors.newFixedThreadPool(2) -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 3 | repositories { 4 | google() 5 | mavenCentral() 6 | jcenter() // Warning: this repository is going to shut down soon 7 | } 8 | } 9 | rootProject.name = "AndroidTutorials" 10 | include ':app' 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_bubble.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_round_up.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_send.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/runner/StopWatchViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.runner 2 | 3 | import androidx.lifecycle.ViewModel 4 | 5 | class StopWatchViewModel : ViewModel() { 6 | 7 | private var mStartTime: Long? = null 8 | 9 | fun getStartTime(): Long? = mStartTime 10 | fun setStartTime(value: Long){ 11 | mStartTime = value 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_school_tutorial.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_store.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_boy.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_navigate_next.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_about.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_girl.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_quiz_question_answer.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_message.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_quotes.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/people/PeopleActivity.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.people 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import com.niranjan.androidtutorials.R 6 | 7 | class PeopleActivity : AppCompatActivity(R.layout.activity_people) { 8 | 9 | companion object { 10 | private const val FRAGMENT_CHAT = "chat" 11 | } 12 | 13 | override fun onCreate(savedInstanceState: Bundle?) { 14 | super.onCreate(savedInstanceState) 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/plants/Utils.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.plants 2 | 3 | data class ComparablePair, B : Comparable>( 4 | val first: A, 5 | val second: B 6 | ) : Comparable> { 7 | override fun compareTo(other: ComparablePair): Int { 8 | val firstComp = this.first.compareTo(other.first) 9 | if (firstComp != 0) { 10 | return firstComp 11 | } 12 | return this.second.compareTo(other.second) 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_people.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_thumbs_up.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_timer.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_photo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | -------------------------------------------------------------------------------- /app/src/test/java/com/niranjan/androidtutorials/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | * See [https://developer.android.com/training/testing] for Testing Android App 12 | * See [https://mockk.io] for mocking in Kotlin 13 | */ 14 | class ExampleUnitTest { 15 | @Test 16 | fun addition_isCorrect() { 17 | assertEquals(4, 2 + 2) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/plants/model/Plants.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.plants.model 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | @Entity(tableName = "plants_db") 8 | data class Plants( 9 | @PrimaryKey @ColumnInfo(name = "id") val plantId: String, 10 | val name: String, 11 | val description: String, 12 | val growZoneNumber: Int, 13 | val wateringInterval: Int = 7, // how often the plant should be watered, in days 14 | val imageUrl: String = "" 15 | ){ 16 | override fun toString() = name 17 | } 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_contact_support.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_voice_call.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/notes/db/NotesEntity.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.notes.db 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | /*** 8 | * Room creates tables via a Entity. 9 | * Entity : is an Annotated class that describes a database table 10 | * when working with Room. 11 | */ 12 | @Entity(tableName = "notes_table") 13 | data class NotesEntity( 14 | /** 15 | * Each property in the class will represent a 16 | * column in the table. 17 | */ 18 | @PrimaryKey(autoGenerate = true) 19 | val id: Int = 0, 20 | @ColumnInfo(name = "note") 21 | val note: String 22 | ) 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_price_euro.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_runner.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_plants.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/plants/view/PlantsActivity.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.plants.view 2 | 3 | import android.os.Bundle 4 | import com.niranjan.androidtutorials.R 5 | import com.niranjan.androidtutorials.databinding.ActivityPlantsBinding 6 | import com.niranjan.androidtutorials.drawer.DrawerBaseActivity 7 | 8 | class PlantsActivity : DrawerBaseActivity(){ 9 | lateinit var binding: ActivityPlantsBinding 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | binding = ActivityPlantsBinding.inflate(layoutInflater) 14 | setContentView(binding.root) 15 | allocateActivityTitle(getString(R.string.label_plants_app)) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/MainFragment.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials 2 | 3 | import android.os.Bundle 4 | import android.view.* 5 | import androidx.databinding.DataBindingUtil 6 | import androidx.fragment.app.Fragment 7 | import com.niranjan.androidtutorials.databinding.FragmentMainBinding 8 | 9 | class MainFragment : Fragment() { 10 | 11 | lateinit var mainBinding: FragmentMainBinding 12 | 13 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { 14 | mainBinding = DataBindingUtil.inflate( 15 | inflater, 16 | R.layout.fragment_main, 17 | container, 18 | false 19 | ) 20 | return mainBinding.root 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_family.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/com/niranjan/androidtutorials/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.niranjan.androidtutorials", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_quiz.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_discount.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/TutorialApplication.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials 2 | 3 | import android.app.Application 4 | import com.niranjan.androidtutorials.notes.db.NotesDatabase 5 | import com.niranjan.androidtutorials.notes.model.NotesRepository 6 | import kotlinx.coroutines.CoroutineScope 7 | import kotlinx.coroutines.SupervisorJob 8 | 9 | class TutorialApplication : Application() { 10 | // this scope will be torn down with the process 11 | val applicationScope = CoroutineScope(SupervisorJob()) 12 | /*** 13 | * Lazily create database and repository so that the instance is created 14 | * when needed rather than when application starts 15 | */ 16 | val notesDatabase by lazy { 17 | NotesDatabase.getDatabase(this, applicationScope) 18 | } 19 | val notesRepository by lazy { 20 | NotesRepository(notesDatabase.notesDao()) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/res/menu/options_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/kotlin/KotlinRunnerClass.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.kotlin 2 | 3 | /*** 4 | * ####################################### 5 | * KOTLIN OBJECT ORIENTED CONCEPTS TUTORIAL 6 | * ####################################### 7 | */ 8 | 9 | 10 | // Interface 11 | 12 | fun main() { 13 | 14 | } 15 | 16 | interface MyInterface { 17 | // contract property and methods 18 | val color: String 19 | val value: Int 20 | fun isExpensive(): Boolean 21 | } 22 | 23 | class MyClassWithInterface : MyInterface{ 24 | 25 | override val color: String = "Blue" 26 | 27 | override val value: Int = 123000 28 | 29 | override fun isExpensive(): Boolean { 30 | if (value> 100000){ 31 | return true 32 | println("Oh its expensive!") 33 | }else { 34 | return false 35 | println("Its cheap") 36 | } 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_plants.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/options/AboutInfoFragment.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.options 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.databinding.DataBindingUtil 8 | import androidx.fragment.app.Fragment 9 | import com.niranjan.androidtutorials.R 10 | import com.niranjan.androidtutorials.databinding.FragmentAboutinfoBinding 11 | 12 | class AboutInfoFragment : Fragment(){ 13 | 14 | lateinit var fragmentAboutinfoBinding: FragmentAboutinfoBinding 15 | 16 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { 17 | fragmentAboutinfoBinding = DataBindingUtil.inflate( 18 | inflater, 19 | R.layout.fragment_aboutinfo, 20 | container, 21 | false 22 | ) 23 | return fragmentAboutinfoBinding.root 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_lifecycle_demo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/kotlin/KotlinInterfaceConcept.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.kotlin 2 | 3 | // INTERFACE 4 | interface Fruit { 5 | // Interface provides the contract properties and methods 6 | val color: String 7 | val weight: Double 8 | val price : Int 9 | fun isExpensive(): Boolean 10 | } 11 | // Interface can also extend other interfaces 12 | interface Market: Business { 13 | val quantity: Int 14 | fun isSold(): Boolean 15 | } 16 | interface Business { 17 | fun isProfit(): Boolean 18 | } 19 | // a class can implement multiple interfaces 20 | class Apple : Fruit, Market { 21 | // each class implementing interface must implement all contact methods and properties 22 | override val color: String = "red" 23 | override val weight: Double = 2.0 24 | override val price: Int = 5 25 | override fun isExpensive() : Boolean = price > 10 26 | override val quantity: Int = 20 27 | override fun isSold() = quantity==0 28 | override fun isProfit() = isSold() 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/notes/db/NotesDao.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.notes.db 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | 8 | 9 | import kotlinx.coroutines.flow.Flow 10 | 11 | /*** 12 | * Flow is an async sequence of values 13 | * Flow produces values one at a time(instead of all at once) that can generate values 14 | * from async operations like network requests, database calls, or other async code. 15 | * Flow support coroutines, so you can transform flow using coroutines also. 16 | */ 17 | interface NotesInterface { 18 | fun getNotes(): Flow> 19 | } 20 | 21 | @Dao 22 | interface NotesDao { 23 | @Query("SELECT * FROM notes_table ORDER BY note ASC") 24 | fun getNotes(): Flow> 25 | @Insert(onConflict = OnConflictStrategy.IGNORE) 26 | suspend fun insert(notesEntity: NotesEntity) 27 | @Query("DELETE FROM notes_table") 28 | suspend fun deleteAll() 29 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/niranjan/androidtutorials/plants/view/PlantDetailBindingAdapters.kt: -------------------------------------------------------------------------------- 1 | package com.niranjan.androidtutorials.plants.view 2 | 3 | import android.widget.ImageView 4 | import android.widget.TextView 5 | import androidx.databinding.BindingAdapter 6 | import coil.Coil 7 | import coil.ImageLoader 8 | import coil.load 9 | import com.google.android.material.floatingactionbutton.FloatingActionButton 10 | import java.util.Random 11 | 12 | @BindingAdapter("imageFromUrl") 13 | fun bindImageFromUrl(view: ImageView, imageUrl: String?) { 14 | if (!imageUrl.isNullOrEmpty()) { 15 | view.load(imageUrl) 16 | Coil.setImageLoader(ImageLoader(view.context)) 17 | } 18 | } 19 | 20 | @BindingAdapter("isGone") 21 | fun bindIsGone(view: FloatingActionButton, isGone: Boolean?) { 22 | if (isGone == null || isGone) { 23 | view.hide() 24 | } else { 25 | view.show() 26 | } 27 | } 28 | 29 | 30 | @BindingAdapter("randomNumber") 31 | fun TextView.setRandomNumber(isRandom: Boolean){ 32 | text = if (isRandom) Random().nextInt().toString() else "0" 33 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_aboutinfo.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_filter_zone_plants.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | 11 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_new_notes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 16 | 17 |