From 5dc8f2c128de3c767e3c00f3f7d3d58de60e4526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hamlet=20Le=C3=B3n?= Date: Wed, 29 Nov 2017 22:10:13 -0400 Subject: [PATCH 1/2] Creating views, methods and all the stuff needed for the new details representation of jobs --- .../app/activities/JobDetailsActivity.java | 134 +++++++++++- .../app/activities/MainActivity.java | 18 +- .../app/shared/IApiService.java | 5 + .../infrastructure/entities/Job.java | 3 + .../infrastructure/entities/JobDetails.java | 61 ++++++ .../EndlessRecyclerViewScrollListener.java | 4 + .../infrastructure/utils/tools.java | 16 +- app/src/main/res/drawable/company.png | Bin 0 -> 1059 bytes app/src/main/res/drawable/email.png | Bin 0 -> 669 bytes .../main/res/layout/activity_job_details.xml | 202 +++++++++++++++++- app/src/main/res/values/strings.xml | 3 + build.gradle | 2 +- 12 files changed, 431 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/hamletleon/empleado_androidjava/infrastructure/entities/JobDetails.java create mode 100644 app/src/main/res/drawable/company.png create mode 100644 app/src/main/res/drawable/email.png diff --git a/app/src/main/java/hamletleon/empleado_androidjava/app/activities/JobDetailsActivity.java b/app/src/main/java/hamletleon/empleado_androidjava/app/activities/JobDetailsActivity.java index 4f0f203..70ae81c 100644 --- a/app/src/main/java/hamletleon/empleado_androidjava/app/activities/JobDetailsActivity.java +++ b/app/src/main/java/hamletleon/empleado_androidjava/app/activities/JobDetailsActivity.java @@ -4,15 +4,42 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.AppCompatImageView; +import android.text.Editable; +import android.text.Html; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; +import com.squareup.picasso.Picasso; + +import org.xml.sax.XMLReader; + import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; import hamletleon.empleado_androidjava.R; +import hamletleon.empleado_androidjava.app.shared.IApiService; +import hamletleon.empleado_androidjava.infrastructure.api.ApiUtils; import hamletleon.empleado_androidjava.infrastructure.entities.Job; +import hamletleon.empleado_androidjava.infrastructure.entities.JobDetails; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +import static hamletleon.empleado_androidjava.infrastructure.utils.tools.SendEmailIntent; public class JobDetailsActivity extends AppCompatActivity { + @BindView(R.id.scrollView) + View mScrollView; + @BindView(R.id.progress) + View mProgress; + + // Obsolete Design + @BindView(R.id.oldView) + View mOldView; @BindView(R.id.jobTitle) TextView mJobTitle; @BindView(R.id.jobType) @@ -26,6 +53,30 @@ public class JobDetailsActivity extends AppCompatActivity { @BindView(R.id.jobDate) TextView mJobDate; + // New Design + @BindView(R.id.newView) + View mNewView; + @BindView(R.id.companyLogo) + AppCompatImageView mCompanyLogo; + @BindView(R.id.companyName) + TextView mCompanyName; + @BindView(R.id.companyLocation) + TextView mCompanyLocation; + @BindView(R.id.companyWebsite) + TextView mCompanyWebsite; + @BindView(R.id.jobTitleNew) + TextView mJobTitleNew; + @BindView(R.id.jobCategoryNew) + TextView mJobCategoryNew; + @BindView(R.id.jobDetails) + TextView mJobDetailsTextView; + @BindView(R.id.jobContactEmail) + TextView mJobContactEmail; + + private IApiService mApiService; + private Job mJob; + private JobDetails mJobDetails; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -33,7 +84,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { ButterKnife.bind(this); Intent intent = getIntent(); - Job mJob; if (intent != null && intent.getExtras() != null && intent.getExtras().containsKey(Job.class.getSimpleName())) { mJob = intent.getExtras().getParcelable(Job.class.getSimpleName()); if (mJob == null) return; @@ -41,6 +91,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { Toast.makeText(this, "FATAL ERROR!", Toast.LENGTH_SHORT).show(); return; } + mApiService = ApiUtils.getApiService(); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); @@ -48,12 +99,77 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } setTitle("Detalles de puesto"); + if (mJob.JobURI != null) { + requestJobDetails(mJob.JobURI); + } else { + setOldView(); + } + } + + private void setOldView() { mJobTitle.setText(mJob.jobTitle); mJobType.setText(mJob.jobType); mJobLocation.setText(mJob.jobLocation); mJobCompany.setText(mJob.jobCompany); mJobCategory.setText(mJob.jobCategory); mJobDate.setText(mJob.jobDate); + mProgress.setVisibility(View.GONE); + mOldView.setVisibility(View.VISIBLE); + } + + private void requestJobDetails(String jobUri) { + mApiService.getJobsDetails(jobUri.replaceFirst("/", "")).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful() && response.body() != null) { + mJobDetails = response.body(); + setNewView(); + } else { + setOldView(); + Toast.makeText(JobDetailsActivity.this, "Error: " + response.message(), Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + setOldView(); + Toast.makeText(JobDetailsActivity.this, "Error -> " + t.getMessage(), Toast.LENGTH_SHORT).show(); + } + }); + } + + private void setNewView() { + mScrollView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + + if (mJobDetails.companyLogo != null) { + String imgUrl; + if (mJobDetails.companyLogo.contains("http") || mJobDetails.companyLogo.contains("www.")) + imgUrl = mJobDetails.companyLogo.trim(); + else imgUrl = "http://www.emplea.do" + mJobDetails.companyLogo.trim(); + Picasso.with(JobDetailsActivity.this).load(imgUrl).into(mCompanyLogo); + } + + mCompanyName.setText(mJobDetails.companyName.trim()); + mCompanyLocation.setText(mJobDetails.jobLocation.trim()); + + if (mJobDetails.companyWebsite != null) + mCompanyWebsite.setText(mJobDetails.companyWebsite.trim()); + else mCompanyWebsite.setVisibility(View.GONE); + if (mJobDetails.jobTitle != null) + mJobTitleNew.setText(mJobDetails.jobTitle.trim()); + else mJobTitleNew.setText(R.string.notSpecified); + if (mJobDetails.jobCategory != null) + mJobCategoryNew.setText(mJobDetails.jobCategory.trim()); + else mJobCategoryNew.setText(R.string.notSpecified); + if (mJobDetails.jobDetails != null) + mJobDetailsTextView.setText(Html.fromHtml(mJobDetails.jobDetails.trim(), null, new UlTagHandler())); + else mJobDetailsTextView.setText(R.string.notSpecified); + if (mJobDetails.jobContacEmail != null) + mJobContactEmail.setText(String.format(getString(R.string.contactEmail), mJobDetails.jobContacEmail.trim())); + else mJobContactEmail.setText(R.string.notContactEmail); + + mProgress.setVisibility(View.GONE); + mNewView.setVisibility(View.VISIBLE); } @Override @@ -61,4 +177,20 @@ public boolean onSupportNavigateUp() { onBackPressed(); return true; } + + @OnClick(R.id.jobContactLayout) + public void OnContactLayoutClicked() { + SendEmailIntent(JobDetailsActivity.this, mJobDetails.jobContacEmail, "CV Puesto - " + mJobDetails.jobTitle, + "Saludos,\nEstoy interesado en el puesto de trabajo (" + mJobDetails.jobTitle + ")." + + "\n\nLe adjunto mi CV para que evalue si soy un candidato pertinente para el puesto." + + "\n\nGracias anteladas por su atención.\nQue tenga buen resto del día."); + } + + public class UlTagHandler implements Html.TagHandler { + @Override + public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { + if (tag.equals("ul") && !opening) output.append("\n"); + if (tag.equals("li") && opening) output.append("\n•\t"); + } + } } \ No newline at end of file diff --git a/app/src/main/java/hamletleon/empleado_androidjava/app/activities/MainActivity.java b/app/src/main/java/hamletleon/empleado_androidjava/app/activities/MainActivity.java index 96af286..ceb5444 100644 --- a/app/src/main/java/hamletleon/empleado_androidjava/app/activities/MainActivity.java +++ b/app/src/main/java/hamletleon/empleado_androidjava/app/activities/MainActivity.java @@ -2,6 +2,7 @@ import android.os.Bundle; import android.os.Parcelable; +import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -83,8 +84,11 @@ private void restorePreviousState(Bundle savedInstanceState) { mJobCategorySpinner.setEnabled(savedInstanceState.getBoolean("SAVED_SPINNER_ENABLED", true)); if (list != null && list.size() != 0) setJobsList(list); else requestJobs(); - if (mRecyclerView.getLayoutManager() != null) + if (mRecyclerView.getLayoutManager() != null) { mRecyclerView.getLayoutManager().onRestoreInstanceState(listState); + mRecyclerView.clearOnScrollListeners(); + setScrollListener((LinearLayoutManager) mRecyclerView.getLayoutManager()); + } if (mProgress.getVisibility() == View.VISIBLE) { mProgress.setVisibility(View.GONE); mRecyclerView.setVisibility(View.VISIBLE); @@ -95,7 +99,7 @@ private void restorePreviousState(Bundle savedInstanceState) { private void requestJobs() { CallUtil.enqueueWithRetry(mApiService.getJobsByCriteria(mCriteria.getMap()), new Callback>() { @Override - public void onResponse(Call> call, Response> response) { + public void onResponse(@NonNull Call> call, @NonNull Response> response) { if (response.isSuccessful() && response.body() != null) { setJobsList(response.body()); if (mProgress.getVisibility() == View.VISIBLE) { @@ -109,7 +113,7 @@ public void onResponse(Call> call, Response> response) { } @Override - public void onFailure(Call> call, Throwable t) { + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { Toast.makeText(MainActivity.this, "Error Fatal - " + t.getMessage(), Toast.LENGTH_SHORT).show(); } }); @@ -118,15 +122,16 @@ private void setJobsList(List list) { if (list != null && list.size() != 0) { if (mAdapter == null) { mAdapter = new JobsAdapter(list, mCriteria); - LinearLayoutManager manager = new LinearLayoutManager(this); + RecyclerView.LayoutManager manager = mRecyclerView.getLayoutManager(); + if (manager == null) manager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(manager); mRecyclerView.setAdapter(mAdapter); - setScrollListener(manager); + setScrollListener((LinearLayoutManager) manager); } else { mAdapter.onSearchPagination(list, mCriteria); } if (list.size() == mCriteria.PageSize) mCriteria.page++; - else endPageReached = true; + else if (list.size() < mCriteria.PageSize) endPageReached = true; } } private void setScrollListener(final LinearLayoutManager manager) { @@ -139,6 +144,7 @@ public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { } } }; + mScrollListener.setCurrentPage(mCriteria.page); assert mRecyclerView != null; mRecyclerView.addOnScrollListener(mScrollListener); } diff --git a/app/src/main/java/hamletleon/empleado_androidjava/app/shared/IApiService.java b/app/src/main/java/hamletleon/empleado_androidjava/app/shared/IApiService.java index 49f3bf5..a4c891e 100644 --- a/app/src/main/java/hamletleon/empleado_androidjava/app/shared/IApiService.java +++ b/app/src/main/java/hamletleon/empleado_androidjava/app/shared/IApiService.java @@ -4,8 +4,10 @@ import java.util.Map; import hamletleon.empleado_androidjava.infrastructure.entities.Job; +import hamletleon.empleado_androidjava.infrastructure.entities.JobDetails; import retrofit2.Call; import retrofit2.http.GET; +import retrofit2.http.Path; import retrofit2.http.QueryMap; /** @@ -16,4 +18,7 @@ public interface IApiService { @GET("empleos.json") Call> getJobsByCriteria(@QueryMap Map criteria); + + @GET("{jobUri}.json") + Call getJobsDetails(@Path(value = "jobUri", encoded = true) String jobUri); } diff --git a/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/entities/Job.java b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/entities/Job.java index 6b38607..f61e865 100644 --- a/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/entities/Job.java +++ b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/entities/Job.java @@ -28,6 +28,7 @@ public Job[] newArray(int size) { private static transient SimpleDateFormat dateFormat = new SimpleDateFormat("dd MM 'de' yyyy", Locale.ENGLISH); public String jobTitle; public String JobLink; + public String JobURI; public String jobCompany; public String jobLocation; public String jobDate; @@ -37,6 +38,7 @@ public Job[] newArray(int size) { protected Job(Parcel in) { jobTitle = in.readString(); JobLink = in.readString(); + JobURI = in.readString(); jobCompany = in.readString(); jobLocation = in.readString(); jobDate = in.readString(); @@ -57,6 +59,7 @@ public int describeContents() { public void writeToParcel(Parcel dest, int flags) { dest.writeString(jobTitle); dest.writeString(JobLink); + dest.writeString(JobURI); dest.writeString(jobCompany); dest.writeString(jobLocation); dest.writeString(jobDate); diff --git a/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/entities/JobDetails.java b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/entities/JobDetails.java new file mode 100644 index 0000000..53aa3da --- /dev/null +++ b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/entities/JobDetails.java @@ -0,0 +1,61 @@ +package hamletleon.empleado_androidjava.infrastructure.entities; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Created by hsantana on 28/11/2017. + */ + +public class JobDetails implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public JobDetails createFromParcel(Parcel in) { + return new JobDetails(in); + } + + @Override + public JobDetails[] newArray(int size) { + return new JobDetails[size]; + } + }; + public String jobTitle; + public String jobLocation; + public String jobCategory; + public String jobDetails; + public String jobContacEmail; + public String companyName; + public String companyWebsite; + public String companyLogo; + + public JobDetails() { + } + + private JobDetails(Parcel in) { + jobTitle = in.readString(); + jobLocation = in.readString(); + jobCategory = in.readString(); + jobDetails = in.readString(); + jobContacEmail = in.readString(); + companyName = in.readString(); + companyWebsite = in.readString(); + companyLogo = in.readString(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(jobTitle); + dest.writeString(jobLocation); + dest.writeString(jobCategory); + dest.writeString(jobDetails); + dest.writeString(jobContacEmail); + dest.writeString(companyName); + dest.writeString(companyWebsite); + dest.writeString(companyLogo); + } +} diff --git a/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/EndlessRecyclerViewScrollListener.java b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/EndlessRecyclerViewScrollListener.java index dad2d8c..5ecb525 100644 --- a/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/EndlessRecyclerViewScrollListener.java +++ b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/EndlessRecyclerViewScrollListener.java @@ -33,6 +33,10 @@ public EndlessRecyclerViewScrollListener(StaggeredGridLayoutManager layoutManage visibleThreshold = visibleThreshold * layoutManager.getSpanCount(); } + public void setCurrentPage(int page) { + currentPage = page; + } + public int getLastVisibleItem(int[] lastVisibleItemPositions) { int maxSize = 0; for (int i = 0; i < lastVisibleItemPositions.length; i++) { diff --git a/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/tools.java b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/tools.java index 10e7eed..bd9ccbf 100644 --- a/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/tools.java +++ b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/tools.java @@ -7,6 +7,7 @@ import android.util.DisplayMetrics; import android.view.View; import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; import java.text.DateFormat; import java.text.ParseException; @@ -43,7 +44,20 @@ public static void intentActivityActionWithMultipleExtras(Context context, Class public static void hideKeyboard(Activity mActivity, View view) { InputMethodManager imm = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE); - if (view != null) imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + if (view != null && imm != null) imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + public static void SendEmailIntent(Context context, String email, String subject, String text) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("message/rfc2822"); + intent.putExtra(Intent.EXTRA_EMAIL, new String[]{email}); + intent.putExtra(Intent.EXTRA_SUBJECT, subject); + intent.putExtra(Intent.EXTRA_TEXT, text); + try { + context.startActivity(Intent.createChooser(intent, "Enviar correo...")); + } catch (android.content.ActivityNotFoundException exc) { + Toast.makeText(context, "No hay ningun cliente de correos instalado en su dispositivo.", Toast.LENGTH_LONG).show(); + } } public static boolean checkString(String check) { diff --git a/app/src/main/res/drawable/company.png b/app/src/main/res/drawable/company.png new file mode 100644 index 0000000000000000000000000000000000000000..437a3767884f8256773762d12503819bb2ada85d GIT binary patch literal 1059 zcmeAS@N?(olHy`uVBq!ia0vp^ZXnFT1|$ph9<=}|mSQK*5Dp-y;YjHK@;M7UB8wRq zG~z*+@xi3teLz9U64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq!<{O7kIij zhE&XXJKHxSBwXb9|L1%6oD>&(thDWcla9t^p;BdzCJ6(-NqW1CX1|Ja*)^f9Yr#%M z?xX9c=81^w?edzwFfB_#lXdHs?rRTRR5~u`-D0_=CiQqv;l08{F~i#DXYZK5pVjo7 zeY55Jd7t0?*&*-zj(34Z*P=be8mE(XpM7%7=#cK4g_fsxZC$|ew5a?0@5#Zo+%vD{ zY;m}E=O*`uLN;-Z7iSg)XC@}}Iks7UsKa_^Nw7U3UZ zJ2b7#ey7%3`Zk8dXPln8d#$wC{9fi8^VR;}bqqeu@oV0!chk4cjGJ{mHzHLxkb+K=fjWZ5134Qmin4i@Rzr9>uobj-);Jd%O-Q0%@;B_+wk>5E(=qX z#0#bkrtd6`{g^fgC7UMgI@epeM~l63$*6wzBdUxYzno}^X`%ZKDMhZVjYk~O=!=7_+>XE!Vg z&M)hWevub5MY$#=_^4mc9<`;v);?fjI=(L7MdZd6&#kfh`6J$YnbjD@{ArrGYtk*2 zw>F;=Hf-2pwe54##=VjR%2KUGFi}Kg z&zIP+-JfT;SAElqbQ!;+3|CGb*tSG0QSa0BW2bhW;CHe&|f#!3y!a3pX1$D{Z zEVTvUXIVW2H~ctn*L|Lh4DT%h3-rZ3Sai0ot^X}%)n(`U-`T9vmec!QPFGs z{?`eYGp7#L-r`&O*MH|(?fF}4PqHAHy87t$mA(6`cRs0qv&vX6Gjp}oUW2v3Y?5*y Z`(p`r@?vH-|0sa*#C7CT0lh0j4I{lJ^ej=QI-FFs6P{c;@F!2C+@&mZy8QYQU8 zp}B>+qv31zp_nsPt+*dO%}szsXupZ4xru7U{Uqj$HH&I02EGHm0!s625k7jjK6(U-uO`g0I1eV@c6uDmkpUW z7&q)@xa3XXnPAgfnN+!@d@YMZwlrM^u6c9$Wv6CO4Gg$m)Kno#9%!M}|Dtr)e;x1P zg4@Hz;22VfSn+<|-%2%IDy?v=irYa){NHH&Ts5I0;qjEv{6c#*)^HpWi}5au5U|_r z75}lv%z0BEG+G^Ks$kd+pyk~s0%b&|>bH*$9Zr - + android:layout_height="wrap_content" + android:layout_gravity="center"> - + android:layout_height="wrap_content"> @@ -147,5 +151,187 @@ - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4953078..23906d9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,6 @@ Emplea.do + Interesado? Favor contactar a %1$s + No especificado + El empleador no ha especificado ninguna forma de contacto diff --git a/build.gradle b/build.gradle index 020eae2..e6b32bc 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.android.tools.build:gradle:3.0.1' // NOTE: Do not place your application dependencies here; they belong From 1271da9134f17247c4de4f12dc04788b2a1696e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hamlet=20Le=C3=B3n?= Date: Wed, 29 Nov 2017 22:13:43 -0400 Subject: [PATCH 2/2] Creating views, methods and all the stuff needed for the new details representation of jobs --- .../infrastructure/utils/requestUtils/RetrofitClient.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/requestUtils/RetrofitClient.java b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/requestUtils/RetrofitClient.java index d20a6ce..360878e 100644 --- a/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/requestUtils/RetrofitClient.java +++ b/app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/requestUtils/RetrofitClient.java @@ -23,9 +23,9 @@ public static Retrofit getClient(String baseUrl) { // interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); okHttpClient = new OkHttpClient.Builder() // .addInterceptor(interceptor) - .connectTimeout(2, TimeUnit.MINUTES) - .writeTimeout(2, TimeUnit.MINUTES) - .readTimeout(2, TimeUnit.MINUTES) + .connectTimeout(30, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) .build(); retrofit = new Retrofit.Builder() .baseUrl(baseUrl)