build.gradle :
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.cbrecodingtest"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
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:1.3.0"
implementation 'com.android.support:appcompat-v7:28+'
implementation 'com.android.support:recyclerview-v7:28+'
implementation 'com.android.support:cardview-v7:28+'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'io.reactivex.rxjava2:rxjava:2.1.9'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation 'com.squareup.retrofit2:converter-jackson:2.4.0'
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'io.reactivex:rxjava:1.1.6'
implementation 'com.android.support:support-v4:28.2.0'
implementation 'com.android.support:design:28.2.0'
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.android.gms:play-services-location:17.0.0'
implementation 'com.android.support:multidex:1.0.3'
}
MainActivity.java
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.viewpager.widget.ViewPager;
import com.example.cbrecodingtest.adapter.TabAdapter;
import com.example.cbrecodingtest.interfaces.RestaurantData;
import com.example.cbrecodingtest.model.RestaurantsModel;
import com.example.cbrecodingtest.utils.Utils;
import com.example.cbrecodingtest.view.MapTabFragment;
import com.example.cbrecodingtest.view.RestaurantTabFragment;
import com.google.android.material.tabs.TabLayout;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.Serializable;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity implements Callback<List<RestaurantsModel>>{
private TabAdapter mTabAdapter;
private TabLayout mTabLayout;
private ViewPager mViewPager;
public static final String BASE_URL = "http://dallas-restaurants.33gfuuywva.us-east-2.elasticbeanstalk.com/";
private int[] tabIcons = {
R.drawable.ic_restaurant,
R.drawable.ic_map
};
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViewIds();
backendApiCall();
}
private void initViewIds() {
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mViewPager = findViewById(R.id.viewPager);
mTabLayout = findViewById(R.id.tabLayout);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
highLightCurrentTab(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void highLightCurrentTab(int position) {
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
TabLayout.Tab tab = mTabLayout.getTabAt(i);
assert tab != null;
tab.setCustomView(null);
tab.setCustomView(mTabAdapter.getTabView(i));
}
TabLayout.Tab tab = mTabLayout.getTabAt(position);
assert tab != null;
tab.setCustomView(null);
tab.setCustomView(mTabAdapter.getSelectedTabView(position));
}
private void backendApiCall() {
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Utils.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
RestaurantData gerritAPI = retrofit.create(RestaurantData.class);
Call<List<RestaurantsModel>> call = gerritAPI.getRestaurantsData();
call.enqueue(this);
}
@Override
public void onResponse(Call<List<RestaurantsModel>> call, Response<List<RestaurantsModel>> response) {
if(response.isSuccessful()) {
List<RestaurantsModel> restaurantsList = response.body();
if(restaurantsList != null && restaurantsList.size() > 0) {
//Sort list items into alphabetical order..
Collections.sort(restaurantsList, new Comparator<RestaurantsModel>() {
@Override
public int compare(RestaurantsModel modelObj1, RestaurantsModel modelObj2) {
String s1 = modelObj1.getName();
String s2 = modelObj2.getName();
return s1.compareToIgnoreCase(s2);
}
});
//Create Bundle with Restaurant list...
Bundle bundle = new Bundle();
// putting questions list into the bundle .. as key value pair.
// so you can retrieve the arrayList with this key
bundle.putSerializable(Utils.RESTAURANT_LIST_KEY, (Serializable) restaurantsList);
mTabAdapter = new TabAdapter(getSupportFragmentManager(), this, bundle);
mTabAdapter.addFragment(new RestaurantTabFragment(), getResources().getString(R.string.tab1_text), tabIcons[0]);
mTabAdapter.addFragment(new MapTabFragment(), getResources().getString(R.string.tab2_text), tabIcons[1]);
mViewPager.setAdapter(mTabAdapter);
mTabLayout.setupWithViewPager(mViewPager);
highLightCurrentTab(0);
}
} else {
Log.e("MainActivity","error response " + response.errorBody());
}
}
@Override
public void onFailure(Call<List<RestaurantsModel>> call, Throwable t) {
Log.e("MainActivity","Failure in response " );
t.printStackTrace();
}
}
RestaurantData.java
import com.example.cbrecodingtest.model.RestaurantsModel;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface RestaurantData {
@GET("restaurants/")
Call<List<RestaurantsModel>> getRestaurantsData();
}
RestaurantsModel.java
import java.io.Serializable;
public class RestaurantsModel implements Serializable {
/**
* "name": "Liberty Burger",
"postalCode": "75214",
"phoneNumber": "(214) 887-9999",
"state": "Texas",
"id": "b75862f1-d28a-11e9-b5c9-0a389e6da5d4",
"websiteUrl": "https://www.givemelibertyburger.com",
"description": "Local chain outpost supplying high-end burgers plus salads & sides in spare but stylish digs.",
"category": "Burgers",
"city": "Dallas",
"longitude": -96.752351,
"goodFor": "Comfort food,Outdoor seating,Quick bite",
"latitude": 32.813099,
"closeTime": "9PM",
"streetAddress": "1904 Abrams Pkwy",
"openTime": "11AM",
"imageUrl": "https://dallas-restaurants.s3.us-east-2.amazonaws.com/fd7b13a2-ce94-11e9-a32f-2a2ae2dbcce4.jpg"
*/
String name;
String postalCode;
String phoneNumber ;
String state;
String id;
String websiteUrl;
String description;
String category;
String city;
Double longitude;
String goodFor;
Double latitude;
String closeTime;
String streetAddress;
String openTime;
String imageUrl;
public RestaurantsModel(String name, String postalCode, String phoneNumber, String state, String id, String websiteUrl,
String description, String category, String city, Double longitude, String goodFor, Double latitude, String closeTime,
String streetAddress, String openTime, String imageUrl) {
this.name = name;
this.postalCode = postalCode;
this.phoneNumber = phoneNumber;
this.state = state;
this.id = id;
this.websiteUrl = websiteUrl;
this.description = description;
this.category = category;
this.city = city;
this.longitude = longitude;
this.goodFor = goodFor;
this.latitude = latitude;
this.closeTime = closeTime;
this.streetAddress = streetAddress;
this.openTime = openTime;
this.imageUrl = imageUrl;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPostalCode() {
return postalCode;
}
public void setPostalCode(String postalCode) {
this.postalCode = postalCode;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getWebsiteUrl() {
return websiteUrl;
}
public void setWebsiteUrl(String websiteUrl) {
this.websiteUrl = websiteUrl;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public String getGoodFor() {
return goodFor;
}
public void setGoodFor(String goodFor) {
this.goodFor = goodFor;
}
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
public String getCloseTime() {
return closeTime;
}
public void setCloseTime(String closeTime) {
this.closeTime = closeTime;
}
public String getStreetAddress() {
return streetAddress;
}
public void setStreetAddress(String streetAddress) {
this.streetAddress = streetAddress;
}
public String getOpenTime() {
return openTime;
}
public void setOpenTime(String openTime) {
this.openTime = openTime;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:layout_width="match_parent"
android:layout_height="wrap_content"
layout="@layout/app_bar"
android:layout_alignParentTop="true"/>
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/tabLayout"
android:layout_below="@+id/toolbar"/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="90dp"
app:tabGravity="fill"
app:tabIndicatorColor="@color/white"
app:tabIndicatorHeight="4dp"
app:tabBackground="@color/tab_background"
android:layout_alignParentBottom="true" />
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

No comments:
Post a Comment