mirror of
https://github.com/mayokunadeniyi/Instant-Weather.git
synced 2025-05-17 05:15:55 +08:00
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:
28
.github/workflows/android_build.yml
vendored
28
.github/workflows/android_build.yml
vendored
@ -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
118
.gitignore
vendored
@ -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
2
.idea/compiler.xml
generated
@ -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>
|
7
.idea/dictionaries/user.xml
generated
7
.idea/dictionaries/user.xml
generated
@ -1,7 +0,0 @@
|
||||
<component name="ProjectDictionaryState">
|
||||
<dictionary name="user">
|
||||
<words>
|
||||
<w>algolia</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
</component>
|
30
.idea/jarRepositories.xml
generated
30
.idea/jarRepositories.xml
generated
@ -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
2
.idea/misc.xml
generated
@ -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
10
.idea/runConfigurations.xml
generated
Normal 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>
|
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/buildSrc.jar
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/buildSrc.jar
generated
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/constants.tab
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/constants.tab
generated
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/file-to-id.tab
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/file-to-id.tab
generated
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/id-to-file.tab
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/id-to-file.tab
generated
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/last-build.bin
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/last-build.bin
generated
Normal file
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/lookups.tab
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/lookups.tab
generated
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/lookups.tab_i
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/lookups.tab_i
generated
Normal file
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/proto.tab
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/proto.tab
generated
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/proto.tab.len
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/proto.tab.len
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/proto.tab_i
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/proto.tab_i
generated
Normal file
Binary file not shown.
@ -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
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/subtypes.tab
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/subtypes.tab
generated
Normal file
Binary file not shown.
Binary file not shown.
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/supertypes.tab
generated
Normal file
BIN
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021,_17_46_[Default_Changelist]/supertypes.tab
generated
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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">
|
4
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021__17_54__Default_Changelist_.xml
generated
Normal file
4
.idea/shelf/Uncommitted_changes_before_Checkout_at_24_07_2021__17_54__Default_Changelist_.xml
generated
Normal 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
6
.idea/vcs.xml
generated
@ -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>
|
@ -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")
|
||||
|
@ -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"
|
||||
}
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -9,7 +9,6 @@ import kotlinx.android.parcel.Parcelize
|
||||
|
||||
@Parcelize
|
||||
data class Weather(
|
||||
|
||||
val uId: Int,
|
||||
val cityId: Int,
|
||||
val name: String,
|
||||
|
@ -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,
|
||||
|
||||
|
@ -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
|
||||
|
||||
/**
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
)
|
||||
|
@ -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
|
||||
|
||||
/**
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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() }
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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))
|
||||
}
|
@ -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) {
|
||||
|
@ -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]
|
@ -1,7 +1,5 @@
|
||||
package com.mayokunadeniyi.instantweather.utils
|
||||
|
||||
import java.lang.Exception
|
||||
|
||||
/**
|
||||
* Created by Mayokun Adeniyi on 23/05/2020.
|
||||
*/
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
@ -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>
|
@ -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>
|
@ -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>
|
||||
|
@ -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
Reference in New Issue
Block a user