Release 5(1.0)

* chore: manage dependencies with buildSrc

* chore: setup firebase crashlytics, analytics

* chore: convert build scripts to kotlin dsl

* chore: convert build scripts to kotlin dsl

* chore: remove kotlin android extensions, enable viewbinding

* feat: use bottom sheet in search fragmenrt, format forecast dates

* chore: fix build config issues

* refactor: update .gitignore

* refactor: update .gitignore

* ci: update actions workflow

* refactor: fix failing tests

* chore: fix build config issues

* ci: update actions workflow
This commit is contained in:
Adeniyi Mayokun
2021-07-25 02:07:45 +01:00
committed by GitHub
parent 4ac31b74c8
commit 2db76352d8
183 changed files with 638 additions and 454 deletions

View File

@ -9,16 +9,20 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Create APIKEY.PROPERTIES File
- name: Create LOCAL.PROPERTIES File
env:
API_KEY: ${{ secrets.APIKEY }}
ALGOLIA_API_KEY: ${{ secrets.ALGOLIAAPIKEY }}
ALGOLIA_APP_ID: ${{ secrets.ALGOLIAAPPID }}
run: |
touch apikey.properties
echo "API_KEY=$API_KEY" >> apikey.properties
echo "ALGOLIA_API_KEY=$ALGOLIA_API_KEY" >> apikey.properties
echo "ALGOLIA_APP_ID=$ALGOLIA_APP_ID" >> apikey.properties
touch local.properties keystore.properties
echo "API_KEY=$API_KEY" >> local.properties
echo "ALGOLIA_API_KEY=$ALGOLIA_API_KEY" >> local.properties
echo "ALGOLIA_APP_ID=$ALGOLIA_APP_ID" >> local.properties
echo "storePassword=storePassword" >> keystore.properties
echo "keyPassword=keyPassword" >> keystore.properties
echo "keyAlias=keyAlias" >> keystore.properties
echo "storeFile=storeFile" >> keystore.properties
- name: Set up JDK 1.8
uses: actions/setup-java@v1
@ -39,16 +43,20 @@ jobs:
- name: Checkout
uses: actions/checkout@v2
- name: Create APIKEY.PROPERTIES File
- name: Create LOCAL.PROPERTIES File
env:
API_KEY: ${{ secrets.APIKEY }}
ALGOLIA_API_KEY: ${{ secrets.ALGOLIAAPIKEY }}
ALGOLIA_APP_ID: ${{ secrets.ALGOLIAAPPID }}
run: |
touch apikey.properties
echo "API_KEY=$API_KEY" >> apikey.properties
echo "ALGOLIA_API_KEY=$ALGOLIA_API_KEY" >> apikey.properties
echo "ALGOLIA_APP_ID=$ALGOLIA_APP_ID" >> apikey.properties
touch local.properties keystore.properties
echo "API_KEY=$API_KEY" >> local.properties
echo "ALGOLIA_API_KEY=$ALGOLIA_API_KEY" >> local.properties
echo "ALGOLIA_APP_ID=$ALGOLIA_APP_ID" >> local.properties
echo "storePassword=storePassword" >> keystore.properties
echo "keyPassword=keyPassword" >> keystore.properties
echo "keyAlias=keyAlias" >> keystore.properties
echo "storeFile=storeFile" >> keystore.properties
- name: Set up JDK 1.8
uses: actions/setup-java@v1

118
.gitignore vendored
View File

@ -1,15 +1,107 @@
# Created by https://www.toptal.com/developers/gitignore/api/android
# Edit at https://www.toptal.com/developers/gitignore?templates=android
### Android ###
# Built application files
*.apk
*.aar
*.ap_
*.aab
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Uncomment the following line in case you need and you don't have the release build type files in your app
# release/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
.idea/jarRepositories.xml
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx
apikey.properties
.cxx/
# Google Services (e.g. APIs or Firebase)
google-services.json
.DS_Store
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
# Version control
vcs.xml
# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
# Android Profiling
*.hprof
### Android Patch ###
gen-external-apklibs
output.json
keystore.properties
Instant-Weather-key
# Replacement of .externalNativeBuild directories introduced
# with Android Studio 3.5.
# End of https://www.toptal.com/developers/gitignore/api/android

2
.idea/compiler.xml generated
View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" />
<bytecodeTargetLevel target="11" />
</component>
</project>

View File

@ -1,7 +0,0 @@
<component name="ProjectDictionaryState">
<dictionary name="user">
<words>
<w>algolia</w>
</words>
</dictionary>
</component>

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
</component>
</project>

2
.idea/misc.xml generated
View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

