diff --git a/.github/scripts/gradlew_recursive.sh b/.github/scripts/gradlew_recursive.sh new file mode 100755 index 00000000..e554ee8c --- /dev/null +++ b/.github/scripts/gradlew_recursive.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -xe + +# Default Gradle settings are not optimal for Android builds, override them +# here to make the most out of the GitHub Actions build servers +GRADLE_OPTS="$GRADLE_OPTS -Xms4g -Xmx4g" +GRADLE_OPTS="$GRADLE_OPTS -XX:+HeapDumpOnOutOfMemoryError" +GRADLE_OPTS="$GRADLE_OPTS -Dorg.gradle.daemon=false" +GRADLE_OPTS="$GRADLE_OPTS -Dorg.gradle.workers.max=2" +GRADLE_OPTS="$GRADLE_OPTS -Dkotlin.incremental=false" +GRADLE_OPTS="$GRADLE_OPTS -Dkotlin.compiler.execution.strategy=in-process" +GRADLE_OPTS="$GRADLE_OPTS -Dfile.encoding=UTF-8" +export GRADLE_OPTS + +# Crawl all gradlew files which indicate an Android project +# You may edit this if your repo has a different project structure +for GRADLEW in `find . -name "gradlew"` ; do + SAMPLE=$(dirname "${GRADLEW}") + # Tell Gradle that this is a CI environment and disable parallel compilation + bash "$GRADLEW" -p "$SAMPLE" -Pci --no-parallel --stacktrace $@ +done diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 00000000..d8d296de --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,43 @@ +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Android CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + + build: + name: Build + runs-on: ubuntu-18.04 + + steps: + - uses: actions/checkout@v1 + - name: set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build project + run: .github/scripts/gradlew_recursive.sh assembleDebug + - name: Zip artifacts + run: zip -r assemble.zip . -i '**/build/*.apk' '**/build/*.aab' '**/build/*.aar' '**/build/*.so' + - name: Upload artifacts + uses: actions/upload-artifact@v1 + with: + name: assemble + path: assemble.zip diff --git a/.github/workflows/copy-branch.yml b/.github/workflows/copy-branch.yml new file mode 100644 index 00000000..f8f8572d --- /dev/null +++ b/.github/workflows/copy-branch.yml @@ -0,0 +1,31 @@ +# Duplicates default main branch to the old master branch + +name: Duplicates main to old master branch + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the main branch +on: + push: + branches: [ main ] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "copy-branch" + copy-branch: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it, + # but specifies master branch (old default). + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: master + + - run: | + git config user.name github-actions + git config user.email github-actions@github.com + git merge origin/main + git push diff --git a/README.markdown b/README.markdown index 0fdb5648..75740021 100644 --- a/README.markdown +++ b/README.markdown @@ -27,7 +27,7 @@ tests](http://google.github.io/android-testing-support-library) which can be executed with the `connectedAndroidTest` gradle task. You can read more about the project on the [Android Developers -blog](http://android-developers.blogspot.co.uk/2015/06/more-material-design-with-topeka-for_16.html). +blog](https://android-developers.googleblog.com/2015/06/more-material-design-with-topeka-for.html). ### Screenshots @@ -43,7 +43,7 @@ to get an overview of all the tasks available for this project. Some important tasks are: ``` -assembleDebug - Assembles all Debug builds. +bundleDebug - Assembles all Debug builds. installDebug - Installs the Debug build. connectedAndroidTest - Installs and runs the tests for Debug build on connected devices. @@ -52,8 +52,6 @@ test - Run all unit tests. ### Support -- Google+ Community: https://plus.google.com/communities/105153134372062985968 - - Stack Overflow: http://stackoverflow.com/questions/tagged/android If you've found an error in this sample, please file an issue: diff --git a/installed/build.gradle b/app/build.gradle similarity index 73% rename from installed/build.gradle rename to app/build.gradle index ea1a27c2..146ab35a 100644 --- a/installed/build.gradle +++ b/app/build.gradle @@ -15,28 +15,26 @@ */ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' android { compileSdkVersion rootProject.compileSdk defaultConfig { - targetSdkVersion rootProject.compileSdk + targetSdkVersion rootProject.targetSdk minSdkVersion rootProject.minSdk - missingDimensionStrategy 'delivery', 'installed' + versionCode 1 } buildTypes { release { - minifyEnabled true signingConfig signingConfigs.debug - proguardFiles getDefaultProguardFile("proguard-android.txt") } } + dynamicFeatures = [":categories", ":quiz"] } dependencies { - implementation project(':base') - implementation project(':categories') - implementation project(':quiz') + implementation project(":base") } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..5b820c2a --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/base/build.gradle b/base/build.gradle index e412babd..a7367b2f 100644 --- a/base/build.gradle +++ b/base/build.gradle @@ -14,81 +14,49 @@ * limitations under the License. */ -apply plugin: 'com.android.feature' +apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - buildToolsVersion rootProject.buildTools compileSdkVersion rootProject.compileSdk - baseFeature true - defaultConfig { minSdkVersion rootProject.minSdk targetSdkVersion rootProject.targetSdk - versionCode 1 versionName "1.0" - testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { - minifyEnabled true signingConfig signingConfigs.debug - proguardFiles getDefaultProguardFile("proguard-android.txt"), "../instant/proguard.pro" } } - packagingOptions { - pickFirst 'LICENSE.txt' - pickFirst 'protobuf.meta' - } - - flavorDimensions 'delivery' - - productFlavors { - instant { - dimension 'delivery' - minSdkVersion rootProject.minSdkInstant - } - installed { - dimension 'delivery' - } - } - - generatePureSplits true - - splits { - density { - enable true - } - } } dependencies { - application project(':installed') - feature project(':categories') - feature project(':quiz') - api "com.android.support:appcompat-v7:$supportLibVersion" - api "com.android.support:design:$supportLibVersion" - api "com.android.support:support-v4:$supportLibVersion" + api 'androidx.appcompat:appcompat:1.1.0' + api 'com.google.android.material:material:1.1.0' + api 'androidx.legacy:legacy-support-v4:1.0.0' api 'com.google.android.instantapps:instantapps:1.1.0' - api "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + api "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation "com.google.android.gms:play-services-auth:$playServicesAuthVersion" + implementation "com.google.android.gms:play-services-auth:17.0.0" - testImplementation "junit:junit:$junitVersion" + testImplementation "junit:junit:4.12" - androidTestImplementation("com.android.support.test.espresso:espresso-core:$espressoVersion") { + androidTestImplementation('androidx.test.espresso:espresso-core:3.2.0') { exclude module: "espresso-idling-resource" } - androidTestImplementation("com.android.support.test.espresso:espresso-contrib:$espressoVersion") { + androidTestImplementation('androidx.test.espresso:espresso-contrib:3.2.0') { exclude module: "espresso-core" } - androidTestImplementation "com.android.support.test:rules:$androidTestVersion" - androidTestImplementation "com.android.support.test:runner:$androidTestVersion" - androidTestImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" + androidTestImplementation 'androidx.test:rules:1.2.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation "com.google.android.gms:play-services-auth:17.0.0" + androidTestImplementation "org.hamcrest:hamcrest-core:1.3" } diff --git a/base/src/androidTest/java/com/google/samples/apps/topeka/activity/SignInActivityTest.kt b/base/src/androidTest/java/com/google/samples/apps/topeka/activity/SignInActivityTest.kt index 463d70a3..8947b7b8 100644 --- a/base/src/androidTest/java/com/google/samples/apps/topeka/activity/SignInActivityTest.kt +++ b/base/src/androidTest/java/com/google/samples/apps/topeka/activity/SignInActivityTest.kt @@ -16,23 +16,23 @@ package com.google.samples.apps.topeka.activity -import android.support.test.InstrumentationRegistry -import android.support.test.espresso.Espresso.onData -import android.support.test.espresso.Espresso.onView -import android.support.test.espresso.action.ViewActions.click -import android.support.test.espresso.action.ViewActions.closeSoftKeyboard -import android.support.test.espresso.action.ViewActions.typeText -import android.support.test.espresso.assertion.ViewAssertions.matches -import android.support.test.espresso.matcher.ViewMatchers.isChecked -import android.support.test.espresso.matcher.ViewMatchers.isClickable -import android.support.test.espresso.matcher.ViewMatchers.isDisplayed -import android.support.test.espresso.matcher.ViewMatchers.isEnabled -import android.support.test.espresso.matcher.ViewMatchers.isFocusable -import android.support.test.espresso.matcher.ViewMatchers.withId -import android.support.test.espresso.matcher.ViewMatchers.withText -import android.support.test.filters.LargeTest -import android.support.test.rule.ActivityTestRule -import android.support.test.runner.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.espresso.Espresso.onData +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.closeSoftKeyboard +import androidx.test.espresso.action.ViewActions.typeText +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isChecked +import androidx.test.espresso.matcher.ViewMatchers.isClickable +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.isEnabled +import androidx.test.espresso.matcher.ViewMatchers.isFocusable +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.filters.LargeTest +import androidx.test.rule.ActivityTestRule +import androidx.test.ext.junit.runners.AndroidJUnit4 import android.view.View import com.google.samples.apps.topeka.TestLogin import com.google.samples.apps.topeka.base.R diff --git a/base/src/androidTest/java/com/google/samples/apps/topeka/helper/AnswerHelperAndroidTest.kt b/base/src/androidTest/java/com/google/samples/apps/topeka/helper/AnswerHelperAndroidTest.kt index 079778f6..c48e48ec 100644 --- a/base/src/androidTest/java/com/google/samples/apps/topeka/helper/AnswerHelperAndroidTest.kt +++ b/base/src/androidTest/java/com/google/samples/apps/topeka/helper/AnswerHelperAndroidTest.kt @@ -16,8 +16,8 @@ package com.google.samples.apps.topeka.helper -import android.support.test.filters.SmallTest -import android.support.test.runner.AndroidJUnit4 +import androidx.test.filters.SmallTest +import androidx.test.ext.junit.runners.AndroidJUnit4 import android.util.SparseBooleanArray import org.hamcrest.CoreMatchers.`is` import org.hamcrest.MatcherAssert.assertThat diff --git a/base/src/androidTest/java/com/google/samples/apps/topeka/helper/ParcelableHelperAndroidTest.kt b/base/src/androidTest/java/com/google/samples/apps/topeka/helper/ParcelableHelperAndroidTest.kt index 2408565f..328f0087 100644 --- a/base/src/androidTest/java/com/google/samples/apps/topeka/helper/ParcelableHelperAndroidTest.kt +++ b/base/src/androidTest/java/com/google/samples/apps/topeka/helper/ParcelableHelperAndroidTest.kt @@ -17,8 +17,8 @@ package com.google.samples.apps.topeka.helper import android.os.Parcel -import android.support.test.filters.SmallTest -import android.support.test.runner.AndroidJUnit4 +import androidx.test.filters.SmallTest +import androidx.test.ext.junit.runners.AndroidJUnit4 import org.hamcrest.CoreMatchers.`is` import org.hamcrest.MatcherAssert.assertThat import org.junit.Test diff --git a/base/src/androidTest/java/com/google/samples/apps/topeka/helper/PreferencesHelperAndroidTest.kt b/base/src/androidTest/java/com/google/samples/apps/topeka/helper/PreferencesHelperAndroidTest.kt index 10d608c0..cce893f7 100644 --- a/base/src/androidTest/java/com/google/samples/apps/topeka/helper/PreferencesHelperAndroidTest.kt +++ b/base/src/androidTest/java/com/google/samples/apps/topeka/helper/PreferencesHelperAndroidTest.kt @@ -16,9 +16,9 @@ package com.google.samples.apps.topeka.helper -import android.support.test.InstrumentationRegistry -import android.support.test.filters.SmallTest -import android.support.test.runner.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.filters.SmallTest +import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.samples.apps.topeka.model.Player import com.google.samples.apps.topeka.model.TEST_AVATAR import com.google.samples.apps.topeka.model.TEST_FIRST_NAME diff --git a/base/src/androidTest/java/com/google/samples/apps/topeka/model/PlayerAndroidTest.kt b/base/src/androidTest/java/com/google/samples/apps/topeka/model/PlayerAndroidTest.kt index 0b98f2f1..33d8b3fd 100644 --- a/base/src/androidTest/java/com/google/samples/apps/topeka/model/PlayerAndroidTest.kt +++ b/base/src/androidTest/java/com/google/samples/apps/topeka/model/PlayerAndroidTest.kt @@ -17,8 +17,8 @@ package com.google.samples.apps.topeka.model import android.os.Parcel -import android.support.test.filters.SmallTest -import android.support.test.runner.AndroidJUnit4 +import androidx.test.filters.SmallTest +import androidx.test.ext.junit.runners.AndroidJUnit4 import org.hamcrest.CoreMatchers.`is` import org.hamcrest.MatcherAssert.assertThat import org.junit.Test diff --git a/base/src/main/AndroidManifest.xml b/base/src/main/AndroidManifest.xml index 7d014a49..b7d19ece 100644 --- a/base/src/main/AndroidManifest.xml +++ b/base/src/main/AndroidManifest.xml @@ -19,39 +19,4 @@ package="com.google.samples.apps.topeka.base"> - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/base/src/main/java/com/google/samples/apps/topeka/activity/SignInActivity.kt b/base/src/main/java/com/google/samples/apps/topeka/activity/SignInActivity.kt index 0122a995..33da0599 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/activity/SignInActivity.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/activity/SignInActivity.kt @@ -18,7 +18,7 @@ package com.google.samples.apps.topeka.activity import android.content.Intent import android.os.Bundle -import android.support.v7.app.AppCompatActivity +import androidx.appcompat.app.AppCompatActivity import com.google.samples.apps.topeka.base.R import com.google.samples.apps.topeka.fragment.SignInFragment diff --git a/base/src/main/java/com/google/samples/apps/topeka/fragment/SignInFragment.kt b/base/src/main/java/com/google/samples/apps/topeka/fragment/SignInFragment.kt index cb5553cc..288d3505 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/fragment/SignInFragment.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/fragment/SignInFragment.kt @@ -20,12 +20,10 @@ import android.annotation.TargetApi import android.content.Intent import android.os.Build import android.os.Bundle -import android.support.design.widget.FloatingActionButton -import android.support.v4.app.ActivityOptionsCompat -import android.support.v4.app.Fragment -import android.support.v4.util.Pair -import android.support.v4.view.ViewCompat -import android.support.v4.view.animation.FastOutSlowInInterpolator +import com.google.android.material.floatingactionbutton.FloatingActionButton +import androidx.fragment.app.Fragment +import androidx.core.view.ViewCompat +import androidx.interpolator.view.animation.FastOutSlowInInterpolator import android.text.Editable import android.text.TextWatcher import android.transition.Transition @@ -42,7 +40,6 @@ import com.google.samples.apps.topeka.helper.ActivityLaunchHelper import com.google.samples.apps.topeka.helper.ApiLevelHelper import com.google.samples.apps.topeka.helper.DefaultLogin import com.google.samples.apps.topeka.helper.TAG -import com.google.samples.apps.topeka.helper.TransitionHelper import com.google.samples.apps.topeka.helper.isLoggedIn import com.google.samples.apps.topeka.helper.login import com.google.samples.apps.topeka.helper.onLayoutChange @@ -101,8 +98,9 @@ class SignInFragment : Fragment() { setSelection(length()) } this@SignInFragment.player = player.also { - if (activity != null) + if (activity != null) { login.savePlayer(activity!!, this, { selectAvatar(it.avatar!!) }) + } } } } else { @@ -236,7 +234,7 @@ class SignInFragment : Fragment() { } private fun removeDoneFab(endAction: () -> Unit) { - ViewCompat.animate(doneFab) + ViewCompat.animate(doneFab!!) .scaleX(0f) .scaleY(0f) .setInterpolator(FastOutSlowInInterpolator()) @@ -263,10 +261,12 @@ class SignInFragment : Fragment() { } }) - val pairs = TransitionHelper.createSafeTransitionParticipants(this, true, - Pair(v, getString(R.string.transition_avatar))) - val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, *pairs) - ActivityLaunchHelper.launchCategorySelection(this, options) +// TODO: #125 Fix crash and re-enable shared element transition. +// val pairs = TransitionHelper.createSafeTransitionParticipants(this, true, +// Pair(v, getString(R.string.transition_avatar))) +// val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, *pairs) +// ActivityLaunchHelper.launchCategorySelection(this, options) + ActivityLaunchHelper.launchCategorySelection(this) } } } diff --git a/base/src/main/java/com/google/samples/apps/topeka/helper/ActivityLaunchHelper.kt b/base/src/main/java/com/google/samples/apps/topeka/helper/ActivityLaunchHelper.kt index 6c1a537a..6fece01d 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/helper/ActivityLaunchHelper.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/helper/ActivityLaunchHelper.kt @@ -21,8 +21,8 @@ import android.content.Intent import android.content.Context import android.net.Uri import com.google.samples.apps.topeka.model.Category -import android.support.v4.app.ActivityCompat -import android.support.v4.app.ActivityOptionsCompat +import androidx.core.app.ActivityCompat +import androidx.core.app.ActivityOptionsCompat class ActivityLaunchHelper { diff --git a/base/src/main/java/com/google/samples/apps/topeka/helper/AnswerHelper.kt b/base/src/main/java/com/google/samples/apps/topeka/helper/AnswerHelper.kt index 610d7a94..cabf58a8 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/helper/AnswerHelper.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/helper/AnswerHelper.kt @@ -23,7 +23,7 @@ import android.util.SparseBooleanArray */ object AnswerHelper { - val SEPARATOR: String = System.getProperty("line.separator") + val SEPARATOR: String = System.getProperty("line.separator")!! /** * Converts an array of answers to a readable answer. diff --git a/base/src/main/java/com/google/samples/apps/topeka/helper/CredentialsHelper.kt b/base/src/main/java/com/google/samples/apps/topeka/helper/CredentialsHelper.kt index c4d64a94..cff39d69 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/helper/CredentialsHelper.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/helper/CredentialsHelper.kt @@ -6,7 +6,7 @@ import android.content.ContentValues.TAG import android.content.Context import android.content.Intent import android.content.IntentSender -import android.support.annotation.VisibleForTesting +import androidx.annotation.VisibleForTesting import android.util.Log import com.google.android.gms.auth.api.credentials.Credential import com.google.android.gms.auth.api.credentials.CredentialRequest @@ -42,8 +42,8 @@ fun Activity.requestLogin(success: (Player) -> Unit) { .setPasswordLoginSupported(true) .build()) .addOnCompleteListener { - if (it.isSuccessful) { - val player = Player(it.result.credential) + if (it.isSuccessful && it.result != null) { + val player = Player(it.result!!.credential) storePlayerLocally(player) success(player) } else { diff --git a/base/src/main/java/com/google/samples/apps/topeka/helper/FragmentExtensions.kt b/base/src/main/java/com/google/samples/apps/topeka/helper/FragmentExtensions.kt index e4757310..297f8174 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/helper/FragmentExtensions.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/helper/FragmentExtensions.kt @@ -16,9 +16,9 @@ package com.google.samples.apps.topeka.helper -import android.support.annotation.IdRes -import android.support.v4.app.Fragment -import android.support.v4.app.FragmentActivity +import androidx.annotation.IdRes +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity fun FragmentActivity.replaceFragment(@IdRes id: Int, fragment: Fragment) { supportFragmentManager.beginTransaction().replace(id, fragment).commit() diff --git a/base/src/main/java/com/google/samples/apps/topeka/helper/TransitionHelper.kt b/base/src/main/java/com/google/samples/apps/topeka/helper/TransitionHelper.kt index 6ba0df5d..7a34ffd9 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/helper/TransitionHelper.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/helper/TransitionHelper.kt @@ -19,8 +19,8 @@ package com.google.samples.apps.topeka.helper import android.annotation.TargetApi import android.app.Activity import android.os.Build -import android.support.annotation.IdRes -import android.support.v4.util.Pair +import androidx.annotation.IdRes +import androidx.core.util.Pair import android.view.View /** diff --git a/base/src/main/java/com/google/samples/apps/topeka/helper/ViewExtensions.kt b/base/src/main/java/com/google/samples/apps/topeka/helper/ViewExtensions.kt index 9efc051a..2d5ed8b3 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/helper/ViewExtensions.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/helper/ViewExtensions.kt @@ -18,7 +18,7 @@ package com.google.samples.apps.topeka.helper import android.graphics.Color import android.graphics.drawable.ColorDrawable -import android.support.v4.view.ViewCompat +import androidx.core.view.ViewCompat import android.transition.ChangeBounds import android.util.Property import android.util.TypedValue diff --git a/base/src/main/java/com/google/samples/apps/topeka/model/Avatar.kt b/base/src/main/java/com/google/samples/apps/topeka/model/Avatar.kt index b2658dfb..0b8343eb 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/model/Avatar.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/model/Avatar.kt @@ -16,7 +16,7 @@ package com.google.samples.apps.topeka.model -import android.support.annotation.DrawableRes +import androidx.annotation.DrawableRes import com.google.samples.apps.topeka.base.R diff --git a/base/src/main/java/com/google/samples/apps/topeka/model/Theme.kt b/base/src/main/java/com/google/samples/apps/topeka/model/Theme.kt index b2369a6f..7c7ca6d6 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/model/Theme.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/model/Theme.kt @@ -16,8 +16,8 @@ package com.google.samples.apps.topeka.model -import android.support.annotation.ColorRes -import android.support.annotation.StyleRes +import androidx.annotation.ColorRes +import androidx.annotation.StyleRes import com.google.samples.apps.topeka.base.R /** diff --git a/base/src/main/java/com/google/samples/apps/topeka/widget/AvatarView.kt b/base/src/main/java/com/google/samples/apps/topeka/widget/AvatarView.kt index 6b48ee3d..a9c1486d 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/widget/AvatarView.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/widget/AvatarView.kt @@ -22,11 +22,11 @@ import android.graphics.Canvas import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.os.Build -import android.support.annotation.DrawableRes -import android.support.v4.content.ContextCompat -import android.support.v4.content.res.ResourcesCompat -import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory -import android.support.v7.widget.AppCompatImageView +import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.appcompat.widget.AppCompatImageView import android.util.AttributeSet import android.widget.Checkable diff --git a/base/src/main/java/com/google/samples/apps/topeka/widget/OffsetDecoration.kt b/base/src/main/java/com/google/samples/apps/topeka/widget/OffsetDecoration.kt index 382a848d..1cb63ac7 100644 --- a/base/src/main/java/com/google/samples/apps/topeka/widget/OffsetDecoration.kt +++ b/base/src/main/java/com/google/samples/apps/topeka/widget/OffsetDecoration.kt @@ -17,7 +17,7 @@ package com.google.samples.apps.topeka.widget import android.graphics.Rect -import android.support.v7.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView import android.view.View class OffsetDecoration(private val offset: Int) : RecyclerView.ItemDecoration() { @@ -25,7 +25,7 @@ class OffsetDecoration(private val offset: Int) : RecyclerView.ItemDecoration() override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, - state: RecyclerView.State?) { + state: RecyclerView.State) { outRect.set(offset, offset, offset, offset) } } diff --git a/base/src/main/res/layout/fab_done.xml b/base/src/main/res/layout/fab_done.xml index 1ea162df..50e58aec 100644 --- a/base/src/main/res/layout/fab_done.xml +++ b/base/src/main/res/layout/fab_done.xml @@ -14,7 +14,7 @@ ~ limitations under the License. --> - - - + - - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 072c774a..2df889c5 100644 --- a/build.gradle +++ b/build.gradle @@ -17,13 +17,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.2.10' + ext.kotlin_version = '1.4.0' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.1' + classpath 'com.android.tools.build:gradle:4.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong @@ -39,16 +39,9 @@ allprojects { } ext { - buildTools = "27.0.3" - compileSdk = 27 - targetSdk = 27 + compileSdk = 29 + targetSdk = 29 minSdkInstant = 21 minSdk = 14 - supportLibVersion = "27.1.1" - playServicesAuthVersion = "11.8.0" - espressoVersion = "3.0.1" - androidTestVersion = "0.5" - hamcrestVersion = "1.3" - junitVersion = "4.12" } diff --git a/categories/build.gradle b/categories/build.gradle index f3dc0217..6d4a6601 100644 --- a/categories/build.gradle +++ b/categories/build.gradle @@ -14,11 +14,10 @@ * limitations under the License. */ -apply plugin: 'com.android.feature' +apply plugin: 'com.android.dynamic-feature' apply plugin: 'kotlin-android' android { - buildToolsVersion rootProject.buildTools compileSdkVersion rootProject.compileSdk defaultConfig { @@ -26,16 +25,12 @@ android { targetSdkVersion rootProject.targetSdk versionCode 1 versionName "1.0" - testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { - minifyEnabled true signingConfig signingConfigs.debug - proguardFiles getDefaultProguardFile("proguard-android.txt"), - "../instant/proguard.pro", - "proguard.pro" } } @@ -46,37 +41,21 @@ android { flavorDimensions 'delivery' - productFlavors { - instant { - dimension 'delivery' - minSdkVersion rootProject.minSdkInstant - } - installed { - dimension 'delivery' - } - } - - generatePureSplits true - - splits { - density { - enable true - } - } } dependencies { + implementation project(":app") implementation project(':base') - androidTestImplementation("com.android.support.test.espresso:espresso-core:$espressoVersion") { + androidTestImplementation('androidx.test.espresso:espresso-core:3.2.0') { exclude module: "espresso-idling-resource" } - androidTestImplementation("com.android.support.test.espresso:espresso-contrib:$espressoVersion") { + androidTestImplementation('androidx.test.espresso:espresso-contrib:3.2.0') { exclude module: "espresso-core" } - androidTestImplementation "com.android.support.test:rules:$androidTestVersion" - androidTestImplementation "com.android.support.test:runner:$androidTestVersion" - androidTestImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" + androidTestImplementation 'androidx.test:rules:1.2.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation "org.hamcrest:hamcrest-core:1.3" } diff --git a/categories/src/androidTest/java/com/google/samples/apps/topeka/activity/CategorySelectionActivityTest.kt b/categories/src/androidTest/java/com/google/samples/apps/topeka/activity/CategorySelectionActivityTest.kt index 76548f38..c204b13a 100644 --- a/categories/src/androidTest/java/com/google/samples/apps/topeka/activity/CategorySelectionActivityTest.kt +++ b/categories/src/androidTest/java/com/google/samples/apps/topeka/activity/CategorySelectionActivityTest.kt @@ -17,20 +17,20 @@ package com.google.samples.apps.topeka.activity import android.content.Context -import android.support.test.InstrumentationRegistry -import android.support.test.espresso.Espresso.onView -import android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu -import android.support.test.espresso.action.ViewActions.click -import android.support.test.espresso.action.ViewActions.scrollTo -import android.support.test.espresso.assertion.ViewAssertions.matches -import android.support.test.espresso.contrib.RecyclerViewActions -import android.support.test.espresso.matcher.ViewMatchers.isDisplayed -import android.support.test.espresso.matcher.ViewMatchers.withId -import android.support.test.espresso.matcher.ViewMatchers.withText -import android.support.test.filters.LargeTest -import android.support.test.rule.ActivityTestRule -import android.support.test.runner.AndroidJUnit4 -import android.support.v7.widget.RecyclerView +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.scrollTo +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.contrib.RecyclerViewActions +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.filters.LargeTest +import androidx.test.rule.ActivityTestRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.recyclerview.widget.RecyclerView import com.google.samples.apps.topeka.TestLogin import com.google.samples.apps.topeka.categories.R import com.google.samples.apps.topeka.helper.ActivityLaunchHelper diff --git a/categories/src/main/AndroidManifest.xml b/categories/src/main/AndroidManifest.xml index 5b0faab7..540e4d0a 100644 --- a/categories/src/main/AndroidManifest.xml +++ b/categories/src/main/AndroidManifest.xml @@ -15,7 +15,14 @@ --> + + + + + + diff --git a/categories/src/main/java/com/google/samples/apps/topeka/activity/CategorySelectionActivity.kt b/categories/src/main/java/com/google/samples/apps/topeka/activity/CategorySelectionActivity.kt index f287ebf0..b237171d 100644 --- a/categories/src/main/java/com/google/samples/apps/topeka/activity/CategorySelectionActivity.kt +++ b/categories/src/main/java/com/google/samples/apps/topeka/activity/CategorySelectionActivity.kt @@ -20,12 +20,13 @@ import android.annotation.SuppressLint import android.content.Intent import android.os.Build import android.os.Bundle -import android.support.v7.app.AppCompatActivity +import androidx.appcompat.app.AppCompatActivity import android.transition.TransitionInflater import android.view.Menu import android.view.MenuItem import android.view.View import android.widget.TextView +import com.google.samples.apps.topeka.R as baseR import com.google.samples.apps.topeka.categories.R import com.google.samples.apps.topeka.fragment.CategorySelectionFragment import com.google.samples.apps.topeka.helper.ActivityLaunchHelper @@ -58,7 +59,7 @@ class CategorySelectionActivity : AppCompatActivity() { } private fun updatePlayerViews(player: Player) { - findViewById(R.id.title).setText(player.toString()) + findViewById(R.id.title).text = player.toString() player.avatar?.run { findViewById(R.id.avatar).setAvatar(this) } } @@ -87,7 +88,7 @@ class CategorySelectionActivity : AppCompatActivity() { } override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_category, menu) + menuInflater.inflate(baseR.menu.menu_category, menu) return true } @@ -111,7 +112,7 @@ class CategorySelectionActivity : AppCompatActivity() { } override fun onOptionsItemSelected(item: MenuItem): Boolean { - return if (item.itemId == R.id.sign_out) { + return if (item.itemId == baseR.id.sign_out) { handleSignOut() true } else super.onOptionsItemSelected(item) diff --git a/categories/src/main/java/com/google/samples/apps/topeka/adapter/CategoryAdapter.kt b/categories/src/main/java/com/google/samples/apps/topeka/adapter/CategoryAdapter.kt index 56cdb2a3..fd68483c 100644 --- a/categories/src/main/java/com/google/samples/apps/topeka/adapter/CategoryAdapter.kt +++ b/categories/src/main/java/com/google/samples/apps/topeka/adapter/CategoryAdapter.kt @@ -20,20 +20,22 @@ import android.app.Activity import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.os.Build -import android.support.annotation.ColorRes -import android.support.annotation.DrawableRes -import android.support.v4.content.ContextCompat -import android.support.v4.graphics.drawable.DrawableCompat -import android.support.v7.widget.RecyclerView +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.DrawableCompat +import androidx.recyclerview.widget.RecyclerView import android.view.LayoutInflater import android.view.ViewGroup import android.widget.AdapterView import android.widget.ImageView import android.widget.TextView +import com.google.android.instantapps.InstantApps import com.google.samples.apps.topeka.categories.R import com.google.samples.apps.topeka.helper.ApiLevelHelper import com.google.samples.apps.topeka.helper.database import com.google.samples.apps.topeka.model.Category +import java.time.Instant class CategoryAdapter( private val activity: Activity, @@ -91,8 +93,15 @@ class CategoryAdapter( } private fun setCategoryIcon(category: Category, icon: ImageView) { - val imageRes = resources.getIdentifier("icon_category_${category.id}", - "drawable", "${activity.packageName}.categories") + val packageName = + if (InstantApps.isInstantApp(activity)) + "${activity.packageName}.categories" + else activity.packageName + + val imageRes = resources.getIdentifier( + "icon_category_${category.id}", + "drawable", + "$packageName.categories") if (category.solved) { icon.setImageDrawable(loadSolvedIcon(category, imageRes)) } else { diff --git a/categories/src/main/java/com/google/samples/apps/topeka/fragment/CategorySelectionFragment.kt b/categories/src/main/java/com/google/samples/apps/topeka/fragment/CategorySelectionFragment.kt index 480ca80e..e6949766 100644 --- a/categories/src/main/java/com/google/samples/apps/topeka/fragment/CategorySelectionFragment.kt +++ b/categories/src/main/java/com/google/samples/apps/topeka/fragment/CategorySelectionFragment.kt @@ -22,11 +22,11 @@ import android.app.Activity import android.content.Intent import android.os.Build import android.os.Bundle -import android.support.v4.app.ActivityCompat -import android.support.v4.app.ActivityOptionsCompat -import android.support.v4.app.Fragment -import android.support.v4.util.Pair -import android.support.v7.widget.RecyclerView +import androidx.core.app.ActivityCompat +import androidx.core.app.ActivityOptionsCompat +import androidx.fragment.app.Fragment +import androidx.core.util.Pair +import androidx.recyclerview.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -40,7 +40,7 @@ import com.google.samples.apps.topeka.model.Category import com.google.samples.apps.topeka.model.JsonAttributes import com.google.samples.apps.topeka.widget.OffsetDecoration -class CategorySelectionFragment : Fragment() { +class CategorySelectionFragment : Fragment(R.layout.fragment_categories) { private val adapter: CategoryAdapter? by lazy(LazyThreadSafetyMode.NONE) { activity?.run { @@ -54,11 +54,6 @@ class CategorySelectionFragment : Fragment() { } } - override fun onCreateView(inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?): View = - inflater.inflate(R.layout.fragment_categories, container, false) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { setUpQuizGrid(view.findViewById(R.id.categories)) super.onViewCreated(view, savedInstanceState) diff --git a/categories/src/main/res/layout/activity_category_selection.xml b/categories/src/main/res/layout/activity_category_selection.xml index da279c8b..92d9ef8f 100644 --- a/categories/src/main/res/layout/activity_category_selection.xml +++ b/categories/src/main/res/layout/activity_category_selection.xml @@ -22,7 +22,7 @@ android:transitionGroup="false" tools:ignore="Overdraw,UnusedAttribute"> - - + - + diff --git a/categories/src/main/res/menu/menu_category.xml b/categories/src/main/res/menu/menu_category.xml deleted file mode 100644 index f89e96ec..00000000 --- a/categories/src/main/res/menu/menu_category.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 53e73a79..97c8a3b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -33,4 +33,6 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true # suppress inspection "UnusedProperty" -org.gradle.daemon=true \ No newline at end of file +org.gradle.daemon=true +android.useAndroidX=true +android.enableJetifier=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e64bf027..eb35c8d9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Jan 04 11:48:07 GMT 2018 +#Sat Sep 05 17:53:09 MSK 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/installed/src/main/AndroidManifest.xml b/installed/src/main/AndroidManifest.xml deleted file mode 100644 index 49b8b667..00000000 --- a/installed/src/main/AndroidManifest.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - \ No newline at end of file diff --git a/instant/build.gradle b/instant/build.gradle deleted file mode 100644 index f691bbf7..00000000 --- a/instant/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2017 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -apply plugin: 'com.android.instantapp' - -android { - defaultConfig { - missingDimensionStrategy 'delivery', 'instant' - } -} - -dependencies { - implementation project(':base') - implementation project(':categories') - implementation project(':quiz') -} diff --git a/instant/proguard.pro b/instant/proguard.pro deleted file mode 100644 index db043667..00000000 --- a/instant/proguard.pro +++ /dev/null @@ -1,149 +0,0 @@ -# ProGuard configuration was created by following this guide: -# https://medium.com/google-developers/enabling-proguard-in-an-android-instant-app-fbd4fc014518 - -# -# rules from quiz module, generated using: -# comm -23 <(apkanalyzer dex packages quiz-debug.apk | grep "^C r" | cut -f4 | sort) \ -# <(jar tf ~/Android/Sdk/platforms/android-27/android.jar | sed s/.class$// | sed -e s-/-.-g | sort) -# - --keep, includedescriptorclasses class android.support.design.widget.FloatingActionButton { public protected *; } --keep, includedescriptorclasses class android.support.v4.app.ActivityCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.app.Fragment { public protected *; } --keep, includedescriptorclasses class android.support.v4.app.FragmentManager { public protected *; } --keep, includedescriptorclasses class android.support.v4.app.FragmentTransaction { public protected *; } --keep, includedescriptorclasses class android.support.v4.app.SharedElementCallback { public protected *; } --keep, includedescriptorclasses class android.support.v4.content.ContextCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.graphics.drawable.DrawableCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.view.animation.FastOutLinearInInterpolator { public protected *; } --keep, includedescriptorclasses class android.support.v4.view.animation.FastOutSlowInInterpolator { public protected *; } --keep, includedescriptorclasses class android.support.v4.view.animation.LinearOutSlowInInterpolator { public protected *; } --keep, includedescriptorclasses class android.support.v4.view.MarginLayoutParamsCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.view.ViewCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.view.ViewPropertyAnimatorCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.view.ViewPropertyAnimatorListenerAdapter { public protected *; } --keep, includedescriptorclasses class android.support.v7.app.AppCompatActivity { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ActivityLaunchHelper { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ActivityLaunchHelper$Companion { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.AnswerHelper { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ApiLevelHelper { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ContextExtensionsKt { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.FragmentExtensionsKt { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ViewExtensionsKt { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ViewUtils { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.Avatar { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.Category { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.Player { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.AlphaPickerQuiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.FillBlankQuiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.FillTwoBlanksQuiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.FourQuarterQuiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.MultiSelectQuiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.PickerQuiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.Quiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.QuizType { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.SelectItemQuiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.ToggleTranslateQuiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.quiz.TrueFalseQuiz { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.Theme { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.persistence.TopekaDatabaseHelper { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.widget.AvatarView { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.widget.TextWatcherAdapter { public protected *; } --keep, includedescriptorclasses class kotlin.collections.ArraysKt { public protected *; } --keep, includedescriptorclasses class kotlin.collections.CollectionsKt { public protected *; } --keep, includedescriptorclasses class kotlin.collections.IntIterator { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.functions.Function0 { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.internal.FunctionReference { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.internal.Intrinsics { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.internal.Lambda { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.internal.PropertyReference1Impl { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.internal.Reflection { public protected *; } --keep, includedescriptorclasses class kotlin.Lazy { public protected *; } --keep, includedescriptorclasses class kotlin.LazyKt { public protected *; } --keep, includedescriptorclasses class kotlin.LazyThreadSafetyMode { public protected *; } --keep, includedescriptorclasses class kotlin.NoWhenBranchMatchedException { public protected *; } --keep, includedescriptorclasses class kotlin.ranges.RangesKt { public protected *; } --keep, includedescriptorclasses class kotlin.text.StringsKt { public protected *; } --keep, includedescriptorclasses class kotlin.TypeCastException { public protected *; } --keep, includedescriptorclasses class kotlin.Unit { public protected *; } - -# -# rules from categories module, generated using: -# comm -23 <(apkanalyzer dex packages categories-debug.apk | grep "^C r" | cut -f4 | sort) \ -# <(jar tf ~/Android/Sdk/platforms/android-27/android.jar | sed s/.class$// | sed -e s-/-.-g | sort) -# - - --keep, includedescriptorclasses class android.support.v4.app.ActivityCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.app.ActivityOptionsCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.app.Fragment { public protected *; } --keep, includedescriptorclasses class android.support.v4.app.FragmentActivity { public protected *; } --keep, includedescriptorclasses class android.support.v4.content.ContextCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.graphics.drawable.DrawableCompat { public protected *; } --keep, includedescriptorclasses class android.support.v4.util.Pair { public protected *; } --keep, includedescriptorclasses class android.support.v7.app.ActionBar { public protected *; } --keep, includedescriptorclasses class android.support.v7.app.AppCompatActivity { public protected *; } --keep, includedescriptorclasses class android.support.v7.widget.RecyclerView { public protected *; } --keep, includedescriptorclasses class android.support.v7.widget.RecyclerView$Adapter { public protected *; } --keep, includedescriptorclasses class android.support.v7.widget.RecyclerView$ViewHolder { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ActivityLaunchHelper { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ActivityLaunchHelper$Companion { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ApiLevelHelper { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.ContextExtensionsKt { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.FragmentExtensionsKt { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.helper.TransitionHelper { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.Category { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.Player { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.model.Theme { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.persistence.TopekaDatabaseHelper { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.widget.AvatarView { public protected *; } --keep, includedescriptorclasses class com.google.samples.apps.topeka.widget.OffsetDecoration { public protected *; } --keep, includedescriptorclasses class kotlin.collections.CollectionsKt { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.internal.Intrinsics { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.internal.Lambda { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.internal.PropertyReference1Impl { public protected *; } --keep, includedescriptorclasses class kotlin.jvm.internal.Reflection { public protected *; } --keep, includedescriptorclasses class kotlin.Lazy { public protected *; } --keep, includedescriptorclasses class kotlin.LazyKt { public protected *; } --keep, includedescriptorclasses class kotlin.LazyThreadSafetyMode { public protected *; } --keep, includedescriptorclasses class kotlin.TypeCastException { public protected *; } - - -# -# rules copied from: quiz/build/intermediates/proguard-rules/feature/release/aapt_rules.txt -# - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/quiz/src/main/res/layout/activity_quiz.xml:88 --keep class android.support.design.widget.FloatingActionButton { (...); } - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/quiz/src/main/res/layout/fragment_quiz.xml:37 --keep class android.support.v7.widget.Toolbar { (...); } - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/quiz/build/intermediates/manifests/full/feature/release/AndroidManifest.xml:29 --keep class com.google.samples.apps.topeka.activity.QuizActivity { (...); } - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/quiz/src/main/res/layout/fragment_quiz.xml:66 --keep class com.google.samples.apps.topeka.widget.AvatarView { (...); } - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/quiz/src/main/res/transition-v21/quiz_shared_enter.xml:24 --keep class com.google.samples.apps.topeka.widget.TextResizeTransition { (...); } - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/quiz/src/main/res/layout/answer_submit.xml:18 --keep class com.google.samples.apps.topeka.widget.fab.CheckableFab { (...); } - -# -# rules copied from: categories/build/intermediates/proguard-rules/feature/release/aapt_rules.txt -# - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/categories/src/main/res/layout/fragment_categories.xml:17 --keep class android.support.v7.widget.RecyclerView { (...); } - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/categories/src/main/res/layout/activity_category_selection.xml:25 --keep class android.support.v7.widget.Toolbar { (...); } - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/categories/build/intermediates/manifests/full/feature/release/AndroidManifest.xml:29 --keep class com.google.samples.apps.topeka.activity.CategorySelectionActivity { (...); } - -# Referenced at /usr/local/google/home/wkal/StudioProjects/topeka-devrel/categories/src/main/res/layout/activity_category_selection.xml:34 --keep class com.google.samples.apps.topeka.widget.AvatarView { (...); } - diff --git a/quiz/build.gradle b/quiz/build.gradle index 3daf0b3c..c939c0d5 100644 --- a/quiz/build.gradle +++ b/quiz/build.gradle @@ -14,11 +14,10 @@ * limitations under the License. */ -apply plugin: 'com.android.feature' +apply plugin: 'com.android.dynamic-feature' apply plugin: 'kotlin-android' android { - buildToolsVersion rootProject.buildTools compileSdkVersion rootProject.compileSdk defaultConfig { @@ -26,60 +25,38 @@ android { targetSdkVersion rootProject.targetSdk versionCode 1 versionName "1.0" - testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { - minifyEnabled true signingConfig signingConfigs.debug - proguardFiles getDefaultProguardFile("proguard-android.txt"), - "../instant/proguard.pro", - "proguard.pro" } } packagingOptions { - pickFirst 'LICENSE.txt' - pickFirst 'protobuf.meta' + merge 'LICENSE.txt' + merge 'protobuf.meta' } - flavorDimensions 'delivery' - - productFlavors { - instant { - dimension 'delivery' - minSdkVersion rootProject.minSdkInstant - } - installed { - dimension 'delivery' - } - } - - generatePureSplits true - - splits { - density { - enable true - } - } } dependencies { + implementation project(":app") implementation project(":base") - implementation "com.android.support.test.espresso:espresso-idling-resource:$espressoVersion" + implementation 'androidx.test.espresso:espresso-idling-resource:3.2.0' - androidTestImplementation("com.android.support.test.espresso:espresso-core:$espressoVersion") { + androidTestImplementation('androidx.test.espresso:espresso-core:3.2.0') { exclude module: "espresso-idling-resource" } - androidTestImplementation("com.android.support.test.espresso:espresso-contrib:$espressoVersion") { + androidTestImplementation('androidx.test.espresso:espresso-contrib:3.2.0') { exclude module: "espresso-core" } - androidTestImplementation "com.android.support.test:rules:$androidTestVersion" - androidTestImplementation "com.android.support.test:runner:$androidTestVersion" - androidTestImplementation "org.hamcrest:hamcrest-core:$hamcrestVersion" + androidTestImplementation 'androidx.test:rules:1.2.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation "org.hamcrest:hamcrest-core:1.3" } diff --git a/quiz/src/androidTest/java/com/google/samples/apps/topeka/SolveQuizUtil.kt b/quiz/src/androidTest/java/com/google/samples/apps/topeka/SolveQuizUtil.kt index 9c39e327..05db8596 100644 --- a/quiz/src/androidTest/java/com/google/samples/apps/topeka/SolveQuizUtil.kt +++ b/quiz/src/androidTest/java/com/google/samples/apps/topeka/SolveQuizUtil.kt @@ -19,23 +19,23 @@ package com.google.samples.apps.topeka import android.app.Activity import android.content.pm.ActivityInfo import android.content.res.Configuration -import android.support.test.InstrumentationRegistry -import android.support.test.InstrumentationRegistry.getInstrumentation -import android.support.test.espresso.Espresso.onData -import android.support.test.espresso.Espresso.onView -import android.support.test.espresso.UiController -import android.support.test.espresso.ViewAction -import android.support.test.espresso.action.ViewActions.click -import android.support.test.espresso.action.ViewActions.closeSoftKeyboard -import android.support.test.espresso.action.ViewActions.typeText -import android.support.test.espresso.matcher.ViewMatchers -import android.support.test.espresso.matcher.ViewMatchers.hasSibling -import android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom -import android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA -import android.support.test.espresso.matcher.ViewMatchers.withId -import android.support.test.espresso.matcher.ViewMatchers.withText -import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry -import android.support.test.runner.lifecycle.Stage +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation +import androidx.test.espresso.Espresso.onData +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.UiController +import androidx.test.espresso.ViewAction +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.closeSoftKeyboard +import androidx.test.espresso.action.ViewActions.typeText +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.espresso.matcher.ViewMatchers.hasSibling +import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom +import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry +import androidx.test.runner.lifecycle.Stage import android.text.TextUtils import android.view.View import android.widget.AdapterView diff --git a/quiz/src/androidTest/java/com/google/samples/apps/topeka/activity/quiz/BaseQuizActivityTest.kt b/quiz/src/androidTest/java/com/google/samples/apps/topeka/activity/quiz/BaseQuizActivityTest.kt index cd39d6b0..c23b34c3 100644 --- a/quiz/src/androidTest/java/com/google/samples/apps/topeka/activity/quiz/BaseQuizActivityTest.kt +++ b/quiz/src/androidTest/java/com/google/samples/apps/topeka/activity/quiz/BaseQuizActivityTest.kt @@ -16,16 +16,16 @@ package com.google.samples.apps.topeka.activity.quiz -import android.support.test.InstrumentationRegistry -import android.support.test.espresso.Espresso -import android.support.test.espresso.Espresso.onView -import android.support.test.espresso.action.ViewActions.click -import android.support.test.espresso.assertion.ViewAssertions.matches -import android.support.test.espresso.matcher.ViewMatchers.isDisplayed -import android.support.test.espresso.matcher.ViewMatchers.withId -import android.support.test.espresso.matcher.ViewMatchers.withText -import android.support.test.rule.ActivityTestRule -import android.support.test.runner.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.espresso.Espresso +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.rule.ActivityTestRule +import androidx.test.ext.junit.runners.AndroidJUnit4 import android.view.View import com.google.samples.apps.topeka.SolveQuizUtil import com.google.samples.apps.topeka.TestLogin diff --git a/quiz/src/main/AndroidManifest.xml b/quiz/src/main/AndroidManifest.xml index d037285b..1fcff651 100644 --- a/quiz/src/main/AndroidManifest.xml +++ b/quiz/src/main/AndroidManifest.xml @@ -15,7 +15,14 @@ --> + + + + + + (R.id.icon)).apply { val resId = resources.getIdentifier("$IMAGE_CATEGORY$categoryId", "drawable", @@ -223,7 +231,7 @@ class QuizActivity : AppCompatActivity() { override fun onBackPressed() { - ViewCompat.animate(toolbarBack) + ViewCompat.animate(toolbarBack!!) .scaleX(0f) .scaleY(0f) .alpha(0f) @@ -231,14 +239,14 @@ class QuizActivity : AppCompatActivity() { .start() // Scale the icon and fab to 0 size before calling onBackPressed if it exists. - ViewCompat.animate(icon) + ViewCompat.animate(icon!!) .scaleX(.7f) .scaleY(.7f) .alpha(0f) .setInterpolator(interpolator) .start() - ViewCompat.animate(quizFab) + ViewCompat.animate(quizFab!!) .scaleX(0f) .scaleY(0f) .setInterpolator(interpolator) @@ -259,7 +267,7 @@ class QuizActivity : AppCompatActivity() { initQuizFragment() supportFragmentManager .beginTransaction() - .replace(R.id.quiz_fragment_container, quizFragment, FRAGMENT_TAG) + .replace(R.id.quiz_fragment_container, quizFragment!!, FRAGMENT_TAG) .commit() val container = (findViewById(R.id.quiz_fragment_container)).apply { setBackgroundColor(ContextCompat.getColor( @@ -387,7 +395,7 @@ class QuizActivity : AppCompatActivity() { scaleX = 0f scaleY = 0f } - ViewCompat.animate(quizFab) + ViewCompat.animate(quizFab!!) .scaleX(1f) .scaleY(1f) .setInterpolator(interpolator) diff --git a/quiz/src/main/java/com/google/samples/apps/topeka/adapter/ScoreAdapter.kt b/quiz/src/main/java/com/google/samples/apps/topeka/adapter/ScoreAdapter.kt index 810ba0b4..417f7853 100644 --- a/quiz/src/main/java/com/google/samples/apps/topeka/adapter/ScoreAdapter.kt +++ b/quiz/src/main/java/com/google/samples/apps/topeka/adapter/ScoreAdapter.kt @@ -18,10 +18,10 @@ package com.google.samples.apps.topeka.adapter import android.content.Context import android.graphics.drawable.Drawable -import android.support.annotation.ColorRes -import android.support.annotation.DrawableRes -import android.support.v4.content.ContextCompat -import android.support.v4.graphics.drawable.DrawableCompat +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.DrawableCompat import android.view.View import android.view.ViewGroup import android.widget.AbsListView diff --git a/quiz/src/main/java/com/google/samples/apps/topeka/fragment/QuizFragment.kt b/quiz/src/main/java/com/google/samples/apps/topeka/fragment/QuizFragment.kt index be13bd8d..21b914bd 100644 --- a/quiz/src/main/java/com/google/samples/apps/topeka/fragment/QuizFragment.kt +++ b/quiz/src/main/java/com/google/samples/apps/topeka/fragment/QuizFragment.kt @@ -19,9 +19,9 @@ package com.google.samples.apps.topeka.fragment import android.annotation.TargetApi import android.os.Build import android.os.Bundle -import android.support.v4.app.Fragment -import android.support.v4.view.ViewCompat -import android.support.v4.view.animation.FastOutLinearInInterpolator +import androidx.fragment.app.Fragment +import androidx.core.view.ViewCompat +import androidx.interpolator.view.animation.FastOutLinearInInterpolator import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.View @@ -48,7 +48,7 @@ import com.google.samples.apps.topeka.widget.quiz.AbsQuizView class QuizFragment : Fragment() { private val category by lazy(LazyThreadSafetyMode.NONE) { - val categoryId = arguments!!.getString(Category.TAG) + val categoryId = arguments?.getString(Category.TAG)!! activity!!.database().getCategoryWith(categoryId) } @@ -130,7 +130,7 @@ class QuizFragment : Fragment() { activity?.requestLogin { player -> if (player.valid()) { avatarView?.setAvatar(player.avatar!!.drawableId) - with(ViewCompat.animate(avatarView)) { + with(ViewCompat.animate(avatarView!!)) { interpolator = FastOutLinearInInterpolator() startDelay = 500 scaleX(1f) diff --git a/quiz/src/main/java/com/google/samples/apps/topeka/widget/TextResizeTransition.kt b/quiz/src/main/java/com/google/samples/apps/topeka/widget/TextResizeTransition.kt index eb6818a9..072bfcb1 100644 --- a/quiz/src/main/java/com/google/samples/apps/topeka/widget/TextResizeTransition.kt +++ b/quiz/src/main/java/com/google/samples/apps/topeka/widget/TextResizeTransition.kt @@ -22,7 +22,7 @@ import android.animation.ObjectAnimator import android.annotation.TargetApi import android.content.Context import android.os.Build -import android.support.v4.view.ViewCompat +import androidx.core.view.ViewCompat import android.transition.Transition import android.transition.TransitionValues import android.util.AttributeSet diff --git a/quiz/src/main/java/com/google/samples/apps/topeka/widget/TextSharedElementCallback.kt b/quiz/src/main/java/com/google/samples/apps/topeka/widget/TextSharedElementCallback.kt index 13975492..30dc363c 100644 --- a/quiz/src/main/java/com/google/samples/apps/topeka/widget/TextSharedElementCallback.kt +++ b/quiz/src/main/java/com/google/samples/apps/topeka/widget/TextSharedElementCallback.kt @@ -18,7 +18,7 @@ package com.google.samples.apps.topeka.widget import android.annotation.TargetApi import android.os.Build -import android.support.v4.app.SharedElementCallback +import androidx.core.app.SharedElementCallback import android.util.Log import android.util.TypedValue import android.view.View diff --git a/quiz/src/main/java/com/google/samples/apps/topeka/widget/fab/CheckableFab.kt b/quiz/src/main/java/com/google/samples/apps/topeka/widget/fab/CheckableFab.kt index 9584e85f..81650472 100644 --- a/quiz/src/main/java/com/google/samples/apps/topeka/widget/fab/CheckableFab.kt +++ b/quiz/src/main/java/com/google/samples/apps/topeka/widget/fab/CheckableFab.kt @@ -17,7 +17,7 @@ package com.google.samples.apps.topeka.widget.fab import android.content.Context -import android.support.design.widget.FloatingActionButton +import com.google.android.material.floatingactionbutton.FloatingActionButton import android.util.AttributeSet import android.view.View import android.widget.Checkable @@ -35,12 +35,12 @@ class CheckableFab( private var _checked = true + private val attrs = intArrayOf(android.R.attr.state_checked) + init { setImageResource(R.drawable.answer_quiz_fab) } - private val attrs = intArrayOf(android.R.attr.state_checked) - override fun onCreateDrawableState(extraSpace: Int): IntArray { val drawableState = super.onCreateDrawableState(1 + extraSpace) if (_checked) { diff --git a/quiz/src/main/java/com/google/samples/apps/topeka/widget/quiz/AbsQuizView.kt b/quiz/src/main/java/com/google/samples/apps/topeka/widget/quiz/AbsQuizView.kt index 15fbcf90..52525fb3 100644 --- a/quiz/src/main/java/com/google/samples/apps/topeka/widget/quiz/AbsQuizView.kt +++ b/quiz/src/main/java/com/google/samples/apps/topeka/widget/quiz/AbsQuizView.kt @@ -25,11 +25,11 @@ import android.graphics.Color import android.os.Build import android.os.Bundle import android.os.Handler -import android.support.annotation.ColorInt -import android.support.annotation.LayoutRes -import android.support.v4.content.ContextCompat -import android.support.v4.view.MarginLayoutParamsCompat -import android.support.v4.view.animation.LinearOutSlowInInterpolator +import androidx.annotation.ColorInt +import androidx.annotation.LayoutRes +import androidx.core.content.ContextCompat +import androidx.core.view.MarginLayoutParamsCompat +import androidx.interpolator.view.animation.LinearOutSlowInInterpolator import android.util.Property import android.view.Gravity import android.view.LayoutInflater @@ -99,7 +99,6 @@ abstract class AbsQuizView> } private val ANSWER_HIDE_DELAY = 500L - private val FOREGROUND_COLOR_CHANGE_DELAY = 750L private val doubleSpacing = resources.getDimensionPixelSize( com.google.samples.apps.topeka.base.R.dimen.spacing_double) @@ -148,8 +147,7 @@ abstract class AbsQuizView> } private fun addContentView(container: LinearLayout, quizContentView: View) { - val layoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, - FrameLayout.LayoutParams.WRAP_CONTENT) + val layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) container.run { addView((layoutInflater.inflate(R.layout.question, this, false) as TextView).apply { setBackgroundColor(ContextCompat.getColor(context, @@ -165,7 +163,7 @@ abstract class AbsQuizView> val fabSize = resources.getDimensionPixelSize( com.google.samples.apps.topeka.base.R.dimen.size_fab) val bottomOfQuestionView = findViewById(R.id.question_view).bottom - val fabLayoutParams = FrameLayout.LayoutParams(fabSize, fabSize, Gravity.END or Gravity.TOP) + val fabLayoutParams = LayoutParams(fabSize, fabSize, Gravity.END or Gravity.TOP) val halfAFab = fabSize / 2 fabLayoutParams.setMargins(0, // left bottomOfQuestionView - halfAFab, // top @@ -278,6 +276,7 @@ abstract class AbsQuizView> if (context is QuizActivity) (context as QuizActivity).proceed() } + @Suppress("UNCHECKED_CAST") protected fun inflate(@LayoutRes resId: Int) = layoutInflater.inflate(resId, this, false) as T diff --git a/quiz/src/main/res/drawable/selector_subtle.xml b/quiz/src/main/res/drawable/selector_subtle.xml deleted file mode 100644 index d388107b..00000000 --- a/quiz/src/main/res/drawable/selector_subtle.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - \ No newline at end of file diff --git a/quiz/src/main/res/layout/activity_quiz.xml b/quiz/src/main/res/layout/activity_quiz.xml index acccad9b..bd5e8fe4 100644 --- a/quiz/src/main/res/layout/activity_quiz.xml +++ b/quiz/src/main/res/layout/activity_quiz.xml @@ -85,7 +85,7 @@ - - - + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 8200891d..d4ea9cc1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -14,4 +14,5 @@ * limitations under the License. */ -include ':base', ':quiz', ':categories', ':installed', ':instant' +include ':app' +include ':base', ':quiz', ':categories'