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'