10
.idea/runConfigurations.xml generated Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
</set>
</option>
</component>
</project>

View File

@ -0,0 +1,56 @@
Index: buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.s
===================================================================
--- buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.s (revision c84392c7694a022f35853c9ca39b33031584d5e4)
+++ buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.s (revision c84392c7694a022f35853c9ca39b33031584d5e4)
@@ -1,1 +0,0 @@
-<2D>+
\ No newline at end of file
Index: buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.s
===================================================================
--- buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.s (revision c84392c7694a022f35853c9ca39b33031584d5e4)
+++ buildSrc/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.s (revision c84392c7694a022f35853c9ca39b33031584d5e4)
@@ -1,1 +0,0 @@
-<2D>C
\ No newline at end of file
Index: buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>5\n4
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab (revision c84392c7694a022f35853c9ca39b33031584d5e4)
+++ buildSrc/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab (date 1627144095570)
@@ -1,2 +1,2 @@
-5
-4
\ No newline at end of file
+1
+0
\ No newline at end of file
Index: buildSrc/build/kotlin/buildSrcjar-classes.txt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidTest$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidTest.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidX$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidX.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Config.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Dagger$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Dagger.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Database$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Database.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Firebase$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Firebase.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Google$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Google.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Kotlin$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Kotlin.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Libraries.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Navigation$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Navigation.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Network$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Network.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Plugins$Version.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Plugins.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/UnitTest$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/UnitTest.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Utils$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Utils.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/View$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/View.class
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- buildSrc/build/kotlin/buildSrcjar-classes.txt (revision c84392c7694a022f35853c9ca39b33031584d5e4)
+++ buildSrc/build/kotlin/buildSrcjar-classes.txt (date 1627144095829)
@@ -1,1 +1,1 @@
-/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidTest$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidTest.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidX$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidX.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Config.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Dagger$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Dagger.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Database$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Database.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Firebase$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Firebase.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Google$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Google.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Kotlin$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Kotlin.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Libraries.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Navigation$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Navigation.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Network$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Network.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Plugins$Version.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Plugins.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/UnitTest$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/UnitTest.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Utils$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Utils.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/View$Versions.class:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/View.class
\ No newline at end of file
+/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidTest$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidTest.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidX$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/AndroidX.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Config.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Dagger$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Dagger.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Database$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Database.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Firebase$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Firebase.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Google$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Google.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Kotlin$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Kotlin.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Libraries.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Navigation$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Navigation.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Network$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Network.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Plugins$Version.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Plugins.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/UnitTest$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/UnitTest.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Utils$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/Utils.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/View$Versions.class:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main/View.class
\ No newline at end of file
Index: buildSrc/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>implementation-classpath=/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/java/main\\:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/groovy/main\\:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main\\:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/resources/main\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- buildSrc/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties (revision c84392c7694a022f35853c9ca39b33031584d5e4)
+++ buildSrc/build/pluginUnderTestMetadata/plugin-under-test-metadata.properties (date 1627144096016)
@@ -1,1 +1,1 @@
-implementation-classpath=/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/java/main\:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/groovy/main\:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main\:/Users/mayokunadeniyi/Documents/Instant-Weather/buildSrc/build/resources/main
+implementation-classpath=/Users/user/Documents/Instant-Weather/buildSrc/build/classes/java/main\:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/groovy/main\:/Users/user/Documents/Instant-Weather/buildSrc/build/classes/kotlin/main\:/Users/user/Documents/Instant-Weather/buildSrc/build/resources/main

View File

@ -0,0 +1,18 @@
Index: .idea/gradle.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+><?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"GradleMigrationSettings\" migrationVersion=\"1\" />\n <component name=\"GradleSettings\">\n <option name=\"linkedExternalProjectsSettings\">\n <GradleProjectSettings>\n <option name=\"delegatedBuild\" value=\"false\" />\n <option name=\"testRunner\" value=\"GRADLE\" />\n <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n <option name=\"modules\">\n <set>\n <option value=\"$PROJECT_DIR$\" />\n <option value=\"$PROJECT_DIR$/app\" />\n </set>\n </option>\n <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n </GradleProjectSettings>\n </option>\n </component>\n</project>
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- .idea/gradle.xml (revision 96c7f2ca0e31e4ae33297fb15f4b2fbde2e6a503)
+++ .idea/gradle.xml (date 1627145315492)
@@ -5,7 +5,7 @@
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="delegatedBuild" value="false" />
- <option name="testRunner" value="GRADLE" />
+ <option name="testRunner" value="PLATFORM" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">

