diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..603b140 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.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 diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..88ea3aa --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,122 @@ + + + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+ + +
+
\ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..5cd135a --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..37a7509 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..e391dc7 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,57 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.3" + + defaultConfig { + applicationId "com.example.pruebamaps" + minSdkVersion 16 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.core:core-ktx:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.google.android.gms:play-services-maps:17.0.0' + implementation 'com.google.android.gms:play-services-location:17.0.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + //SliderInicio + implementation 'androidx.viewpager2:viewpager2:1.0.0-rc01' + //Api + implementation 'com.squareup.retrofit2:retrofit:2.4.0' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + //RecyclerView + implementation 'androidx.recyclerview:recyclerview:1.1.0' + //HTTP + implementation 'com.squareup.picasso:picasso:2.71828' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'com.squareup.okhttp3:logging-interceptor:4.6.0' + implementation 'com.google.okhttp:okhttp:20120626' + implementation 'com.squareup.okio:okio:2.6.0' + //Dialogos + implementation 'com.google.android.material:material:1.2.0-alpha06' + //Search + implementation 'com.github.mancj:MaterialSearchBar:0.8.5' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# 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 diff --git a/app/src/androidTest/java/com/example/pruebamaps/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/pruebamaps/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..ab57bc9 --- /dev/null +++ b/app/src/androidTest/java/com/example/pruebamaps/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.pruebamaps + +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.pruebamaps", appContext.packageName) + } +} diff --git a/app/src/debug/res/values/google_maps_api.xml b/app/src/debug/res/values/google_maps_api.xml new file mode 100644 index 0000000..5d92725 --- /dev/null +++ b/app/src/debug/res/values/google_maps_api.xml @@ -0,0 +1,24 @@ + + + AIzaSyCDCQFseYL7K7okR_YL7lmh2SCRct9YiiM + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..42f2c71 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_indicadoractive-playstore.png b/app/src/main/ic_indicadoractive-playstore.png new file mode 100644 index 0000000..004193b Binary files /dev/null and b/app/src/main/ic_indicadoractive-playstore.png differ diff --git "a/app/src/main/java/com/example/pruebamaps/LEER ANTES DE VER EL C\303\223DIGO" "b/app/src/main/java/com/example/pruebamaps/LEER ANTES DE VER EL C\303\223DIGO" new file mode 100644 index 0000000..dc82ed1 --- /dev/null +++ "b/app/src/main/java/com/example/pruebamaps/LEER ANTES DE VER EL C\303\223DIGO" @@ -0,0 +1,11 @@ +/////////////////////// + + + + Para que funcione correctamente, se debe cambiar el DoubleArray por List, el problema es que da error al ejecutar, + problema el cual no pude resolver, muy aparte de eso, la app está muy incompleta, el uso de APIs me costó bastante y + se notó ya por el erro anterior nombrado... + + + +////////////////////// \ No newline at end of file diff --git a/app/src/main/java/com/example/pruebamaps/Menu/ApiMarker.kt b/app/src/main/java/com/example/pruebamaps/Menu/ApiMarker.kt new file mode 100644 index 0000000..06a83f2 --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Menu/ApiMarker.kt @@ -0,0 +1,28 @@ +package com.example.pruebamaps.Menu +import okhttp3.logging.HttpLoggingInterceptor +import okhttp3.OkHttpClient +import retrofit2.Call +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.http.GET + +interface ApiMarker { + + companion object{ + val instance:MarcadorApi by lazy{ + + val builder_pedido = Retrofit.Builder() + .baseUrl("https://productospy.org/api/vendors/") + .addConverterFactory(GsonConverterFactory.create()) + + val client = OkHttpClient.Builder() + + client.addInterceptor(HttpLoggingInterceptor().apply { + level = HttpLoggingInterceptor.Level.BODY + }) + + builder_pedido.client(client.build()) + builder_pedido.build().create(MarcadorApi::class.java) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pruebamaps/Menu/Coordenadas.kt b/app/src/main/java/com/example/pruebamaps/Menu/Coordenadas.kt new file mode 100644 index 0000000..d35008f --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Menu/Coordenadas.kt @@ -0,0 +1,9 @@ +package com.example.pruebamaps.Menu + +data class Coordenadas (val type: String, val features: List) +data class Feature (val type: FeatureType, val geometry: Geometry, val properties: Properties) +data class Geometry (val type: GeometryType, val coordinates: DoubleArray) +enum class GeometryType { Point } +data class Properties (val nombre: String, val contacto: String, val comentarios: String, val productos: List) +data class Productos (val product_name: String, val product_type: String) +enum class FeatureType { Feature } diff --git a/app/src/main/java/com/example/pruebamaps/Menu/FragmentDetalle.kt b/app/src/main/java/com/example/pruebamaps/Menu/FragmentDetalle.kt new file mode 100644 index 0000000..f62d8fa --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Menu/FragmentDetalle.kt @@ -0,0 +1,61 @@ +package com.example.pruebamaps.Menu + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import com.example.pruebamaps.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentDetalle.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentDetalle : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_detalle, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentDetalle. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentDetalle().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} diff --git a/app/src/main/java/com/example/pruebamaps/Menu/FragmentFav.kt b/app/src/main/java/com/example/pruebamaps/Menu/FragmentFav.kt new file mode 100644 index 0000000..e0b8d73 --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Menu/FragmentFav.kt @@ -0,0 +1,61 @@ +package com.example.pruebamaps.Menu + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import com.example.pruebamaps.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentFav.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentFav : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_fav, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentFav. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentFav().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} diff --git a/app/src/main/java/com/example/pruebamaps/Menu/FragmentFiltro.kt b/app/src/main/java/com/example/pruebamaps/Menu/FragmentFiltro.kt new file mode 100644 index 0000000..7035ea3 --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Menu/FragmentFiltro.kt @@ -0,0 +1,61 @@ +package com.example.pruebamaps.Menu + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import com.example.pruebamaps.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentFiltro.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentFiltro : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_filtro, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentFiltro. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentFiltro().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} diff --git a/app/src/main/java/com/example/pruebamaps/Menu/FragmentInfo.kt b/app/src/main/java/com/example/pruebamaps/Menu/FragmentInfo.kt new file mode 100644 index 0000000..6eda432 --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Menu/FragmentInfo.kt @@ -0,0 +1,66 @@ +package com.example.pruebamaps.Menu + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import com.example.pruebamaps.R +import kotlinx.android.synthetic.main.fragment_info.* + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentInfo.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentInfo : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + + } + + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_info, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentInfo. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentInfo().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} diff --git a/app/src/main/java/com/example/pruebamaps/Menu/MarcadorApi.kt b/app/src/main/java/com/example/pruebamaps/Menu/MarcadorApi.kt new file mode 100644 index 0000000..dd08eb3 --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Menu/MarcadorApi.kt @@ -0,0 +1,53 @@ +package com.example.pruebamaps.Menu + +import android.icu.util.TimeUnit +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Call +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.http.GET +import retrofit2.http.Path +import retrofit2.http.Query +import javax.xml.datatype.DatatypeConstants.MINUTES + +interface MarcadorApi { + + + @GET("?in_bbox") + fun getMarker( + @Query("limit") limit : Int, + @Query("offset") offset : Int + ): Call + + + companion object { + + val stackClient by lazy { MarcadorApi("https://productospy.org/api/vendors/") } + + + private val loggingInterceptor = HttpLoggingInterceptor().apply { + this.level = HttpLoggingInterceptor.Level.BODY + } + + operator fun invoke(baseUrl: String): MarcadorApi { + val client = OkHttpClient.Builder().apply { + /**addNetworkInterceptor(StethoInterceptor()) */ + addNetworkInterceptor(loggingInterceptor) + + }.build() + + return Retrofit.Builder() + .client(client) + .baseUrl(baseUrl) +// .addCallAdapterFactory(CoroutineCallAdapterFactory()) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(MarcadorApi::class.java) + } + } + + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pruebamaps/Menu/Principal.kt b/app/src/main/java/com/example/pruebamaps/Menu/Principal.kt new file mode 100644 index 0000000..eb876b1 --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Menu/Principal.kt @@ -0,0 +1,213 @@ +package com.example.pruebamaps.Menu + +import android.content.Intent +import android.content.pm.PackageManager +import android.location.Location +import android.net.Uri +import android.os.Build +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.widget.ArrayAdapter +import android.widget.ListView +import android.widget.Toast +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import com.example.pruebamaps.R +import com.google.android.gms.location.FusedLocationProviderClient +import com.google.android.gms.location.LocationServices + +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.BitmapDescriptorFactory +import com.google.android.gms.maps.model.LatLng +import com.google.android.gms.maps.model.Marker +import com.google.android.gms.maps.model.MarkerOptions +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.mancj.materialsearchbar.MaterialSearchBar +import kotlinx.android.synthetic.main.activity_principal.* +import kotlinx.android.synthetic.main.fragment_info.* +import kotlinx.android.synthetic.main.fragment_info.view.* +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class Principal : AppCompatActivity(), OnMapReadyCallback, GoogleMap.OnMarkerClickListener { + + private lateinit var fusedLocationClient : FusedLocationProviderClient + + private lateinit var lastLocation : Location + + private var selectedMarker:Marker?=null + + + + companion object { + private const val LOCATION_PERMISSION_REQUEST_CODE = 1 + } + private val markerClickListener = object: GoogleMap.OnMarkerClickListener{ + override fun onMarkerClick(marker: Marker?):Boolean{ + if(marker == selectedMarker){ + selectedMarker=null + return true + } + selectedMarker =marker + return false + } + } + + override fun onMarkerClick(p0: Marker?) = false + private lateinit var map: GoogleMap + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_principal) + val mapFragment = supportFragmentManager + .findFragmentById(R.id.map) as SupportMapFragment + mapFragment.getMapAsync(this) + + + + + val lv = findViewById(R.id.listview) as ListView + val searchBar = findViewById(R.id.editText) as MaterialSearchBar + searchBar.setHint("Buscar Producto> ") + searchBar.setSpeechMode(true) + searchBar.addTextChangeListener(object : TextWatcher { + override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) { + + } + + override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) { + //SEARCH FILTER + } + + override fun afterTextChanged(editable: Editable) { + + } + }) + + + + fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + + txt_filtro.setOnClickListener { + + val dialog = BottomSheetDialog(this@Principal) + val view = layoutInflater.inflate(R.layout.fragment_filtro, null) + dialog.setContentView(view) + dialog.show() + + } + imgfav.setOnClickListener { + val dialog = BottomSheetDialog(this@Principal) + val view = layoutInflater.inflate(R.layout.fragment_fav,null) + dialog.setContentView(view) + dialog.show() + } + imginfo.setOnClickListener { + + val dialog = BottomSheetDialog(this@Principal) + val view = layoutInflater.inflate(R.layout.fragment_info,null) + dialog.setContentView(view) + dialog.show() + + view.txt_terminos.setOnClickListener { + val url = "https://productospy.org/disclaimer" + val i = Intent(Intent.ACTION_VIEW) + i.data = Uri.parse(url) + startActivity(i) + + } + view.txt_vendedor.setOnClickListener { + val url = "https://productospy.org/vendor" + val i = Intent(Intent.ACTION_VIEW) + i.data = Uri.parse(url) + startActivity(i) + + } + view.txt_code.setOnClickListener { + val url = "https://phoebe.roshka.com/gitlab/" + val i = Intent(Intent.ACTION_VIEW) + i.data = Uri.parse(url) + startActivity(i) + + } + + } + + } + + override fun onMapReady(googleMap: GoogleMap) { + map = googleMap + + map.setOnMarkerClickListener(this) + + setUpMap() + + MarcadorApi.stackClient.getMarker(15, 0).enqueue( + object: Callback { + override fun onFailure(call: Call, t: Throwable) { + t.printStackTrace() + } + + @RequiresApi(Build.VERSION_CODES.O) + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful) { + val mark = response.body() + val coor = mark!!.features + + for( item in coor.indices ){ + var pos =mark.features[item].geometry.coordinates + var nombre=mark.features[item].properties.nombre + + map.addMarker( + MarkerOptions() + .position(LatLng(pos[1],pos[0])) + .title(nombre) + .icon(BitmapDescriptorFactory.fromResource(R.drawable.imgmarkernormal) + ) + ) + + map.setOnMarkerClickListener { marker -> + var marcador = marker.position + + true + } + + } + + }else{ + + Toast.makeText(this@Principal, "Error", Toast.LENGTH_SHORT).show() + + } + } + } + ) + } + private fun setUpMap() { + if(ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this, + arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),LOCATION_PERMISSION_REQUEST_CODE) + return + } + + map.isMyLocationEnabled= true + + fusedLocationClient.lastLocation.addOnSuccessListener(this){ location -> + + if(location != null){ + + lastLocation = location + val currentLatLong = LatLng(location.latitude, location.longitude) + map.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLong, 18f)) + + } + } + } +} +//TY4A. \ No newline at end of file diff --git a/app/src/main/java/com/example/pruebamaps/Slider/IntroSlide.kt b/app/src/main/java/com/example/pruebamaps/Slider/IntroSlide.kt new file mode 100644 index 0000000..774e9ac --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Slider/IntroSlide.kt @@ -0,0 +1,8 @@ +package com.example.pruebamaps.Slider + +data class IntroSlide ( + val title: String, + val description: String, + val icon: Int + +) \ No newline at end of file diff --git a/app/src/main/java/com/example/pruebamaps/Slider/IntroSlider.kt b/app/src/main/java/com/example/pruebamaps/Slider/IntroSlider.kt new file mode 100644 index 0000000..ee852ce --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Slider/IntroSlider.kt @@ -0,0 +1,125 @@ +package com.example.pruebamaps + +import android.content.Context +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.system.Os.close +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.core.content.ContextCompat +import androidx.core.view.get +import androidx.viewpager2.widget.ViewPager2 +import com.example.pruebamaps.Menu.Principal +import com.example.pruebamaps.Slider.IntroSlide +import kotlinx.android.synthetic.main.activity_intro_slider.* +import kotlinx.android.synthetic.main.slide_item_container.* + + +class IntroSlider : AppCompatActivity() { + private val SKIP = "PREFERENCE_NAME" + private val IntroSliderAdapter = com.example.pruebamaps.Slider.IntroSliderAdapter( + listOf( + IntroSlide( + "ENCUENTRA", + "¿Tapabocas, alimentos, alementos de limpieza, alcohol en gel? PorductosPY facilita conectarte con los vendedores de los productos que necesitas!", + R.drawable.imgslider1 + ), + IntroSlide( + "OFRECE", + "¿Estás vendiendo algún producto, ofreciendo algún servicio y necesitas darte a conocer?", + R.drawable.imgslider2 + ), + IntroSlide( + "CONÉCTATE", + "Encúentranos en FACEBOOK, TWITTER e INSTAGRAM como ProductosPY", + R.drawable.imgslider3 + + ) + ) + ) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_intro_slider) + val sharedPreference = getSharedPreferences(SKIP,Context.MODE_PRIVATE) + var editor = sharedPreference.edit() + + if (sharedPreference.getBoolean(SKIP, false)){ + goToLogin(this) + } + introSliderViewPager.adapter = IntroSliderAdapter + setupIndicator() + setCurrentIndicator(0) + introSliderViewPager.registerOnPageChangeCallback(object : + ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + setCurrentIndicator(position) + } + + }) + btn_empezar.setOnClickListener { + editor.putBoolean(SKIP, true) + editor.apply() + goToLogin(this) + } + } + private fun setupIndicator(){ + val indicators = arrayOfNulls(IntroSliderAdapter.itemCount) + val layoutsParams : LinearLayout.LayoutParams = + LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + layoutsParams.setMargins(8,0, 8, 0) + for (i in indicators.indices) + { + indicators[i] = ImageView(applicationContext) + indicators[i].apply{ + this?.setImageDrawable( + ContextCompat.getDrawable( + applicationContext, + R.drawable.indicator_inactive + ) + ) + this?.layoutParams = layoutsParams + } + Indicadores.addView(indicators[i]) + } + } + private fun setCurrentIndicator(index: Int) { + val childCount = Indicadores.childCount + for (i in 0 until childCount) { + val ImageView = Indicadores[i] as ImageView + if (i==index) { + ImageView.setImageDrawable( + ContextCompat.getDrawable( + applicationContext, + R.drawable.indicator_active + ) + ) + }else { + ImageView.setImageDrawable( + ContextCompat.getDrawable( + applicationContext, + R.drawable.indicator_inactive + ) + ) + } + + + } + + } + private fun goToLogin(context : Context){ + val intent = Intent(this, Principal::class.java) + startActivity(intent) + + } + private fun close (){ + btn_empezar.visibility = View.VISIBLE + } + +} diff --git a/app/src/main/java/com/example/pruebamaps/Slider/IntroSliderAdapter.kt b/app/src/main/java/com/example/pruebamaps/Slider/IntroSliderAdapter.kt new file mode 100644 index 0000000..c1a5e0f --- /dev/null +++ b/app/src/main/java/com/example/pruebamaps/Slider/IntroSliderAdapter.kt @@ -0,0 +1,47 @@ +package com.example.pruebamaps.Slider + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.example.pruebamaps.R +import com.example.pruebamaps.Slider.IntroSlide + + +class IntroSliderAdapter(private val IntroSlides: List): + RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): IntroSliderViewHolder { + return IntroSliderViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.slide_item_container, + parent, + false + ) + ) + + } + + override fun getItemCount(): Int { + return IntroSlides.size + } + + override fun onBindViewHolder(holder: IntroSliderViewHolder, position: Int) { + holder.bind(IntroSlides[position]) + } + + inner class IntroSliderViewHolder(view: View) : RecyclerView.ViewHolder(view){ + private val textTitle = view.findViewById(R.id.textTittle) + private val textDescription = view.findViewById(R.id.textDescription) + private val imageIcon = view.findViewById(R.id.imageSliderIcon) + fun bind(IntroSlide: IntroSlide) { + textTitle.text = IntroSlide.title + textDescription.text= IntroSlide.description + imageIcon.setImageResource(IntroSlide.icon) + + } + + } + +} \ 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/btnfav.png b/app/src/main/res/drawable/btnfav.png new file mode 100644 index 0000000..78d5cd4 Binary files /dev/null and b/app/src/main/res/drawable/btnfav.png differ diff --git a/app/src/main/res/drawable/btninfo.png b/app/src/main/res/drawable/btninfo.png new file mode 100644 index 0000000..9c7fdc8 Binary files /dev/null and b/app/src/main/res/drawable/btninfo.png differ diff --git a/app/src/main/res/drawable/button.xml b/app/src/main/res/drawable/button.xml new file mode 100644 index 0000000..36f644c --- /dev/null +++ b/app/src/main/res/drawable/button.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file 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/imgcerrar.png b/app/src/main/res/drawable/imgcerrar.png new file mode 100644 index 0000000..07e0077 Binary files /dev/null and b/app/src/main/res/drawable/imgcerrar.png differ diff --git a/app/src/main/res/drawable/imgfavdetalle.png b/app/src/main/res/drawable/imgfavdetalle.png new file mode 100644 index 0000000..8df3f2a Binary files /dev/null and b/app/src/main/res/drawable/imgfavdetalle.png differ diff --git a/app/src/main/res/drawable/imgfavselecteddetalle.png b/app/src/main/res/drawable/imgfavselecteddetalle.png new file mode 100644 index 0000000..31598fa Binary files /dev/null and b/app/src/main/res/drawable/imgfavselecteddetalle.png differ diff --git a/app/src/main/res/drawable/imgfiltro.png b/app/src/main/res/drawable/imgfiltro.png new file mode 100644 index 0000000..fc57611 Binary files /dev/null and b/app/src/main/res/drawable/imgfiltro.png differ diff --git a/app/src/main/res/drawable/imglogogrande.png b/app/src/main/res/drawable/imglogogrande.png new file mode 100644 index 0000000..806aeae Binary files /dev/null and b/app/src/main/res/drawable/imglogogrande.png differ diff --git a/app/src/main/res/drawable/imglogomini.png b/app/src/main/res/drawable/imglogomini.png new file mode 100644 index 0000000..10be01c Binary files /dev/null and b/app/src/main/res/drawable/imglogomini.png differ diff --git a/app/src/main/res/drawable/imgmarkernormal.png b/app/src/main/res/drawable/imgmarkernormal.png new file mode 100644 index 0000000..6590395 Binary files /dev/null and b/app/src/main/res/drawable/imgmarkernormal.png differ diff --git a/app/src/main/res/drawable/imgmarkerselected.png b/app/src/main/res/drawable/imgmarkerselected.png new file mode 100644 index 0000000..4289dd8 Binary files /dev/null and b/app/src/main/res/drawable/imgmarkerselected.png differ diff --git a/app/src/main/res/drawable/imgslider1.png b/app/src/main/res/drawable/imgslider1.png new file mode 100644 index 0000000..be9e0bb Binary files /dev/null and b/app/src/main/res/drawable/imgslider1.png differ diff --git a/app/src/main/res/drawable/imgslider2.png b/app/src/main/res/drawable/imgslider2.png new file mode 100644 index 0000000..e27063e Binary files /dev/null and b/app/src/main/res/drawable/imgslider2.png differ diff --git a/app/src/main/res/drawable/imgslider3.png b/app/src/main/res/drawable/imgslider3.png new file mode 100644 index 0000000..fd19fec Binary files /dev/null and b/app/src/main/res/drawable/imgslider3.png differ diff --git a/app/src/main/res/drawable/indicator_active.xml b/app/src/main/res/drawable/indicator_active.xml new file mode 100644 index 0000000..c201d14 --- /dev/null +++ b/app/src/main/res/drawable/indicator_active.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/indicator_inactive.xml b/app/src/main/res/drawable/indicator_inactive.xml new file mode 100644 index 0000000..0cf11c0 --- /dev/null +++ b/app/src/main/res/drawable/indicator_inactive.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_intro_slider.xml b/app/src/main/res/layout/activity_intro_slider.xml new file mode 100644 index 0000000..0a7b117 --- /dev/null +++ b/app/src/main/res/layout/activity_intro_slider.xml @@ -0,0 +1,54 @@ + + + +