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..681f41a --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + 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/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/.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..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..2754899 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,45 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.3" + + defaultConfig { + applicationId "com.example.examengapsi" + 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 'androidx.appcompat:appcompat:1.1.0' + implementation 'com.google.android.material:material:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.navigation:navigation-fragment:2.3.0' + implementation 'androidx.navigation:navigation-ui:2.3.0' + testImplementation 'junit:junit:4.13' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + + implementation 'com.squareup.retrofit2:retrofit:2.6.2' + implementation 'com.squareup.retrofit2:converter-gson:2.6.2' + implementation 'com.squareup.retrofit2:converter-scalars:2.5.0' + implementation 'com.github.bumptech.glide:glide:4.11.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' + implementation "androidx.room:room-runtime:2.2.5" + annotationProcessor "androidx.room:room-compiler:2.2.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/examengapsi/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/examengapsi/ExampleInstrumentedTest.java new file mode 100644 index 0000000..77333d6 --- /dev/null +++ b/app/src/androidTest/java/com/example/examengapsi/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.example.examengapsi; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.example.examengapsi", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..996dd18 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/examengapsi/MainActivity.java b/app/src/main/java/com/example/examengapsi/MainActivity.java new file mode 100644 index 0000000..1d58a99 --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/MainActivity.java @@ -0,0 +1,139 @@ +package com.example.examengapsi; + +import android.os.AsyncTask; +import android.os.Bundle; + +import com.example.examengapsi.adapter.ProductsListAdapter; +import com.example.examengapsi.adapter.SearchHistoryAdapter; +import com.example.examengapsi.db.AppDataBase; +import com.example.examengapsi.model.Producto; +import com.example.examengapsi.model.SearchHistory; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.SearchView; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; + +import java.util.ArrayList; +import java.util.List; + +public class MainActivity extends AppCompatActivity implements MainInterface.MainView { + + private MainPresenter mainPresenter; + RecyclerView recyclerView, recyclerViewHistory; + ProductsListAdapter productsListAdapter; + SearchHistoryAdapter searchHistoryAdapter; + SearchHistory searchHistory; + InserBDTask inserBDTask; + SearchHistoryDBTask searchHistoryDBTask; + private List listHistory; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + mainPresenter = new MainPresenter(this, this); + + searchHistory = new SearchHistory(); + + searchHistoryDBTask = new SearchHistoryDBTask(); + searchHistoryDBTask.execute(); + + } + + private void createRecyclerView(ArrayList products) { + recyclerView = findViewById(R.id.idRvProducts); + productsListAdapter = new ProductsListAdapter(this, products); + recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); + recyclerView.setAdapter(productsListAdapter); + recyclerView.setHasFixedSize(true); + recyclerView.isNestedScrollingEnabled(); + productsListAdapter.notifyDataSetChanged(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_main, menu); + MenuItem searchItem = menu.findItem(R.id.action_search); + SearchView searchView = (SearchView) searchItem.getActionView(); + searchView.setQueryHint("Busca producto"); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + + Log.wtf("onQueryTextSubmit MainActivity", "query; " + query); + inserBDTask = new InserBDTask(); + searchHistory.setText(query); + inserBDTask.execute(searchHistory); + mainPresenter.searchProduct(query); + return true; + } + + @Override + public boolean onQueryTextChange(String newText) { + Log.wtf("MainActivity", "onQueryTextChange | newText; " + newText); + return true; + } + }); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + + return super.onOptionsItemSelected(item); + } + + @Override + public void resultSearchjProduct(ArrayList products) { + createRecyclerView(products); + } + + private class InserBDTask extends AsyncTask { + + @Override + protected Void doInBackground(SearchHistory... searchHistories) { + Log.wtf("doinBack", "" + searchHistories[0]); + AppDataBase.getAppDB(getApplicationContext()).searchHistoryDAO().insertSearchHistory(searchHistories[0]); + return null; + } + } + + private class SearchHistoryDBTask extends AsyncTask>{ + + @Override + protected List doInBackground(Void... voids) { + listHistory = AppDataBase.getAppDB(getApplicationContext()).searchHistoryDAO().findAllHistory(); + return listHistory; + } + @Override + public void onPostExecute(List searchHistory){ + showHistory(searchHistory); + } + + private void showHistory(List searchHistory) { + Log.wtf("MainActivityt", "showHistory | searchlist: " + searchHistory); + createRecyclerHistory(searchHistory); + } + } + + + private void createRecyclerHistory(List searchHistory) { + recyclerViewHistory = findViewById(R.id.idRvProducts); + searchHistoryAdapter = new SearchHistoryAdapter(this, searchHistory); + recyclerViewHistory.setLayoutManager(new GridLayoutManager(this, 1)); + recyclerViewHistory.setAdapter(searchHistoryAdapter); + recyclerViewHistory.setHasFixedSize(true); + recyclerViewHistory.isNestedScrollingEnabled(); + searchHistoryAdapter.notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/com/example/examengapsi/MainInterface.java b/app/src/main/java/com/example/examengapsi/MainInterface.java new file mode 100644 index 0000000..1d1c13b --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/MainInterface.java @@ -0,0 +1,15 @@ +package com.example.examengapsi; + +import com.example.examengapsi.model.Producto; + +import java.util.ArrayList; + +interface MainInterface { + interface MainView { + void resultSearchjProduct(ArrayList products); + } + + interface MainPresenter { + void searchProduct(String text); + } +} diff --git a/app/src/main/java/com/example/examengapsi/MainPresenter.java b/app/src/main/java/com/example/examengapsi/MainPresenter.java new file mode 100644 index 0000000..48adad7 --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/MainPresenter.java @@ -0,0 +1,112 @@ +package com.example.examengapsi; + +import android.content.Context; +import android.os.Build; +import android.util.Log; + +import androidx.annotation.RequiresApi; + +import com.example.examengapsi.model.Producto; +import com.example.examengapsi.service.ApiService; +import com.google.gson.Gson; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class MainPresenter implements MainInterface.MainPresenter { + + private Context context; + private MainInterface.MainView view; + private ApiService apiService; + + public MainPresenter(Context context, MainInterface.MainView mainView) { + this.context = context; + this.view = mainView; + apiService = new ApiService().initApiService(context); + } + + @Override + public void searchProduct(String text) { + Call call = apiService.apiInterface.getProductos(true, text, 1, 10); + call.enqueue(new Callback() { + @RequiresApi(api = Build.VERSION_CODES.N) + @Override + public void onResponse(Call call, Response response) { + + if (response.isSuccessful()) { + try { + if (response.body() != null) { + JSONObject jsonObject = new JSONObject(response.body()); + getResultProductos(jsonObject.getJSONObject("plpResults").getJSONArray("records")); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + } + + + + /* if (response.isSuccessful()) { + try { + + for (int x = 0; x < jsonArray.length(); x++) { + JSONObject jsonObjects = jsonArray.getJSONObject(x); + try { + Date date2 = date.parse(jsonObjects.getString("updatedAt")); + long diff = now.getTime() - date2.getTime(); + long diffHours = diff / (60 * 60 * 1000); + if (x == 0) { + minimumHour = diffHours; + } else { + minimumHour(diffHours, jsonObjects); + } + + } catch (ParseException e) { + e.printStackTrace(); + } + } + + minimumMinute(arrayHours); + minimumSecond(arrayMinute); + } catch (JSONException e) { + e.printStackTrace(); + } + + }*/ + } + + @Override + public void onFailure(Call call, Throwable t) { + //viewMpas.onFailure(t.getCause().toString(), t.getMessage()); + Log.wtf("MainPresenter", "onFailure | cause: " + t.getCause() + " message: " + t.getMessage()); + } + }); + } + + private void getResultProductos(JSONArray records) { + ArrayList products = new ArrayList<>(); + for (int x = 0; x < records.length(); x++) { + try { + JSONObject jsonObject = records.getJSONObject(x); + Producto product = new Gson().fromJson(String.valueOf(jsonObject), Producto.class); + products.add(product); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + view.resultSearchjProduct(products); + + } + +} diff --git a/app/src/main/java/com/example/examengapsi/adapter/ProductsListAdapter.java b/app/src/main/java/com/example/examengapsi/adapter/ProductsListAdapter.java new file mode 100644 index 0000000..8fc5fd7 --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/adapter/ProductsListAdapter.java @@ -0,0 +1,60 @@ +package com.example.examengapsi.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.example.examengapsi.R; +import com.example.examengapsi.model.Producto; + +import java.util.ArrayList; + +public class ProductsListAdapter extends RecyclerView.Adapter { + + Context context; + ArrayList productsList; + + public ProductsListAdapter(Context context, ArrayList productsList) { + this.context = context; + this.productsList = productsList; + } + + @NonNull + @Override + public ProductsListHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ProductsListHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_producto, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ProductsListHolder holder, int position) { + holder.idTvPrice.setText(productsList.get(position).getListPrice().toString()); + holder.idTvName.setText(productsList.get(position).getProductDisplayName()); + Glide.with(context).load(productsList.get(position).getSmImage()).into(holder.idTvImage); + } + + @Override + public int getItemCount() { + return productsList.size(); + } + + public class ProductsListHolder extends RecyclerView.ViewHolder { + + TextView idTvPrice, idTvName; + ImageView idTvImage; + + public ProductsListHolder(@NonNull View itemView) { + super(itemView); + + idTvPrice = itemView.findViewById(R.id.idTvPrice); + idTvName = itemView.findViewById(R.id.idTvName); + idTvImage = itemView.findViewById(R.id.idTvImage); + } + } +} diff --git a/app/src/main/java/com/example/examengapsi/adapter/SearchHistoryAdapter.java b/app/src/main/java/com/example/examengapsi/adapter/SearchHistoryAdapter.java new file mode 100644 index 0000000..22603ab --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/adapter/SearchHistoryAdapter.java @@ -0,0 +1,55 @@ +package com.example.examengapsi.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.examengapsi.MainActivity; +import com.example.examengapsi.R; +import com.example.examengapsi.model.SearchHistory; + +import java.util.ArrayList; +import java.util.List; + +public class SearchHistoryAdapter extends RecyclerView.Adapter { + + Context context; + List searchHistory; + + public SearchHistoryAdapter(Context context, List searchHistory) { + this.context = context; + this.searchHistory = searchHistory; + } + + @NonNull + @Override + public SearchHistoryAdapter.SearchHistoryHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new SearchHistoryHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_search_history, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull SearchHistoryAdapter.SearchHistoryHolder holder, int position) { + holder.text.setText(searchHistory.get(position).getText()); + } + + @Override + public int getItemCount() { + return searchHistory.size(); + } + + public class SearchHistoryHolder extends RecyclerView.ViewHolder { + + TextView text; + + public SearchHistoryHolder(@NonNull View itemView) { + super(itemView); + + text = itemView.findViewById(R.id.idTv); + } + } +} diff --git a/app/src/main/java/com/example/examengapsi/db/AppDataBase.java b/app/src/main/java/com/example/examengapsi/db/AppDataBase.java new file mode 100644 index 0000000..294e158 --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/db/AppDataBase.java @@ -0,0 +1,32 @@ +package com.example.examengapsi.db; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.room.Database; +import androidx.room.DatabaseConfiguration; +import androidx.room.InvalidationTracker; +import androidx.room.Room; +import androidx.room.RoomDatabase; +import androidx.sqlite.db.SupportSQLiteOpenHelper; + +import com.example.examengapsi.model.SearchHistory; + +@Database(entities = {SearchHistory.class}, version = 2) +public abstract class AppDataBase extends RoomDatabase { + + private static AppDataBase INSTANCE; + public abstract SearchHistoryDAO searchHistoryDAO(); + + public static AppDataBase getAppDB(Context context){ + if(INSTANCE==null){ + INSTANCE= Room.databaseBuilder(context.getApplicationContext(), AppDataBase.class, "examen_gapsi_db") + .build(); + } + return INSTANCE; + } + + public static void destroyBD(){ + INSTANCE=null; + } +} diff --git a/app/src/main/java/com/example/examengapsi/db/SearchHistoryDAO.java b/app/src/main/java/com/example/examengapsi/db/SearchHistoryDAO.java new file mode 100644 index 0000000..245d6cd --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/db/SearchHistoryDAO.java @@ -0,0 +1,21 @@ +package com.example.examengapsi.db; + +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.Query; + +import com.example.examengapsi.model.SearchHistory; + +import java.util.List; + + +@Dao +public interface SearchHistoryDAO { + + @Insert + void insertSearchHistory(SearchHistory searchHistory); + + @Query("SELECT * FROM search_history") + List findAllHistory(); + +} diff --git a/app/src/main/java/com/example/examengapsi/model/Producto.java b/app/src/main/java/com/example/examengapsi/model/Producto.java new file mode 100644 index 0000000..8c9a998 --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/model/Producto.java @@ -0,0 +1,37 @@ +package com.example.examengapsi.model; + +public class Producto { + private String productDisplayName; + private Double listPrice; + private String smImage; + + public Producto(String productDisplayName, Double listPrice, String smImage) { + this.productDisplayName = productDisplayName; + this.listPrice = listPrice; + this.smImage = smImage; + } + + public void setProductDisplayName(String productDisplayName) { + this.productDisplayName = productDisplayName; + } + + public void setListPrice(Double listPrice) { + this.listPrice = listPrice; + } + + public void setSmImage(String smImage) { + this.smImage = smImage; + } + + public String getProductDisplayName() { + return productDisplayName; + } + + public Double getListPrice() { + return listPrice; + } + + public String getSmImage() { + return smImage; + } +} diff --git a/app/src/main/java/com/example/examengapsi/model/SearchHistory.java b/app/src/main/java/com/example/examengapsi/model/SearchHistory.java new file mode 100644 index 0000000..949a956 --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/model/SearchHistory.java @@ -0,0 +1,33 @@ +package com.example.examengapsi.model; + +import androidx.annotation.NonNull; +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.PrimaryKey; + +@Entity(tableName = "search_history") +public class SearchHistory { + + @PrimaryKey(autoGenerate = true) + private int uid; + + @ColumnInfo(name="text") + private String text; + + public void setUid(int uid) { + this.uid = uid; + } + + public int getUid() { + return uid; + } + + public void setText(@NonNull String text) { + this.text = text; + } + + @NonNull + public String getText() { + return text; + } +} diff --git a/app/src/main/java/com/example/examengapsi/service/ApiService.java b/app/src/main/java/com/example/examengapsi/service/ApiService.java new file mode 100644 index 0000000..3042ba0 --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/service/ApiService.java @@ -0,0 +1,43 @@ +package com.example.examengapsi.service; + +import android.content.Context; + +import com.example.examengapsi.R; + +import java.util.HashMap; +import java.util.Map; + +import retrofit2.Retrofit; +import retrofit2.converter.scalars.ScalarsConverterFactory; + +public class ApiService { + + public ApiServiceInterface apiInterface; + private String URL = "https://shoppapp.liverpool.com.mx"; + + public ApiService() { + } + + public ApiService initApiService(Context context) { + + Retrofit.Builder apiClientConfig = new Retrofit.Builder() + .baseUrl(URL) + .addConverterFactory(ScalarsConverterFactory.create()); + + apiInterface = apiClientConfig.build().create(ApiServiceInterface.class); + return this; + } + + private static Map mapHeaders = null; + + public static Map getMapHeaders(Context context) { + if (mapHeaders == null) { + mapHeaders = new HashMap<>(); + } else { + mapHeaders.clear(); + } + mapHeaders.put("Content-Type", "application/x-www-form-urlencoded"); + return mapHeaders; + } + +} diff --git a/app/src/main/java/com/example/examengapsi/service/ApiServiceInterface.java b/app/src/main/java/com/example/examengapsi/service/ApiServiceInterface.java new file mode 100644 index 0000000..906dc67 --- /dev/null +++ b/app/src/main/java/com/example/examengapsi/service/ApiServiceInterface.java @@ -0,0 +1,22 @@ +package com.example.examengapsi.service; + +import java.util.Map; + +import retrofit2.Call; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.HeaderMap; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; + +public interface ApiServiceInterface { + + @GET("/appclienteservices/services/v3/plp") + Call getProductos( + @Query("force-plp") Boolean forcePlp, + @Query("search-string") String text, + @Query("page-number") Integer page, + @Query("number-of-items-per-page") Integer items); +} 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/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/ic_search_black_24dp.xml b/app/src/main/res/drawable/ic_search_black_24dp.xml new file mode 100644 index 0000000..affc7ba --- /dev/null +++ b/app/src/main/res/drawable/ic_search_black_24dp.xml @@ -0,0 +1,9 @@ + + + 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..37cb8f7 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000..d9224d6 --- /dev/null +++ b/app/src/main/res/layout/content_main.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/item_producto.xml b/app/src/main/res/layout/item_producto.xml new file mode 100644 index 0000000..21691ee --- /dev/null +++ b/app/src/main/res/layout/item_producto.xml @@ -0,0 +1,36 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_search_history.xml b/app/src/main/res/layout/item_search_history.xml new file mode 100644 index 0000000..97f80e4 --- /dev/null +++ b/app/src/main/res/layout/item_search_history.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000..0bc08ad --- /dev/null +++ b/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,14 @@ + + + + + + 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-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a571e60 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..61da551 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c41dd28 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..db5080a Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..6dba46d Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..da31a87 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..15ac681 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b216f2d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..f25a419 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e96783c Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_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..fddc44f --- /dev/null +++ b/app/src/main/res/navigation/nav_graph.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..0db5375 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #145012 + #237E1C + #000000 + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..59a0b0c --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,3 @@ + + 16dp + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..be681d9 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,12 @@ + + ExamenGapsi + Settings + + First Fragment + Second Fragment + Next + Previous + + Hello first fragment + Hello second fragment. Arg: %1$s + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..545b9c6 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + +