diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..132652d --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..bdd9278 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/render.experimental.xml b/.idea/render.experimental.xml new file mode 100644 index 0000000..8ec256a --- /dev/null +++ b/.idea/render.experimental.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..a774788 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,2 @@ +/build + diff --git a/app/agconnect-services.json b/app/agconnect-services.json new file mode 100644 index 0000000..1ced9f8 --- /dev/null +++ b/app/agconnect-services.json @@ -0,0 +1,96 @@ +{ + "agcgw":{ + "backurl":"connect-dre.hispace.hicloud.com", + "url":"connect-dre.dbankcloud.cn", + "websocketbackurl":"connect-ws-dre.hispace.dbankcloud.com", + "websocketurl":"connect-ws-dre.hispace.dbankcloud.cn" + }, + "agcgw_all":{ + "CN":"connect-drcn.dbankcloud.cn", + "CN_back":"connect-drcn.hispace.hicloud.com", + "DE":"connect-dre.dbankcloud.cn", + "DE_back":"connect-dre.hispace.hicloud.com", + "RU":"connect-drru.hispace.dbankcloud.ru", + "RU_back":"connect-drru.hispace.dbankcloud.cn", + "SG":"connect-dra.dbankcloud.cn", + "SG_back":"connect-dra.hispace.hicloud.com" + }, + "websocketgw_all":{ + "CN":"connect-ws-drcn.hispace.dbankcloud.cn", + "CN_back":"connect-ws-drcn.hispace.dbankcloud.com", + "DE":"connect-ws-dre.hispace.dbankcloud.cn", + "DE_back":"connect-ws-dre.hispace.dbankcloud.com", + "RU":"connect-ws-drru.hispace.dbankcloud.ru", + "RU_back":"connect-ws-drru.hispace.dbankcloud.cn", + "SG":"connect-ws-dra.hispace.dbankcloud.cn", + "SG_back":"connect-ws-dra.hispace.dbankcloud.com" + }, + "client":{ + "cp_id":"5190090000027233428", + "product_id":"388421841221594193", + "client_id":"1208686362102877696", + "client_secret":"E8C0A5510A899BD515E798AFB4BFD4EDAB593793C4511E1BD45789F4AAB5F8B9", + "project_id":"388421841221594193", + "app_id":"108818901", + "api_key":"DAEDAFGgnviLqr3jHW/GIDD8LwJQpNqTnrnBB20Nuct9UW4rGgV4LE8ATIECc93Lb4LABT9fAWSBkr4Q39ZOIAJZOPWH49heH0Jwhw==", + "package_name":"com.tugcearas.pharmacyapp" + }, + "oauth_client":{ + "client_id":"108818901", + "client_type":1 + }, + "app_info":{ + "app_id":"108818901", + "package_name":"com.tugcearas.pharmacyapp" + }, + "service":{ + "analytics":{ + "collector_url":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn", + "collector_url_ru":"datacollector-drru.dt.dbankcloud.ru,datacollector-drru.dt.hicloud.com", + "collector_url_sg":"datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn", + "collector_url_de":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn", + "collector_url_cn":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn", + "resource_id":"p1", + "channel_id":"" + }, + "edukit":{ + "edu_url":"edukit.edu.cloud.huawei.com.cn", + "dh_url":"edukit.edu.cloud.huawei.com.cn" + }, + "search":{ + "url":"https://search-dre.cloud.huawei.com" + }, + "cloudstorage":{ + "storage_url_sg_back":"https://agc-storage-dra.cloud.huawei.asia", + "storage_url_ru_back":"https://agc-storage-drru.cloud.huawei.ru", + "storage_url_ru":"https://agc-storage-drru.cloud.huawei.ru", + "storage_url_de_back":"https://agc-storage-dre.cloud.huawei.eu", + "storage_url_de":"https://ops-dre.agcstorage.link", + "storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn", + "storage_url_sg":"https://ops-dra.agcstorage.link", + "storage_url_cn_back":"https://agc-storage-drcn.cloud.huawei.com.cn", + "storage_url_cn":"https://agc-storage-drcn.platform.dbankcloud.cn" + }, + "ml":{ + "mlservice_url":"ml-api-dre.ai.dbankcloud.com,ml-api-dre.ai.dbankcloud.cn" + } + }, + "region":"DE", + "configuration_version":"3.0", + "appInfos":[ + { + "package_name":"com.tugcearas.pharmacyapp", + "client":{ + "app_id":"108818901" + }, + "app_info":{ + "package_name":"com.tugcearas.pharmacyapp", + "app_id":"108818901" + }, + "oauth_client":{ + "client_type":1, + "client_id":"108818901" + } + } + ] +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..c04ed94 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,116 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +// id 'androidx.navigation.safeargs.kotlin' + id 'com.huawei.agconnect' + id 'kotlin-kapt' + id 'com.google.dagger.hilt.android' +} + +android { + namespace 'com.tugcearas.pharmacyapp' + compileSdk 33 + + signingConfigs { + config { + storeFile file('tugcearas.jks') + storePassword '123456' + keyAlias = 'key1' + keyPassword '123456' + } + } + + defaultConfig { + applicationId "com.tugcearas.pharmacyapp" + minSdk 24 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + debug { + debuggable true + signingConfig signingConfigs.config + } + release { + signingConfig signingConfigs.config + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = '11' + } + + buildFeatures{ + viewBinding true + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.9.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + + // Navigation + def nav_version = "2.6.0" + implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" + implementation "androidx.navigation:navigation-ui-ktx:$nav_version" + + // Hilt + implementation "com.google.dagger:hilt-android:2.44" + kapt "com.google.dagger:hilt-compiler:2.44" + + // Retrofit + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + + // Coroutine + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") + + // Coroutine Scope + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' + + // SSP-SDP + implementation 'com.intuit.sdp:sdp-android:1.1.0' + implementation 'com.intuit.ssp:ssp-android:1.1.0' + + // Lottie + def lottieVersion = "3.4.0" + implementation "com.airbnb.android:lottie:$lottieVersion" + + // Account Kit + implementation 'com.huawei.hms:hwid:6.11.0.300' + implementation 'com.huawei.hms:hmscoreinstaller:6.11.0.301' + + // Ads Kit + implementation 'com.huawei.hms:ads-prime:3.4.65.300' + + // Map Kit + implementation 'com.huawei.hms:maps:6.11.0.304' + implementation 'com.huawei.hms:maps-basic:6.11.0.304' + + // Location Kit + implementation 'com.huawei.hms:location:6.11.0.301' + + // Site Kit + implementation 'com.huawei.hms:site:6.5.1.301' + + // Analytics Kit + implementation 'com.huawei.hms:hianalytics:6.10.0.302' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..540e3ae --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,23 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile +-keep class com.huawei.openalliance.ad.** { *; } +-keep class com.huawei.hms.ads.** { *; } \ No newline at end of file diff --git a/app/release/app-release.apk b/app/release/app-release.apk new file mode 100644 index 0000000..0dd42d7 Binary files /dev/null and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..c2aac2e --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.tugcearas.pharmacyapp", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/tugcearas/pharmacyapp/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/tugcearas/pharmacyapp/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..95f1c1b --- /dev/null +++ b/app/src/androidTest/java/com/tugcearas/pharmacyapp/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.tugcearas.pharmacyapp + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.pharmacyapp", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7b405b6 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_logo-playstore.png b/app/src/main/ic_logo-playstore.png new file mode 100644 index 0000000..d609481 Binary files /dev/null and b/app/src/main/ic_logo-playstore.png differ diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/data/model/Data.kt b/app/src/main/java/com/tugcearas/pharmacyapp/data/model/Data.kt new file mode 100644 index 0000000..383e7dd --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/data/model/Data.kt @@ -0,0 +1,21 @@ +package com.tugcearas.pharmacyapp.data.model + +import com.google.gson.annotations.SerializedName + +data class Data( + + @SerializedName("Adresi") + val address: String, + + @SerializedName("EczaneAdi") + val pharmacyName: String, + + @SerializedName("Sehir") + val city: String, + + @SerializedName("Telefon") + val phoneNumber: String, + + @SerializedName("ilce") + val county: String +) \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/data/model/PharmacyModel.kt b/app/src/main/java/com/tugcearas/pharmacyapp/data/model/PharmacyModel.kt new file mode 100644 index 0000000..4aaa0d7 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/data/model/PharmacyModel.kt @@ -0,0 +1,5 @@ +package com.tugcearas.pharmacyapp.data.model + +data class PharmacyModel( + val data: List +) \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/data/repo/PharmacyRepo.kt b/app/src/main/java/com/tugcearas/pharmacyapp/data/repo/PharmacyRepo.kt new file mode 100644 index 0000000..bbee9cb --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/data/repo/PharmacyRepo.kt @@ -0,0 +1,14 @@ +package com.tugcearas.pharmacyapp.data.repo + +import com.tugcearas.pharmacyapp.data.source.PharmacyApi +import com.tugcearas.pharmacyapp.util.resource.Resource +import javax.inject.Inject + +class PharmacyRepo @Inject constructor(private val api: PharmacyApi) { + + suspend fun getPharmacyList() = try { + Resource.Success(api.getList().body()?.data.orEmpty()) + } catch (e: Exception) { + Resource.Error(e.message.orEmpty()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/data/source/PharmacyApi.kt b/app/src/main/java/com/tugcearas/pharmacyapp/data/source/PharmacyApi.kt new file mode 100644 index 0000000..fc1fcee --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/data/source/PharmacyApi.kt @@ -0,0 +1,12 @@ +package com.tugcearas.pharmacyapp.data.source + +import com.tugcearas.pharmacyapp.data.model.PharmacyModel +import com.tugcearas.pharmacyapp.util.constants.Constants +import retrofit2.Response +import retrofit2.http.GET + +interface PharmacyApi { + + @GET(Constants.GET_LIST) + suspend fun getList() : Response +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/di/AppModule.kt b/app/src/main/java/com/tugcearas/pharmacyapp/di/AppModule.kt new file mode 100644 index 0000000..c4a3773 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/di/AppModule.kt @@ -0,0 +1,31 @@ +package com.tugcearas.pharmacyapp.di + +import com.tugcearas.pharmacyapp.data.source.PharmacyApi +import com.tugcearas.pharmacyapp.util.constants.Constants +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object AppModule { + + @Provides + @Singleton + fun provideRetrofitInstance():Retrofit{ + return Retrofit.Builder() + .baseUrl(Constants.BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build() + } + + @Provides + @Singleton + fun provideApi(retrofit: Retrofit):PharmacyApi{ + return retrofit.create(PharmacyApi::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/di/MyApplication.kt b/app/src/main/java/com/tugcearas/pharmacyapp/di/MyApplication.kt new file mode 100644 index 0000000..a67c6f3 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/di/MyApplication.kt @@ -0,0 +1,24 @@ +package com.tugcearas.pharmacyapp.di + +import android.app.Application +import com.huawei.hms.ads.HwAds +import com.huawei.hms.analytics.HiAnalytics +import com.huawei.hms.maps.MapsInitializer +import com.tugcearas.pharmacyapp.util.constants.Constants +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class MyApplication: Application(){ + override fun onCreate() { + super.onCreate() + + HwAds.init(this) + + // Set the API key (map kit) + MapsInitializer.initialize(this) + MapsInitializer.setApiKey(Constants.APP_GALLERY_PROJECT_API) + + // init analytic + HiAnalytics.getInstance(this) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/ui/activity/MainActivity.kt b/app/src/main/java/com/tugcearas/pharmacyapp/ui/activity/MainActivity.kt new file mode 100644 index 0000000..bfa56bf --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/ui/activity/MainActivity.kt @@ -0,0 +1,55 @@ +package com.tugcearas.pharmacyapp.ui.activity + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.core.content.ContextCompat +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.ui.NavigationUI +import com.huawei.hms.ads.AdParam +import com.huawei.hms.ads.BannerAdSize +import com.huawei.hms.ads.HwAds +import com.huawei.hms.ads.banner.BannerView +import com.tugcearas.pharmacyapp.R +import com.tugcearas.pharmacyapp.databinding.ActivityMainBinding +import com.tugcearas.pharmacyapp.util.extensions.gone +import com.tugcearas.pharmacyapp.util.extensions.visible +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MainActivity : AppCompatActivity() { + + private lateinit var binding: ActivityMainBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment + val navController: NavController = navHostFragment.navController + NavigationUI.setupWithNavController(binding.bottomNavView,navController) + + navController.addOnDestinationChangedListener{_ , destination, _ -> + when(destination.id){ + R.id.splashScreen -> { + window.statusBarColor = ContextCompat.getColor(this, R.color.white) + binding.bottomNavView.gone() + } + R.id.loginScreen -> { + binding.bottomNavView.gone() + window.statusBarColor = ContextCompat.getColor(this, R.color.main_color) + } + R.id.mapScreen -> { + binding.bottomNavView.gone() + window.statusBarColor = ContextCompat.getColor(this, R.color.main_color) + } + else -> { + window.statusBarColor = ContextCompat.getColor(this, R.color.main_color) + binding.bottomNavView.visible() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/ui/analytic/Analytic.kt b/app/src/main/java/com/tugcearas/pharmacyapp/ui/analytic/Analytic.kt new file mode 100644 index 0000000..4206aae --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/ui/analytic/Analytic.kt @@ -0,0 +1,58 @@ +package com.tugcearas.pharmacyapp.ui.analytic + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.huawei.hms.analytics.HiAnalytics +import com.huawei.hms.analytics.type.HAEventType +import com.huawei.hms.analytics.type.HAParamType +import com.huawei.hms.analytics.type.ReportPolicy +import com.tugcearas.pharmacyapp.R + +class Analytic : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + val context = requireContext().applicationContext + val instance = HiAnalytics.getInstance(context) + + // Set the ON_MOVE_BACKGROUND_POLICY and ON_SCHEDULED_TIME_POLICY + val moveBackgroundPolicy = ReportPolicy.ON_MOVE_BACKGROUND_POLICY + val scheduledTimePolicy = ReportPolicy.ON_SCHEDULED_TIME_POLICY + scheduledTimePolicy.threshold = 600 + val reportPolicies = HashSet() + with(reportPolicies){ + add(scheduledTimePolicy) + add(moveBackgroundPolicy) + } + instance.setReportPolicies(reportPolicies) + + val bundle = Bundle() + with(bundle){ + putString("exam_difficulty", "high") + putString("exam_level", "1-1") + putString("exam_time", "20190520-08") + } + instance.onEvent("begin_examination", bundle) + + val bundlePredefined = Bundle() + with(bundlePredefined){ + putString(HAParamType.PRODUCTID, "item_ID") + putString(HAParamType.PRODUCTNAME, "name") + putString(HAParamType.CATEGORY, "category") + putLong(HAParamType.QUANTITY, 100L) + putDouble(HAParamType.PRICE, 10.01) + putDouble(HAParamType.REVENUE, 10.0) + putString(HAParamType.CURRNAME, "currency") + putString(HAParamType.PLACEID, "location_ID") + } + instance.onEvent(HAEventType.ADDPRODUCT2WISHLIST, bundlePredefined) + + return inflater.inflate(R.layout.fragment_analytic, container, false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/ui/home/HomeScreen.kt b/app/src/main/java/com/tugcearas/pharmacyapp/ui/home/HomeScreen.kt new file mode 100644 index 0000000..b5a3aa6 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/ui/home/HomeScreen.kt @@ -0,0 +1,65 @@ +package com.tugcearas.pharmacyapp.ui.home + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import com.huawei.hms.ads.AdParam +import com.huawei.hms.ads.BannerAdSize +import com.huawei.hms.ads.banner.BannerView +import com.tugcearas.pharmacyapp.data.model.Data +import com.tugcearas.pharmacyapp.databinding.FragmentHomeScreenBinding +import com.tugcearas.pharmacyapp.ui.home.adapter.PharmacyAdapter +import com.tugcearas.pharmacyapp.util.extensions.gone +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class HomeScreen : Fragment() { + + private lateinit var binding: FragmentHomeScreenBinding + private lateinit var bannerView: BannerView + private val homeViewModel: HomeVM by viewModels() + private val homeAdapter by lazy { PharmacyAdapter() } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentHomeScreenBinding.inflate(inflater, container, false) + + bannerView = binding.hwBannerView + with(bannerView){ + adId = "testw6vs28auh3" + bannerAdSize = BannerAdSize.BANNER_SIZE_360_57 + setBannerRefresh(10) + } + val adParam = AdParam.Builder().build() + bannerView.loadAd(adParam) + + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initObserve() + } + + private fun createAdapter(pharmacy: List){ + binding.rvHome.adapter = homeAdapter + homeAdapter.submitList(pharmacy) + } + + private fun initObserve(){ + homeViewModel.getPharmacyList.observe(viewLifecycleOwner){ + it.data?.let { getData -> createAdapter(getData) } + binding.homeProgressBar.gone() + } + } + + override fun onDestroyView() { + super.onDestroyView() + bannerView.destroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/ui/home/HomeVM.kt b/app/src/main/java/com/tugcearas/pharmacyapp/ui/home/HomeVM.kt new file mode 100644 index 0000000..0acacad --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/ui/home/HomeVM.kt @@ -0,0 +1,31 @@ +package com.tugcearas.pharmacyapp.ui.home + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.tugcearas.pharmacyapp.data.model.Data +import com.tugcearas.pharmacyapp.data.repo.PharmacyRepo +import com.tugcearas.pharmacyapp.util.resource.Resource +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class HomeVM @Inject constructor(private val pharmacyRepo: PharmacyRepo): ViewModel() { + + val getPharmacyList: MutableLiveData>> = MutableLiveData() + + init { + getList() + } + + private fun getList() = viewModelScope.launch { + getPharmacyList.postValue(handleResponse(pharmacyRepo.getPharmacyList())) + } + + private fun handleResponse(response:Resource>) = when(response){ + is Resource.Loading -> Resource.Loading() + is Resource.Success -> Resource.Success(response.data.orEmpty()) + is Resource.Error -> Resource.Error(response.message.orEmpty()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/ui/home/adapter/PharmacyAdapter.kt b/app/src/main/java/com/tugcearas/pharmacyapp/ui/home/adapter/PharmacyAdapter.kt new file mode 100644 index 0000000..450e734 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/ui/home/adapter/PharmacyAdapter.kt @@ -0,0 +1,47 @@ +package com.tugcearas.pharmacyapp.ui.home.adapter + +import android.content.Intent +import android.net.Uri +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.tugcearas.pharmacyapp.data.model.Data +import com.tugcearas.pharmacyapp.databinding.HomeItemBinding +import com.tugcearas.pharmacyapp.util.diffutil.DiffUtilCallback +import com.tugcearas.pharmacyapp.util.extensions.click + +class PharmacyAdapter: ListAdapter( + DiffUtilCallback( + itemsTheSame = { oldItem, newItem -> + oldItem == newItem + }, + contentsTheSame = { oldItem, newItem -> + oldItem == newItem + } + ) +) { + + inner class PharmacyViewHolder(private val binding: HomeItemBinding): RecyclerView.ViewHolder(binding.root){ + + fun bind(pharmacy: Data) = with(binding){ + tvPharmacyName.text = pharmacy.pharmacyName + tvPharmacyAddress.text = pharmacy.address + tvPharmacyPhone.text = pharmacy.phoneNumber + tvPharmacyCity.text = pharmacy.city + " /" + tvPharmacyCounty.text = pharmacy.county + btnPhone.click { + val phoneNumber = pharmacy.phoneNumber + val intent = Intent(Intent.ACTION_DIAL) + intent.data = Uri.parse("tel:$phoneNumber") + btnPhone.context.startActivity(intent) + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = PharmacyViewHolder ( + HomeItemBinding.inflate(LayoutInflater.from(parent.context),parent,false) + ) + + override fun onBindViewHolder(holder: PharmacyViewHolder, position: Int) = holder.bind(currentList[position]) +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/ui/login/LoginScreen.kt b/app/src/main/java/com/tugcearas/pharmacyapp/ui/login/LoginScreen.kt new file mode 100644 index 0000000..8a1e4f5 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/ui/login/LoginScreen.kt @@ -0,0 +1,60 @@ +package com.tugcearas.pharmacyapp.ui.login + +import android.content.ContentValues.TAG +import android.content.Intent +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.fragment.findNavController +import com.huawei.hms.common.ApiException +import com.huawei.hms.support.account.AccountAuthManager +import com.huawei.hms.support.account.request.AccountAuthParams +import com.huawei.hms.support.account.request.AccountAuthParamsHelper +import com.huawei.hms.support.account.service.AccountAuthService +import com.tugcearas.pharmacyapp.R +import com.tugcearas.pharmacyapp.databinding.FragmentLoginScreenBinding +import com.tugcearas.pharmacyapp.util.extensions.click +import com.tugcearas.pharmacyapp.util.extensions.toastMessage + +class LoginScreen : Fragment() { + + private lateinit var binding: FragmentLoginScreenBinding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentLoginScreenBinding.inflate(inflater, container, false) + binding.btnLogin.click { huaweiSignIn() } + return binding.root + } + + private fun huaweiSignIn(){ + val authParams : AccountAuthParams = + AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).setIdToken().createParams() + + val service : AccountAuthService = AccountAuthManager.getService(requireActivity(), authParams) + startActivityForResult(service.signInIntent, 8888) + } + + @Deprecated("Deprecated in Java") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == 8888) { + val authAccountTask = AccountAuthManager.parseAuthResultFromIntent(data) + if (authAccountTask.isSuccessful) { + val authAccount = authAccountTask.result + Log.i(TAG, "idToken:" + authAccount.idToken) + Log.i(TAG, "accountFlag:" + authAccount.accountFlag) + findNavController().navigate(R.id.action_loginScreen_to_homeScreen) + requireContext().toastMessage(getString(R.string.login_successfully)) + } else { + Log.e(TAG, "sign in failed : " + (authAccountTask.exception as ApiException).statusCode) + requireContext().toastMessage(getString(R.string.login_unsuccessfully)) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/ui/map/MapScreen.kt b/app/src/main/java/com/tugcearas/pharmacyapp/ui/map/MapScreen.kt new file mode 100644 index 0000000..5178965 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/ui/map/MapScreen.kt @@ -0,0 +1,259 @@ +package com.tugcearas.pharmacyapp.ui.map + +import android.Manifest.permission.* +import android.content.ContentValues +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.RequiresPermission +import androidx.core.app.ActivityCompat +import androidx.navigation.fragment.findNavController +import com.huawei.hms.location.FusedLocationProviderClient +import com.huawei.hms.location.LocationServices +import com.huawei.hms.maps.HuaweiMap +import com.huawei.hms.maps.MapView +import com.huawei.hms.maps.OnMapReadyCallback +import com.huawei.hms.maps.model.BitmapDescriptorFactory +import com.huawei.hms.maps.model.LatLng +import com.huawei.hms.maps.model.Marker +import com.huawei.hms.maps.model.MarkerOptions +import com.huawei.hms.site.api.SearchResultListener +import com.huawei.hms.site.api.SearchService +import com.huawei.hms.site.api.SearchServiceFactory +import com.huawei.hms.site.api.model.* +import com.tugcearas.pharmacyapp.R +import com.tugcearas.pharmacyapp.databinding.FragmentMapScreenBinding +import com.tugcearas.pharmacyapp.util.constants.Constants +import com.tugcearas.pharmacyapp.util.extensions.toastMessageLong + +class MapScreen : Fragment(), OnMapReadyCallback { + + companion object { + private const val MAPVIEW_BUNDLE_KEY = "MapViewBundleKey" + private const val REQUEST_CODE_LOCATION_PERMISSION = 1 + } + + private lateinit var binding: FragmentMapScreenBinding + private var huaweiMap: HuaweiMap? = null + private var mMarker: Marker? = null + private lateinit var fusedLocationClient: FusedLocationProviderClient + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentMapScreenBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + requireContext().toastMessageLong(getString(R.string.map_screen_toast_message)) + + binding.toolbar.setNavigationOnClickListener { + findNavController().navigateUp() + } + + val mMapView: MapView = binding.mapview + var mapViewBundle: Bundle? = null + if (savedInstanceState != null) { + mapViewBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY) + } + mMapView.onCreate(mapViewBundle) + mMapView.getMapAsync(this) + + fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireContext()) + + Log.i(ContentValues.TAG, "sdk >= 23 M") + + if (ActivityCompat.checkSelfPermission( + requireContext(), + ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission( + requireContext(), + ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + val strings = arrayOf(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION) + ActivityCompat.requestPermissions( + requireActivity(), + strings, + REQUEST_CODE_LOCATION_PERMISSION + ) + } else { + + getAndAddCurrentLocation() + } + + getNearbyPlace() + } + + @RequiresPermission(allOf = [ACCESS_FINE_LOCATION, ACCESS_WIFI_STATE]) + override fun onMapReady(hMap: HuaweiMap?) { + if (hMap != null) { + huaweiMap = hMap + + if (ActivityCompat.checkSelfPermission( + requireContext(), + ACCESS_FINE_LOCATION + ) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission( + requireContext(), + ACCESS_COARSE_LOCATION + ) == PackageManager.PERMISSION_GRANTED + ) { + getAndAddCurrentLocation() + } + } + +// hMap?.isMyLocationEnabled = true ---> adding blue circle marker in map + hMap?.uiSettings?.isMyLocationButtonEnabled = true + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + var mapViewBundle: Bundle? = outState.getBundle(MAPVIEW_BUNDLE_KEY) + if (mapViewBundle == null) { + mapViewBundle = Bundle() + outState.putBundle(MAPVIEW_BUNDLE_KEY, mapViewBundle) + } + + binding.mapview.onSaveInstanceState(mapViewBundle) + } + + private fun getAndAddCurrentLocation() { + fusedLocationClient.lastLocation + .addOnSuccessListener { location -> + if (location != null) { + + val currentLatLng = LatLng(location.latitude, location.longitude) + + // remove previous marker + mMarker?.remove() + + mMarker = huaweiMap?.addMarker( + MarkerOptions() + .position(currentLatLng) + .title("Konumunuz") + .snippet("Buradasınız!") + ) + + huaweiMap?.moveCamera(com.huawei.hms.maps.CameraUpdateFactory.newLatLngZoom(currentLatLng, 15f)) + } else { + Log.e(ContentValues.TAG, "Location is null") + } + } + .addOnFailureListener { e -> + Log.e(ContentValues.TAG, "Error getting location: ${e.message}") + } + } + + private fun getNearbyPlace() { + val searchService: SearchService = SearchServiceFactory.create(requireContext(), Constants.APP_GALLERY_PROJECT_API) + val request = NearbySearchRequest() + + fusedLocationClient.lastLocation + .addOnSuccessListener { location -> + if (location != null) { + val coordinate = Coordinate(location.latitude, location.longitude) + request.location = coordinate + request.query = "pharmacy" + request.radius = 5000 + request.hwPoiType = HwLocationType.PHARMACY + request.language = "en" + request.pageIndex = 1 + request.pageSize = 5 + request.strictBounds = false + + val resultListener: SearchResultListener = object : SearchResultListener { + override fun onSearchResult(results: NearbySearchResponse?) { + if (results == null || results.totalCount <= 0) { + return + } + val sites: List? = results.sites + if (sites == null || sites.isEmpty()) { + return + } + for (site in sites) { + val pharmacyLatLng = LatLng(site.location.lat, site.location.lng) + + val markerIcon = BitmapDescriptorFactory.fromResource(R.drawable.pharmacy_icon) + + val marker = huaweiMap?.addMarker( + MarkerOptions() + .position(pharmacyLatLng) + .title(site.name) + .snippet(site.formatAddress) + .icon(markerIcon) + ) + // get destination + marker?.tag = "https://www.petalmaps.com/routes/?saddr=${mMarker?.position?.latitude},${mMarker?.position?.longitude}&daddr=${pharmacyLatLng.latitude},${pharmacyLatLng.longitude}&type=drive&utm_source=fb" + } + + // navigate to destination pharmacy + huaweiMap?.setOnMarkerClickListener { marker -> + val navigationUri = marker.tag as? String + if (navigationUri != null) { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(navigationUri)) + if (intent.resolveActivity(requireContext().packageManager) != null) { + startActivity(intent) + } else { + Log.e(ContentValues.TAG, "No navigation app found") + // You can show a message to the user here indicating no navigation app is installed. + } + } + true + } + } + + override fun onSearchError(status: SearchStatus) { + Log.i("TAG", "Error : ${status.errorCode} ${status.errorMessage}") + } + } + + searchService.nearbySearch(request, resultListener) + } else { + Log.e(ContentValues.TAG, "Location is null") + } + } + .addOnFailureListener { e -> + Log.e(ContentValues.TAG, "Error getting location: ${e.message}") + } + } + + override fun onStart() { + super.onStart() + binding.mapview.onStart() + } + + override fun onResume() { + super.onResume() + binding.mapview.onResume() + } + + override fun onPause() { + super.onPause() + binding.mapview.onPause() + } + + override fun onStop() { + super.onStop() + binding.mapview.onStop() + } + + override fun onDestroy() { + super.onDestroy() + binding.mapview.onDestroy() + } + + override fun onLowMemory() { + super.onLowMemory() + binding.mapview.onLowMemory() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/ui/splash/SplashScreen.kt b/app/src/main/java/com/tugcearas/pharmacyapp/ui/splash/SplashScreen.kt new file mode 100644 index 0000000..1dd4d94 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/ui/splash/SplashScreen.kt @@ -0,0 +1,27 @@ +package com.tugcearas.pharmacyapp.ui.splash + +import android.annotation.SuppressLint +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.fragment.findNavController +import com.tugcearas.pharmacyapp.R + +@SuppressLint("CustomSplashScreen") +class SplashScreen : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + Handler(Looper.getMainLooper()).postDelayed({ + val action = R.id.action_splashScreen_to_loginScreen + findNavController().navigate(action) + },3000) + return inflater.inflate(R.layout.fragment_splash_screen, container, false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/util/constants/Constants.kt b/app/src/main/java/com/tugcearas/pharmacyapp/util/constants/Constants.kt new file mode 100644 index 0000000..3fe2786 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/util/constants/Constants.kt @@ -0,0 +1,9 @@ +package com.tugcearas.pharmacyapp.util.constants + +object Constants { + + const val BASE_URL = "https://www.nosyapi.com/" + const val API = "tDmNAG3S4pNTrp9EeiaBolTS2grCSazCFptcKNfNcOdkj8UiXX678ewEM9Am" + const val GET_LIST = "apiv2/pharmacyLink?city=istanbul&county=umraniye&apikey=$API" + const val APP_GALLERY_PROJECT_API = "DAEDAFGgnviLqr3jHW/GIDD8LwJQpNqTnrnBB20Nuct9UW4rGgV4LE8ATIECc93Lb4LABT9fAWSBkr4Q39ZOIAJZOPWH49heH0Jwhw==" +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/util/diffutil/AdapterDiffUtil.kt b/app/src/main/java/com/tugcearas/pharmacyapp/util/diffutil/AdapterDiffUtil.kt new file mode 100644 index 0000000..ba12bd3 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/util/diffutil/AdapterDiffUtil.kt @@ -0,0 +1,17 @@ +package com.tugcearas.pharmacyapp.util.diffutil + +import androidx.recyclerview.widget.DiffUtil + +class DiffUtilCallback( + private val itemsTheSame: (T, T) -> Boolean = { _, _ -> false }, + private val contentsTheSame: (T, T) -> Boolean = { _, _ -> false } +) : DiffUtil.ItemCallback() { + + override fun areItemsTheSame(oldItem: T, newItem: T): Boolean { + return itemsTheSame(oldItem, newItem) + } + + override fun areContentsTheSame(oldItem: T, newItem: T): Boolean { + return contentsTheSame(oldItem, newItem) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/util/extensions/Extensions.kt b/app/src/main/java/com/tugcearas/pharmacyapp/util/extensions/Extensions.kt new file mode 100644 index 0000000..89f5db0 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/util/extensions/Extensions.kt @@ -0,0 +1,25 @@ +package com.tugcearas.pharmacyapp.util.extensions + +import android.content.Context +import android.view.View +import android.widget.Toast + +fun View.gone(){ + visibility = View.GONE +} + +fun View.visible(){ + visibility = View.VISIBLE +} + +fun View.click(func: () -> Unit){ + this.setOnClickListener { + func() + } +} + +fun Context.toastMessage(message:String) = + Toast.makeText(this, message,Toast.LENGTH_SHORT).show() + +fun Context.toastMessageLong(message:String) = + Toast.makeText(this, message,Toast.LENGTH_LONG).show() \ No newline at end of file diff --git a/app/src/main/java/com/tugcearas/pharmacyapp/util/resource/Resource.kt b/app/src/main/java/com/tugcearas/pharmacyapp/util/resource/Resource.kt new file mode 100644 index 0000000..515c134 --- /dev/null +++ b/app/src/main/java/com/tugcearas/pharmacyapp/util/resource/Resource.kt @@ -0,0 +1,10 @@ +package com.tugcearas.pharmacyapp.util.resource + +sealed class Resource ( + val data:T?=null, + val message:String?=null +) { + class Success(data:T):Resource(data) + class Error(message: String,data:T?=null):Resource(data,message) + class Loading : Resource() +} \ No newline at end of file diff --git a/app/src/main/res/color/bottom_icon_color.xml b/app/src/main/res/color/bottom_icon_color.xml new file mode 100644 index 0000000..e966e63 --- /dev/null +++ b/app/src/main/res/color/bottom_icon_color.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/back_icon.xml b/app/src/main/res/drawable/back_icon.xml new file mode 100644 index 0000000..8d3caa1 --- /dev/null +++ b/app/src/main/res/drawable/back_icon.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/home_icon.xml b/app/src/main/res/drawable/home_icon.xml new file mode 100644 index 0000000..4c5e854 --- /dev/null +++ b/app/src/main/res/drawable/home_icon.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/login_image.png b/app/src/main/res/drawable/login_image.png new file mode 100644 index 0000000..c9c218c Binary files /dev/null and b/app/src/main/res/drawable/login_image.png differ diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000..eeed446 Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ diff --git a/app/src/main/res/drawable/map_icon.xml b/app/src/main/res/drawable/map_icon.xml new file mode 100644 index 0000000..ffd9dd9 --- /dev/null +++ b/app/src/main/res/drawable/map_icon.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/pharmacy_icon.xml b/app/src/main/res/drawable/pharmacy_icon.xml new file mode 100644 index 0000000..27a0120 --- /dev/null +++ b/app/src/main/res/drawable/pharmacy_icon.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/phone_icon.xml b/app/src/main/res/drawable/phone_icon.xml new file mode 100644 index 0000000..c6b3f26 --- /dev/null +++ b/app/src/main/res/drawable/phone_icon.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..75d4dac --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,35 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_analytic.xml b/app/src/main/res/layout/fragment_analytic.xml new file mode 100644 index 0000000..31b5623 --- /dev/null +++ b/app/src/main/res/layout/fragment_analytic.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_screen.xml b/app/src/main/res/layout/fragment_home_screen.xml new file mode 100644 index 0000000..88db1ec --- /dev/null +++ b/app/src/main/res/layout/fragment_home_screen.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_login_screen.xml b/app/src/main/res/layout/fragment_login_screen.xml new file mode 100644 index 0000000..fb91543 --- /dev/null +++ b/app/src/main/res/layout/fragment_login_screen.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_map_screen.xml b/app/src/main/res/layout/fragment_map_screen.xml new file mode 100644 index 0000000..1aa0b3e --- /dev/null +++ b/app/src/main/res/layout/fragment_map_screen.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_splash_screen.xml b/app/src/main/res/layout/fragment_splash_screen.xml new file mode 100644 index 0000000..9d99060 --- /dev/null +++ b/app/src/main/res/layout/fragment_splash_screen.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/home_item.xml b/app/src/main/res/layout/home_item.xml new file mode 100644 index 0000000..ae06f08 --- /dev/null +++ b/app/src/main/res/layout/home_item.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..ac83b01 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_logo.xml b/app/src/main/res/mipmap-anydpi-v26/ic_logo.xml new file mode 100644 index 0000000..38d6640 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_logo.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_logo_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_logo_round.xml new file mode 100644 index 0000000..38d6640 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_logo_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b2dfe3d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_logo.png b/app/src/main/res/mipmap-hdpi/ic_logo.png new file mode 100644 index 0000000..8b167ef Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_logo.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_logo_foreground.png b/app/src/main/res/mipmap-hdpi/ic_logo_foreground.png new file mode 100644 index 0000000..d61bbbd Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_logo_foreground.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_logo_round.png b/app/src/main/res/mipmap-hdpi/ic_logo_round.png new file mode 100644 index 0000000..f28a6f9 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_logo_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..62b611d Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_logo.png b/app/src/main/res/mipmap-mdpi/ic_logo.png new file mode 100644 index 0000000..99dd136 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_logo.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_logo_foreground.png b/app/src/main/res/mipmap-mdpi/ic_logo_foreground.png new file mode 100644 index 0000000..690ee01 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_logo_foreground.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_logo_round.png b/app/src/main/res/mipmap-mdpi/ic_logo_round.png new file mode 100644 index 0000000..a185b8f Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_logo_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..1b9a695 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_logo.png b/app/src/main/res/mipmap-xhdpi/ic_logo.png new file mode 100644 index 0000000..e1de1d9 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_logo.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_logo_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_logo_foreground.png new file mode 100644 index 0000000..2c61e9d Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_logo_foreground.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_logo_round.png b/app/src/main/res/mipmap-xhdpi/ic_logo_round.png new file mode 100644 index 0000000..1a73cdb Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_logo_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9287f50 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_logo.png b/app/src/main/res/mipmap-xxhdpi/ic_logo.png new file mode 100644 index 0000000..9b81eab Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_logo.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_logo_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_logo_foreground.png new file mode 100644 index 0000000..42e1780 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_logo_foreground.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_logo_round.png b/app/src/main/res/mipmap-xxhdpi/ic_logo_round.png new file mode 100644 index 0000000..6516573 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_logo_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9126ae3 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_logo.png b/app/src/main/res/mipmap-xxxhdpi/ic_logo.png new file mode 100644 index 0000000..1d5516d Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_logo.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_logo_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_logo_foreground.png new file mode 100644 index 0000000..08cdaa5 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_logo_foreground.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_logo_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_logo_round.png new file mode 100644 index 0000000..426c2b9 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_logo_round.png differ diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml new file mode 100644 index 0000000..19b689f --- /dev/null +++ b/app/src/main/res/navigation/nav_graph.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/raw/lottie.json b/app/src/main/res/raw/lottie.json new file mode 100644 index 0000000..48ae9fd --- /dev/null +++ b/app/src/main/res/raw/lottie.json @@ -0,0 +1 @@ +{"v":"5.5.9","fr":30,"ip":0,"op":60,"w":500,"h":500,"nm":"location_covid","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Rectangle 2","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.36,-42.481,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100.002,100.002,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"location","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[1]},{"t":15,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[251.5,429.49,0],"to":[0,-2.5,0],"ti":[0,0,0]},{"i":{"x":0.253,"y":1},"o":{"x":0.167,"y":0.167},"t":20,"s":[251.5,414.49,0],"to":[0,0,0],"ti":[0,-2.5,0]},{"t":30,"s":[251.5,429.49,0]}],"ix":2},"a":{"a":0,"k":[0,130.676,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.928,0.928,-6.222]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,18]},"t":10,"s":[0,0,100]},{"i":{"x":[0.253,0.253,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[-0.542,-0.542,7.222]},"t":20,"s":[150,150,100]},{"t":30,"s":[130,130,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.08,0],[0,14.19],[0,0],[0,-14.19]],"o":[[14.08,0],[0,-14.19],[0,0],[0,14.19]],"v":[[0,40],[25.5,14.3],[0.12,-43.6],[-25.5,14.3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.262745098039,0.494117647059,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":-180,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Oval","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..171c2ed --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..c40434e --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,16 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + + #FE427E + #caccd1 + #788585 + #f0edee + #DCDCDD + \ No newline at end of file diff --git a/app/src/main/res/values/ic_logo_background.xml b/app/src/main/res/values/ic_logo_background.xml new file mode 100644 index 0000000..67b6ee5 --- /dev/null +++ b/app/src/main/res/values/ic_logo_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..32a3fd6 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,21 @@ + + Eczanem + + Hello blank fragment + Ana sayfa + Harita + Huawei ID ile giriş yapınız + Hoş Geldiniz! + Giriş Yap + Pharmacy Name + Pharmacy Address + Pharmacy Phone Number + Pharmacy City + Pharmacies On Duty + County + Yakındaki Eczaneler + Nöbetçi Eczaneler + Eczane yol tarifi almak için pembe ikonlardan birine tıklayınız! + Giriş başarılı! + Giriş başarısız! + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..2d8eb50 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/tugcearas/pharmacyapp/ExampleUnitTest.kt b/app/src/test/java/com/tugcearas/pharmacyapp/ExampleUnitTest.kt new file mode 100644 index 0000000..6cf312a --- /dev/null +++ b/app/src/test/java/com/tugcearas/pharmacyapp/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.tugcearas.pharmacyapp + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/app/tugcearas.jks b/app/tugcearas.jks new file mode 100644 index 0000000..e16f446 Binary files /dev/null and b/app/tugcearas.jks differ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..12d7e96 --- /dev/null +++ b/build.gradle @@ -0,0 +1,15 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + dependencies { + classpath 'com.android.tools.build:gradle:7.2' + classpath 'com.huawei.agconnect:agcp:1.9.1.300' + } +} + +plugins { + id 'com.android.application' version '7.4.2' apply false + id 'com.android.library' version '7.4.2' apply false + id 'org.jetbrains.kotlin.android' version '1.8.0' apply false +// id 'androidx.navigation.safeargs' version '2.6.0' apply false + id 'com.google.dagger.hilt.android' version '2.44' apply false +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..401cedd --- /dev/null +++ b/gradle.properties @@ -0,0 +1,24 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true +apmsInstrumentationEnabled=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..14757a4 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Jul 26 10:57:06 TRT 2023 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..dfbb709 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + maven { url 'https://developer.huawei.com/repo/' } + } +} +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + maven { url 'https://developer.huawei.com/repo/' } + } +} + +rootProject.name = "PharmacyApp" +include ':app'