From e23b74792d2f3161de3cae2ac32e4a480d04d597 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Tue, 2 Apr 2019 16:38:45 +0300 Subject: [PATCH] Fix Java sources inspected too early in Android variants (KT-30735) The Android Gradle plugin can set Java sources after a variant is created, similar to AP options. We need to inspect the Java sources only from at `afterEvaluate` time. Issue #KT-30735 Fixed --- .../jetbrains/kotlin/gradle/Kapt3AndroidIT.kt | 10 ++ .../build.gradle | 81 ++++++++++++ .../gradle.properties | 21 ++++ .../proguard-rules.pro | 17 +++ .../src/main/AndroidManifest.xml | 24 ++++ .../navigation/DestinationFragment1.kt | 100 +++++++++++++++ .../navigation/DestinationFragment2.kt | 100 +++++++++++++++ .../test/androidx/navigation/MainActivity.kt | 101 +++++++++++++++ .../test/androidx/navigation/StartFragment.kt | 116 ++++++++++++++++++ .../drawable-v24/ic_launcher_foreground.xml | 34 +++++ .../res/drawable/ic_launcher_background.xml | 74 +++++++++++ .../src/main/res/drawable/ic_menu_camera.xml | 12 ++ .../src/main/res/drawable/ic_menu_gallery.xml | 9 ++ .../src/main/res/drawable/ic_menu_manage.xml | 9 ++ .../src/main/res/drawable/ic_menu_send.xml | 9 ++ .../src/main/res/drawable/ic_menu_share.xml | 9 ++ .../main/res/drawable/ic_menu_slideshow.xml | 9 ++ .../src/main/res/drawable/side_nav_bar.xml | 9 ++ .../src/main/res/layout/activity_main.xml | 26 ++++ .../src/main/res/layout/app_bar_main.xml | 34 +++++ .../src/main/res/layout/content_main.xml | 22 ++++ .../layout/fragment_destination_fragment1.xml | 14 +++ .../layout/fragment_destination_fragment2.xml | 14 +++ .../src/main/res/layout/fragment_start.xml | 27 ++++ .../src/main/res/layout/nav_header_main.xml | 37 ++++++ .../main/res/menu/activity_main_drawer.xml | 38 ++++++ .../src/main/res/menu/main.xml | 8 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes .../src/main/res/navigation/nav_graph.xml | 22 ++++ .../src/main/res/values-v21/styles.xml | 7 ++ .../src/main/res/values/colors.xml | 6 + .../src/main/res/values/dimens.xml | 8 ++ .../src/main/res/values/strings.xml | 19 +++ .../src/main/res/values/styles.xml | 17 +++ .../kotlin/gradle/plugin/KotlinPlugin.kt | 30 +++-- 38 files changed, 1076 insertions(+), 7 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/proguard-rules.pro create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/AndroidManifest.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/DestinationFragment1.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/DestinationFragment2.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/MainActivity.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/StartFragment.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_launcher_background.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_camera.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_gallery.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_manage.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_send.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_share.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_slideshow.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/side_nav_bar.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/activity_main.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/app_bar_main.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/content_main.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_destination_fragment1.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_destination_fragment2.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_start.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/nav_header_main.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/menu/activity_main_drawer.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/menu/main.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/navigation/nav_graph.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/values-v21/styles.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/values/colors.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/values/dimens.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/values/strings.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/values/styles.xml diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndroidIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndroidIT.kt index 561cc39b60c..a9533e17663 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndroidIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndroidIT.kt @@ -26,6 +26,16 @@ open class Kapt3Android33IT : Kapt3AndroidIT() { override val defaultGradleVersion: GradleVersionRequired get() = GradleVersionRequired.AtLeast("5.2") + + @Test + fun testAndroidxNavigationSafeArgs() = with(Project("androidx-navigation-safe-args", directoryPrefix = "kapt2")) { + // KT-30735 + build("assembleDebug") { + assertSuccessful() + assertFileExists("build/generated/source/navigation-args/debug/test/androidx/navigation/StartFragmentDirections.java") + assertFileExists("build/tmp/kotlin-classes/debug/test/androidx/navigation/StartFragmentKt.class") + } + } } class Kapt3Android31IT : Kapt3AndroidIT() { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/build.gradle new file mode 100644 index 00000000000..ae49c50c08f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/build.gradle @@ -0,0 +1,81 @@ +buildscript { + repositories { + mavenLocal() + maven { url 'https://maven.google.com' } + jcenter() + } + dependencies { + classpath "com.android.tools.build:gradle:$android_tools_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0-alpha01" + } +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-kapt' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'androidx.navigation.safeargs' + +android { + compileSdkVersion 28 + buildToolsVersion "28.0.3" + defaultConfig { + applicationId 'test.androidx.navigation' + minSdkVersion 14 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + } + + buildTypes { + release { + minifyEnabled false + } + } + + dexOptions { + incremental false + } + + packagingOptions { + // Workaround for org.jetbrains.kotlin.gradle.Kapt3Android33IT#testRealm + // Android Plugin 3.3.2 fails with: + // Execution failed for task ':transformResourcesWithMergeJavaResForDebug'. + // com.android.builder.merge.DuplicateRelativeFileException: (these appear one by one if you exclude single files) + // - More than one file was found with OS independent path 'kotlin/reflect/reflect.kotlin_builtins' + // - More than one file was found with OS independent path 'kotlin/coroutines/coroutines.kotlin_builtins' + // - More than one file was found with OS independent path 'kotlin/collections/collections.kotlin_builtins' + // - More than one file was found with OS independent path 'kotlin/internal/internal.kotlin_builtins' + // (maybe more) + exclude '**/*.kotlin_builtins' + } +} + +repositories { + mavenLocal() + maven { url 'https://maven.google.com' } + maven { + url 'https://oss.jfrog.org/artifactory/oss-snapshot-local' + } + mavenCentral() +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.1.0-alpha03' + implementation 'androidx.core:core-ktx:1.1.0-alpha05' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'com.google.android.material:material:1.1.0-alpha05' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3' + + def nav_version = "2.1.0-alpha01" + + implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" + implementation "androidx.navigation:navigation-ui-ktx:$nav_version" + + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/gradle.properties new file mode 100644 index 00000000000..23339e0df69 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/proguard-rules.pro b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/proguard-rules.pro new file mode 100644 index 00000000000..200fdffd581 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/22.6.2/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..6a5543896d9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/DestinationFragment1.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/DestinationFragment1.kt new file mode 100644 index 00000000000..97273e4a7b5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/DestinationFragment1.kt @@ -0,0 +1,100 @@ +package test.androidx.navigation + +import android.content.Context +import android.net.Uri +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Activities that contain this fragment must implement the + * [DestinationFragment1.OnFragmentInteractionListener] interface + * to handle interaction events. + * Use the [DestinationFragment1.newInstance] factory method to + * create an instance of this fragment. + */ +class DestinationFragment1 : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + private var listener: OnFragmentInteractionListener? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_destination_fragment1, container, false) + } + + // TODO: Rename method, update argument and hook method into UI event + fun onButtonPressed(uri: Uri) { + listener?.onFragmentInteraction(uri) + } + + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is OnFragmentInteractionListener) { + listener = context + } else { + throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener") + } + } + + override fun onDetach() { + super.onDetach() + listener = null + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + * + * + * See the Android Training lesson [Communicating with Other Fragments] + * (http://developer.android.com/training/basics/fragments/communicating.html) + * for more information. + */ + interface OnFragmentInteractionListener { + // TODO: Update argument type and name + fun onFragmentInteraction(uri: Uri) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment DestinationFragment1. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + DestinationFragment1().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/DestinationFragment2.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/DestinationFragment2.kt new file mode 100644 index 00000000000..a261ec1348b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/DestinationFragment2.kt @@ -0,0 +1,100 @@ +package test.androidx.navigation + +import android.content.Context +import android.net.Uri +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Activities that contain this fragment must implement the + * [DestinationFragment2.OnFragmentInteractionListener] interface + * to handle interaction events. + * Use the [DestinationFragment2.newInstance] factory method to + * create an instance of this fragment. + */ +class DestinationFragment2 : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + private var listener: OnFragmentInteractionListener? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_destination_fragment2, container, false) + } + + // TODO: Rename method, update argument and hook method into UI event + fun onButtonPressed(uri: Uri) { + listener?.onFragmentInteraction(uri) + } + + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is OnFragmentInteractionListener) { + listener = context + } else { + throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener") + } + } + + override fun onDetach() { + super.onDetach() + listener = null + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + * + * + * See the Android Training lesson [Communicating with Other Fragments] + * (http://developer.android.com/training/basics/fragments/communicating.html) + * for more information. + */ + interface OnFragmentInteractionListener { + // TODO: Update argument type and name + fun onFragmentInteraction(uri: Uri) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment DestinationFragment2. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + DestinationFragment2().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/MainActivity.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/MainActivity.kt new file mode 100644 index 00000000000..7d59eeda78c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/MainActivity.kt @@ -0,0 +1,101 @@ +package test.androidx.navigation + +import android.net.Uri +import android.os.Bundle +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.google.android.material.snackbar.Snackbar +import androidx.core.view.GravityCompat +import androidx.appcompat.app.ActionBarDrawerToggle +import android.view.MenuItem +import androidx.drawerlayout.widget.DrawerLayout +import com.google.android.material.navigation.NavigationView +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar +import android.view.Menu +// import androidx.databinding.DataBindingUtil.setContentView + +class MainActivity : AppCompatActivity(), + NavigationView.OnNavigationItemSelectedListener, + StartFragment.OnFragmentInteractionListener, + DestinationFragment1.OnFragmentInteractionListener, + DestinationFragment2.OnFragmentInteractionListener +{ + override fun onFragmentInteraction(uri: Uri) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + val toolbar: Toolbar = findViewById(R.id.toolbar) + setSupportActionBar(toolbar) + + val fab: FloatingActionButton = findViewById(R.id.fab) + fab.setOnClickListener { view -> + Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) + .setAction("Action", null).show() + } + val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout) + val navView: NavigationView = findViewById(R.id.nav_view) + val toggle = ActionBarDrawerToggle( + this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close + ) + drawerLayout.addDrawerListener(toggle) + toggle.syncState() + + navView.setNavigationItemSelectedListener(this) + } + + override fun onBackPressed() { + val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout) + if (drawerLayout.isDrawerOpen(GravityCompat.START)) { + drawerLayout.closeDrawer(GravityCompat.START) + } else { + super.onBackPressed() + } + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + // Inflate the menu; this adds items to the action bar if it is present. + menuInflater.inflate(R.menu.main, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + return when (item.itemId) { + R.id.action_settings -> true + else -> super.onOptionsItemSelected(item) + } + } + + override fun onNavigationItemSelected(item: MenuItem): Boolean { + // Handle navigation view item clicks here. + when (item.itemId) { + R.id.nav_home -> { + // Handle the camera action + } + R.id.nav_gallery -> { + + } + R.id.nav_slideshow -> { + + } + R.id.nav_tools -> { + + } + R.id.nav_share -> { + + } + R.id.nav_send -> { + + } + } + val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout) + drawerLayout.closeDrawer(GravityCompat.START) + return true + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/StartFragment.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/StartFragment.kt new file mode 100644 index 00000000000..357134f964b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/java/test/androidx/navigation/StartFragment.kt @@ -0,0 +1,116 @@ +package test.androidx.navigation + +import android.content.Context +import android.net.Uri +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController +import kotlinx.android.synthetic.main.fragment_start.* +import kotlinx.android.synthetic.main.fragment_start.view.* + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Activities that contain this fragment must implement the + * [StartFragment.OnFragmentInteractionListener] interface + * to handle interaction events. + * Use the [StartFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class StartFragment : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + private var listener: OnFragmentInteractionListener? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + + val inf = inflater.inflate(R.layout.fragment_start,container,false) + + inf.button.setOnClickListener { + it.findNavController().navigate(StartFragmentDirections.actionStartFragmentToDestinationFragment1()) + } + + inf.button2.setOnClickListener { + it.findNavController().navigate(StartFragmentDirections.actionStartFragmentToDestinationFragment2()) + } + + return inf + + } + + // TODO: Rename method, update argument and hook method into UI event + fun onButtonPressed(uri: Uri) { + listener?.onFragmentInteraction(uri) + } + + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is OnFragmentInteractionListener) { + listener = context + } else { + throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener") + } + } + + override fun onDetach() { + super.onDetach() + listener = null + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + * + * + * See the Android Training lesson [Communicating with Other Fragments] + * (http://developer.android.com/training/basics/fragments/communicating.html) + * for more information. + */ + interface OnFragmentInteractionListener { + // TODO: Update argument type and name + fun onFragmentInteraction(uri: Uri) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment StartFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + StartFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable-v24/ic_launcher_foreground.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000000..6348baae395 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_launcher_background.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000000..a0ad202f9e3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_camera.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_camera.xml new file mode 100644 index 00000000000..41688d5c0c9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_camera.xml @@ -0,0 +1,12 @@ + + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_gallery.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_gallery.xml new file mode 100644 index 00000000000..ff8ce529f11 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_gallery.xml @@ -0,0 +1,9 @@ + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_manage.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_manage.xml new file mode 100644 index 00000000000..a0e423cd0e0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_manage.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_send.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_send.xml new file mode 100644 index 00000000000..9745066f1d5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_send.xml @@ -0,0 +1,9 @@ + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_share.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_share.xml new file mode 100644 index 00000000000..b3e39e222bc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_slideshow.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_slideshow.xml new file mode 100644 index 00000000000..ae51e494a9a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/ic_menu_slideshow.xml @@ -0,0 +1,9 @@ + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/side_nav_bar.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 00000000000..a33798b60a8 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/activity_main.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000000..ac9a123b384 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/activity_main.xml @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/app_bar_main.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/app_bar_main.xml new file mode 100644 index 00000000000..23959122347 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/app_bar_main.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/content_main.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/content_main.xml new file mode 100644 index 00000000000..19af11a6f4c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/content_main.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_destination_fragment1.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_destination_fragment1.xml new file mode 100644 index 00000000000..09d91c44272 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_destination_fragment1.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_destination_fragment2.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_destination_fragment2.xml new file mode 100644 index 00000000000..ce1b0bd4c1e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_destination_fragment2.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_start.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_start.xml new file mode 100644 index 00000000000..866e9d6382b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/androidx-navigation-safe-args/src/main/res/layout/fragment_start.xml @@ -0,0 +1,27 @@ + + + + + +