View File

@ -0,0 +1,4 @@
<changelist name="Uncommitted_changes_before_Checkout_at_24_07_2021,_17_54_[Default_Changelist]" date="1627145650979" recycled="true" deleted="true">
<option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_54_[Default_Changelist]/shelved.patch" />
<option name="DESCRIPTION" value="Uncommitted changes before Checkout at 24/07/2021, 17:54 [Default Changelist]" />
</changelist>

6
.idea/vcs.xml generated
View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -1,36 +1,43 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
import java.util.Properties
import java.io.FileInputStream
plugins {
id("com.android.application")
id("kotlin-android")
id("kotlin-android-extensions")
id("kotlin-parcelize")
id("kotlin-kapt")
id("androidx.navigation.safeargs.kotlin")
id("com.google.firebase.crashlytics")
}
val API_KEY = "API_KEY"
val ALGOLIA_API_KEY = "ALGOLIA_API_KEY"
val ALGOLIA_APP_ID = "ALGOLIA_APP_ID"
val API_KEY: String = gradleLocalProperties(rootDir).getProperty("API_KEY")
val ALGOLIA_API_KEY: String = gradleLocalProperties(rootDir).getProperty("ALGOLIA_API_KEY")
val ALGOLIA_APP_ID: String = gradleLocalProperties(rootDir).getProperty("ALGOLIA_APP_ID")
fun getProperty(key: String): String {
val items = HashMap<String, String>()
val fl = rootProject.file("apikey.properties")
(fl.exists())?.let {
fl.forEachLine {
items[it.split("=")[0]] = it.split("=")[1]
}
}
return items[key] ?: ""
}
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
android {
compileSdkVersion(Config.compileSdkVersion)
buildToolsVersion(Config.buildTools)
signingConfigs {
getByName("debug") {
keyAlias = keystoreProperties["keyAlias"].toString()
keyPassword = keystoreProperties["keyPassword"].toString()
storeFile = file(rootDir.absolutePath + keystoreProperties["storeFile"])
storePassword = keystoreProperties["storePassword"].toString()
}
create("release") {
keyAlias = keystoreProperties["keyAlias"].toString()
keyPassword = keystoreProperties["keyPassword"].toString()
storeFile = file(rootDir.absolutePath + keystoreProperties["storeFile"])
storePassword = keystoreProperties["storePassword"].toString()
}
}
defaultConfig {
applicationId(Config.applicationId)
minSdkVersion(Config.minSdkVersion)
@ -39,9 +46,9 @@ android {
versionName(Config.versionName)
testInstrumentationRunner(Config.testInstrumentationRunner)
buildConfigField("String", "API_KEY", getProperty(API_KEY))
buildConfigField("String", "ALGOLIA_API_KEY", getProperty(ALGOLIA_API_KEY))
buildConfigField("String", "ALGOLIA_APP_ID", getProperty(ALGOLIA_APP_ID))
buildConfigField("String", "API_KEY", API_KEY)
buildConfigField("String", "ALGOLIA_API_KEY", ALGOLIA_API_KEY)
buildConfigField("String", "ALGOLIA_APP_ID", ALGOLIA_APP_ID)
buildConfigField("String", "BASE_URL", "\"http://api.openweathermap.org/\"")
kapt {
@ -58,6 +65,13 @@ android {
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig = signingConfigs.getByName("release")
isDebuggable = false
}
getByName("debug") {
signingConfig = signingConfigs.getByName("debug")
isDebuggable = true
}
}
@ -72,6 +86,7 @@ android {
buildFeatures {
dataBinding = true
viewBinding = true
}
testOptions {
@ -92,9 +107,6 @@ android {
}
}
androidExtensions {
isExperimental = true
}
packagingOptions {
exclude("META-INF/DEPENDENCIES")
exclude("META-INF/LICENSE")

View File

@ -1,40 +0,0 @@
{
"project_info": {
"project_number": "784129913745",
"firebase_url": "https://instant-weather-7a5c9.firebaseio.com",
"project_id": "instant-weather-7a5c9",
"storage_bucket": "instant-weather-7a5c9.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:784129913745:android:aee1181a5084cec454a030",
"android_client_info": {
"package_name": "com.mayokunadeniyi.instantweather"
}
},
"oauth_client": [
{
"client_id": "784129913745-qi56r7k1mghd6flnrv1oo7n780kpinha.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyBNBN2qO7pyw0gXyRTQft7UI6V1VfLUp6U"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "784129913745-qi56r7k1mghd6flnrv1oo7n780kpinha.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}

View File

@ -8,7 +8,7 @@ import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.testing.FragmentScenario
import androidx.test.core.app.ActivityScenario
import androidx.test.espresso.IdlingResource
import java.util.UUID
import java.util.*
/**
* Created by Mayokun Adeniyi on 25/07/2020.

View File

@ -2,7 +2,6 @@ package com.mayokunadeniyi.instantweather
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import java.lang.IllegalArgumentException
import javax.inject.Inject
import javax.inject.Provider
import javax.inject.Singleton

View File

@ -9,7 +9,6 @@ import kotlinx.android.parcel.Parcelize
@Parcelize
data class Weather(
val uId: Int,
val cityId: Int,
val name: String,

View File

@ -7,7 +7,7 @@ package com.mayokunadeniyi.instantweather.data.model
data class WeatherForecast(
val uID: Int,
val date: String,
var date: String,
val wind: Wind,

View File

@ -8,7 +8,6 @@ import com.mayokunadeniyi.instantweather.di.scope.IoDispatcher
import com.mayokunadeniyi.instantweather.utils.Result
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import java.lang.Exception
import javax.inject.Inject
/**

View File

@ -3,7 +3,6 @@ package com.mayokunadeniyi.instantweather.di.module
import com.mayokunadeniyi.instantweather.ui.forecast.ForecastFragment
import com.mayokunadeniyi.instantweather.ui.home.HomeFragment
import com.mayokunadeniyi.instantweather.ui.search.SearchFragment
import com.mayokunadeniyi.instantweather.ui.searchdetail.SearchDetailFragment
import com.mayokunadeniyi.instantweather.ui.settings.SettingsFragment
import dagger.Module
import dagger.android.ContributesAndroidInjector
@ -24,9 +23,6 @@ abstract class FragmentBuildersModule {
@ContributesAndroidInjector
abstract fun contributeSearchFragment(): SearchFragment
@ContributesAndroidInjector
abstract fun contributeSearchDetailFragment(): SearchDetailFragment
@ContributesAndroidInjector
abstract fun contributeSettingsFragment(): SettingsFragment
}

View File

@ -7,7 +7,6 @@ import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.observe
import com.mayokunadeniyi.instantweather.R
import com.mayokunadeniyi.instantweather.databinding.FragmentForecastBinding
import com.mayokunadeniyi.instantweather.ui.BaseFragment
@ -16,7 +15,7 @@ import com.mayokunadeniyi.instantweather.utils.SharedPreferenceHelper
import com.mayokunadeniyi.instantweather.utils.convertCelsiusToFahrenheit
import com.shrikanthravi.collapsiblecalendarview.widget.CollapsibleCalendar
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.*
import javax.inject.Inject
/**
@ -108,7 +107,7 @@ class ForecastFragment : BaseFragment() {
val list = viewModel.forecast.value
val filteredList = list?.filter { weatherForecast ->
val format = SimpleDateFormat("yyyy-M-dd HH:mm:ss", Locale.US)
val format = SimpleDateFormat("d MMM y, h:mma", Locale.US)
val formattedDate = format.parse(weatherForecast.date)
val weatherForecastDay = formattedDate?.date
val weatherForecastMonth = formattedDate?.month

View File

@ -8,6 +8,7 @@ import com.mayokunadeniyi.instantweather.data.source.repository.WeatherRepositor
import com.mayokunadeniyi.instantweather.utils.Result
import com.mayokunadeniyi.instantweather.utils.asLiveData
import com.mayokunadeniyi.instantweather.utils.convertKelvinToCelsius
import com.mayokunadeniyi.instantweather.utils.formatDate
import kotlinx.coroutines.launch
import javax.inject.Inject
@ -54,11 +55,10 @@ class ForecastFragmentViewModel @Inject constructor(
is Result.Success -> {
_isLoading.postValue(false)
if (result.data != null) {
val forecast = result.data.apply {
forEach {
it.networkWeatherCondition.temp =
convertKelvinToCelsius(it.networkWeatherCondition.temp)
}
val forecast = result.data.onEach { forecast ->
forecast.networkWeatherCondition.temp =
convertKelvinToCelsius(forecast.networkWeatherCondition.temp)
forecast.date = forecast.date.formatDate()
}
_forecast.postValue(forecast)
_dataFetchState.postValue(true)

View File

@ -12,8 +12,6 @@ import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.lifecycle.observe
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.NetworkType
@ -64,7 +62,7 @@ class HomeFragment : BaseFragment() {
allPermissionsGranted() -> {
viewModel.fetchLocationLiveData().observeOnce(
viewLifecycleOwner,
Observer { location ->
{ location ->
if (location != null) {
viewModel.getWeather(location)
setupWorkManager()
@ -176,7 +174,7 @@ class HomeFragment : BaseFragment() {
private fun initiateRefresh() {
viewModel.fetchLocationLiveData().observeOnce(
viewLifecycleOwner,
Observer { location ->
{ location ->
if (location != null) {
viewModel.refreshWeather(location)
} else {
@ -234,18 +232,14 @@ class HomeFragment : BaseFragment() {
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
Activity.RESULT_OK -> {
when (requestCode) {
GPS_REQUEST_CHECK_SETTINGS -> {
GPS_REQUEST_CHECK_SETTINGS -> {
when(resultCode) {
Activity.RESULT_OK -> {
isGPSEnabled = true
invokeLocationAction()
}
}
}
Activity.RESULT_CANCELED -> {
when (requestCode) {
GPS_REQUEST_CHECK_SETTINGS -> {
Activity.RESULT_CANCELED ->{
Snackbar.make(
binding.root,
getString(R.string.enable_gps),
@ -287,7 +281,7 @@ class HomeFragment : BaseFragment() {
private fun setupWorkManager() {
viewModel.fetchLocationLiveData().observeOnce(
this,
Observer {
{
prefs.saveLocation(it)
}
)

View File

@ -13,7 +13,7 @@ import com.mayokunadeniyi.instantweather.utils.asLiveData
import com.mayokunadeniyi.instantweather.utils.convertKelvinToCelsius
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.Date
import java.util.*
import javax.inject.Inject
/**

View File

@ -7,8 +7,6 @@ import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.observe
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.algolia.instantsearch.core.connection.ConnectionHandler
import com.algolia.instantsearch.helper.android.item.StatsTextView
@ -17,18 +15,24 @@ import com.algolia.instantsearch.helper.android.searchbox.connectView
import com.algolia.instantsearch.helper.stats.StatsPresenterImpl
import com.algolia.instantsearch.helper.stats.connectView
import com.google.android.material.snackbar.Snackbar
import com.mayokunadeniyi.instantweather.R
import com.mayokunadeniyi.instantweather.data.model.SearchResult
import com.mayokunadeniyi.instantweather.data.model.Weather
import com.mayokunadeniyi.instantweather.databinding.FragmentSearchBinding
import com.mayokunadeniyi.instantweather.databinding.FragmentSearchDetailBinding
import com.mayokunadeniyi.instantweather.ui.BaseFragment
import com.mayokunadeniyi.instantweather.ui.search.SearchResultAdapter.SearchResultListener
import com.mayokunadeniyi.instantweather.utils.BaseBottomSheetDialog
import com.mayokunadeniyi.instantweather.utils.convertKelvinToCelsius
/**
* A simple [Fragment] subclass.
*/
class SearchFragment : BaseFragment() {
class SearchFragment : BaseFragment(), SearchResultAdapter.OnItemClickedListener {
private lateinit var binding: FragmentSearchBinding
private lateinit var searchDetailBinding: FragmentSearchDetailBinding
private val bottomSheetDialog by lazy { BaseBottomSheetDialog(requireActivity(), R.style.AppBottomSheetDialogTheme) }
private val viewModel by viewModels<SearchFragmentViewModel> { viewModelFactoryProvider }
private lateinit var searchResultAdapter: SearchResultAdapter
private val searchResultAdapter by lazy { SearchResultAdapter(this) }
private val connection = ConnectionHandler()
private lateinit var searchBoxView: SearchBoxViewAppCompat
@ -38,6 +42,7 @@ class SearchFragment : BaseFragment() {
savedInstanceState: Bundle?
): View? {
binding = FragmentSearchBinding.inflate(layoutInflater)
searchDetailBinding = FragmentSearchDetailBinding.inflate(layoutInflater)
return binding.root
}
@ -51,19 +56,10 @@ class SearchFragment : BaseFragment() {
connection += viewModel.searchBox.connectView(searchBoxView)
connection += viewModel.stats.connectView(statsView, StatsPresenterImpl())
searchResultAdapter = SearchResultAdapter(
SearchResultListener { name ->
searchBoxView.setText(name)
viewModel.getSearchWeather(name)
observeViewModel(name)
}
)
searchBoxView.onQuerySubmitted = {
binding.zeroHits.visibility = View.GONE
if (it != null && it.isNotEmpty()) {
viewModel.getSearchWeather(it)
observeViewModel(it)
}
}
@ -71,26 +67,25 @@ class SearchFragment : BaseFragment() {
recyclerView.layoutManager = LinearLayoutManager(requireContext())
recyclerView.adapter = searchResultAdapter
viewModel.locations.observe(viewLifecycleOwner) { hits ->
searchResultAdapter.submitList(hits)
binding.zeroHits.isVisible = hits.size == 0
searchDetailBinding.fabClose.setOnClickListener {
if (bottomSheetDialog.isShowing)
bottomSheetDialog.dismiss()
}
}
private fun observeViewModel(location: String) {
with(viewModel) {
locations.observe(viewLifecycleOwner) { hits ->
searchResultAdapter.submitList(hits)
binding.zeroHits.isVisible = hits.size == 0
}
weatherInfo.observe(viewLifecycleOwner) { weather ->
if (weather != null) {
val weatherValue = weather.apply {
weather?.let {
val formattedWeather = it.apply {
this.networkWeatherCondition.temp =
convertKelvinToCelsius(this.networkWeatherCondition.temp)
}
val action =
SearchFragmentDirections.actionSearchFragmentToSearchDetailFragment(
weatherValue,
location
)
findNavController().navigate(action)
displayWeatherResult(formattedWeather)
}
}
@ -108,10 +103,30 @@ class SearchFragment : BaseFragment() {
}
}
}
}
private fun displayWeatherResult(result: Weather) {
with(searchDetailBinding) {
weatherCondition = result.networkWeatherDescription.first()
location.text = result.name
weather = result
}
with(bottomSheetDialog) {
setCancelable(true)
setContentView(searchDetailBinding.root)
show()
}
}
override fun onDestroyView() {
super.onDestroyView()
connection.disconnect()
}
override fun onSearchResultClicked(searchResult: SearchResult) {
searchBoxView.setText(searchResult.name)
viewModel.getSearchWeather(searchResult.name)
}
}

View File

@ -23,6 +23,7 @@ import com.mayokunadeniyi.instantweather.utils.ALGOLIA_INDEX_NAME
import com.mayokunadeniyi.instantweather.utils.Result
import com.mayokunadeniyi.instantweather.utils.asLiveData
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
/**
@ -82,6 +83,7 @@ class SearchFragmentViewModel @Inject constructor(private val repository: Weathe
is Result.Success -> {
_isLoading.value = false
if (result.data != null) {
Timber.i("Mayokun Result ${result.data}")
_dataFetchState.value = true
_weatherInfo.postValue(result.data)
} else {

View File

@ -12,7 +12,7 @@ import com.mayokunadeniyi.instantweather.databinding.ItemSearchResultBinding
* Created by Mayokun Adeniyi on 28/04/2020.
*/
class SearchResultAdapter(private val clickListener: SearchResultListener) : PagedListAdapter<SearchResult, SearchResultAdapter.ViewHolder>(SearchResultDiffCallBack()) {
class SearchResultAdapter(private val delegate: OnItemClickedListener) : PagedListAdapter<SearchResult, SearchResultAdapter.ViewHolder>(SearchResultDiffCallBack()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder.from(parent)
}
@ -21,7 +21,7 @@ class SearchResultAdapter(private val clickListener: SearchResultListener) : Pag
val searchResult = getItem(position)
if (searchResult != null) {
holder.itemView.setOnClickListener {
clickListener.onClick(searchResult)
delegate.onSearchResultClicked(searchResult)
}
holder.bind(searchResult)
}
@ -51,8 +51,7 @@ class SearchResultAdapter(private val clickListener: SearchResultListener) : Pag
}
}
// Onclick listener util class
class SearchResultListener(val clickListener: (name: String) -> Unit) {
fun onClick(searchResult: SearchResult) = clickListener(searchResult.name)
interface OnItemClickedListener {
fun onSearchResultClicked(searchResult: SearchResult)
}
}

View File

@ -1,41 +0,0 @@
package com.mayokunadeniyi.instantweather.ui.searchdetail
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import com.mayokunadeniyi.instantweather.databinding.FragmentSearchDetailBinding
import com.mayokunadeniyi.instantweather.ui.BaseFragment
import com.mayokunadeniyi.instantweather.ui.MainActivity
/**
* A simple [Fragment] subclass.
*/
class SearchDetailFragment : BaseFragment() {
private lateinit var binding: FragmentSearchDetailBinding
private val searchDetailFragmentArgs by navArgs<SearchDetailFragmentArgs>()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentSearchDetailBinding.inflate(layoutInflater)
val weather = searchDetailFragmentArgs.searchWeatherResult
val location = searchDetailFragmentArgs.location
if (weather != null && location != null) {
binding.weather = weather
binding.weatherCondition = weather.networkWeatherDescription.first()
binding.location.text = location
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.fabClose.setOnClickListener { activity?.onBackPressed() }
}
}

View File

@ -0,0 +1,20 @@
package com.mayokunadeniyi.instantweather.utils
import android.app.Activity
import com.google.android.material.bottomsheet.BottomSheetDialog
/**
* Created by Mayokun Adeniyi on 7/24/21.
*/
class BaseBottomSheetDialog(private val activity: Activity, theme: Int) :
BottomSheetDialog(activity, theme) {
override fun onStart() {
super.onStart()
this.window?.let {
it.callback = UserInteractionAwareCallback(it.callback, activity)
}
}
}

View File

@ -7,7 +7,7 @@ import com.mayokunadeniyi.instantweather.BuildConfig
*/
const val GPS_REQUEST_CHECK_SETTINGS = 102
const val ALGOLIA_INDEX_NAME = "prod_LOCATIONS"
const val ALGOLIA_INDEX_NAME = "prod_LOCATIONS_V2"
const val API_KEY = BuildConfig.API_KEY
// Used for the LocationLiveData

View File

@ -0,0 +1,13 @@
package com.mayokunadeniyi.instantweather.utils
import java.text.SimpleDateFormat
/**
* Created by Mayokun Adeniyi on 7/24/21.
*/
fun String.formatDate(): String {
val parser = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val formatter = SimpleDateFormat("d MMM y, h:mma")
return formatter.format(parser.parse(this))
}

View File

@ -36,7 +36,6 @@ class GpsUtil(private val context: Context) {
.checkLocationSettings(locationSettingsRequest)
.addOnSuccessListener(context as Activity) {
OnGpsListener?.gpsStatus(true)
}.addOnFailureListener {
}.addOnFailureListener(context) { exception ->
when ((exception as ApiException).statusCode) {

View File

@ -1,34 +1,14 @@
package com.mayokunadeniyi.instantweather.utils
import android.view.View
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import java.text.DecimalFormat
/**
* Created by Mayokun Adeniyi on 30/03/2020.
*/
/**
* This function converts a [number] from Kelvin to Celsius by using [DecimalFormat] and
* converting it to a [Double] then subtracting 273 from it.
* @param number the number to be converted to Celsius.
*/
fun convertKelvinToCelsius(number: Number): Double {
return DecimalFormat().run {
applyPattern(".##")
parse(format(number.toDouble().minus(273))).toDouble()
}
}
fun convertCelsiusToFahrenheit(celsius: Double): Double {
return DecimalFormat().run {
applyPattern(".##")
parse(format(celsius.times(1.8).plus(32))).toDouble()
}
}
/**
* This functions helps in transforming a [MutableLiveData] of type [T]

View File

@ -1,7 +1,5 @@
package com.mayokunadeniyi.instantweather.utils
import java.lang.Exception
/**
* Created by Mayokun Adeniyi on 23/05/2020.
*/

View File

@ -0,0 +1,26 @@
package com.mayokunadeniyi.instantweather.utils
import java.text.DecimalFormat
/**
* Created by Mayokun Adeniyi on 7/24/21.
*/
/**
* This function converts a [number] from Kelvin to Celsius by using [DecimalFormat] and
* converting it to a [Double] then subtracting 273 from it.
* @param number the number to be converted to Celsius.
*/
fun convertKelvinToCelsius(number: Number): Double {
return DecimalFormat().run {
applyPattern(".##")
parse(format(number.toDouble().minus(273))).toDouble()
}
}
fun convertCelsiusToFahrenheit(celsius: Double): Double {
return DecimalFormat().run {
applyPattern(".##")
parse(format(celsius.times(1.8).plus(32))).toDouble()
}
}

View File

@ -0,0 +1,126 @@
package com.mayokunadeniyi.instantweather.utils
import android.annotation.TargetApi
import android.app.Activity
import android.os.Build
import android.view.ActionMode
import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.MotionEvent
import android.view.SearchEvent
import android.view.View
import android.view.Window
import android.view.WindowManager
import android.view.accessibility.AccessibilityEvent
import androidx.annotation.Nullable
/**
* Created by Mayokun Adeniyi on 22/02/2021.
*/
class UserInteractionAwareCallback(
private val originalCallback: Window.Callback,
private val activity: Activity?
) : Window.Callback {
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
return originalCallback.dispatchKeyEvent(event)
}
override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {
return originalCallback.dispatchKeyShortcutEvent(event)
}
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP -> activity?.onUserInteraction()
}
return originalCallback.dispatchTouchEvent(event)
}
override fun dispatchTrackballEvent(event: MotionEvent): Boolean {
return originalCallback.dispatchTrackballEvent(event)
}
override fun dispatchGenericMotionEvent(event: MotionEvent): Boolean {
return originalCallback.dispatchGenericMotionEvent(event)
}
override fun dispatchPopulateAccessibilityEvent(event: AccessibilityEvent): Boolean {
return originalCallback.dispatchPopulateAccessibilityEvent(event)
}
@Nullable
override fun onCreatePanelView(featureId: Int): View? {
return originalCallback.onCreatePanelView(featureId)
}
override fun onCreatePanelMenu(featureId: Int, menu: Menu): Boolean {
return originalCallback.onCreatePanelMenu(featureId, menu)
}
override fun onPreparePanel(featureId: Int, view: View?, menu: Menu): Boolean {
return originalCallback.onPreparePanel(featureId, view, menu)
}
override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
return originalCallback.onMenuOpened(featureId, menu)
}
override fun onMenuItemSelected(featureId: Int, item: MenuItem): Boolean {
return originalCallback.onMenuItemSelected(featureId, item)
}
override fun onWindowAttributesChanged(attrs: WindowManager.LayoutParams) {
originalCallback.onWindowAttributesChanged(attrs)
}
override fun onContentChanged() {
originalCallback.onContentChanged()
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
originalCallback.onWindowFocusChanged(hasFocus)
}
override fun onAttachedToWindow() {
originalCallback.onAttachedToWindow()
}
override fun onDetachedFromWindow() {
originalCallback.onDetachedFromWindow()
}
override fun onPanelClosed(featureId: Int, menu: Menu) {
originalCallback.onPanelClosed(featureId, menu)
}
override fun onSearchRequested(): Boolean {
return originalCallback.onSearchRequested()
}
@TargetApi(Build.VERSION_CODES.M)
override fun onSearchRequested(searchEvent: SearchEvent): Boolean {
return originalCallback.onSearchRequested(searchEvent)
}
@Nullable
override fun onWindowStartingActionMode(callback: ActionMode.Callback): ActionMode?{
return originalCallback.onWindowStartingActionMode(callback)
}
@TargetApi(Build.VERSION_CODES.M)
@Nullable
override fun onWindowStartingActionMode(callback: ActionMode.Callback, type: Int): ActionMode? {
return originalCallback.onWindowStartingActionMode(callback, type)
}
override fun onActionModeStarted(mode: ActionMode) {
originalCallback.onActionModeStarted(mode)
}
override fun onActionModeFinished(mode: ActionMode) {
originalCallback.onActionModeFinished(mode)
}
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/colorBottomSheetDialog" />
<corners android:topLeftRadius="32dp"
android:topRightRadius="32dp"/>
</shape>
</item>
</selector>

View File

@ -38,14 +38,13 @@
app:layout_anchorGravity="center_horizontal|top"
/>
<com.google.android.material.card.MaterialCardView
<LinearLayout
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_marginTop="48dp"
android:layout_marginBottom="-32dp"
app:cardCornerRadius="24dp">
android:background="@drawable/bottom_sheet_dialog_top_background">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
@ -245,7 +244,7 @@
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@ -69,5 +69,10 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/location_search_recyclerview" />
<include
android:id="@+id/toolbar"
android:visibility="gone"
layout="@layout/fragment_search_detail" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@ -38,15 +38,14 @@
app:layout_anchorGravity="center_horizontal|top"
/>
<com.google.android.material.card.MaterialCardView
<LinearLayout
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_marginTop="48dp"
android:layout_marginBottom="-32dp"
app:cardCornerRadius="24dp"
android:backgroundTint="@color/primaryLightColor">
android:background="@drawable/bottom_sheet_dialog_top_background"
>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
@ -86,7 +85,7 @@
android:id="@+id/imageView12"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:tint="#FFFFFF"
app:tint="#FFFFFF"
app:layout_constraintEnd_toStartOf="@+id/imageView11"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
@ -96,7 +95,7 @@
android:id="@+id/imageView11"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:tint="#FFFFFF"
app:tint="#FFFFFF"
app:layout_constraintEnd_toStartOf="@+id/imageView10"
app:layout_constraintStart_toEndOf="@id/imageView12"
app:layout_constraintTop_toTopOf="parent"
@ -106,7 +105,7 @@
android:id="@+id/imageView10"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:tint="#FFFFFF"
app:tint="#FFFFFF"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/imageView11"
app:layout_constraintTop_toTopOf="parent"
@ -246,7 +245,7 @@
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Some files were not shown because too many files have changed in this diff Show More