Skip to content

Commit 90d956b

Browse files
authored
Merge pull request #3 from HamletLeon/DetailsOfJobs
Details of jobs
2 parents f390896 + 1271da9 commit 90d956b

13 files changed

Lines changed: 434 additions & 20 deletions

File tree

app/src/main/java/hamletleon/empleado_androidjava/app/activities/JobDetailsActivity.java

Lines changed: 133 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,42 @@
44
import android.os.Bundle;
55
import android.support.annotation.Nullable;
66
import android.support.v7.app.AppCompatActivity;
7+
import android.support.v7.widget.AppCompatImageView;
8+
import android.text.Editable;
9+
import android.text.Html;
10+
import android.view.View;
11+
import android.view.ViewGroup;
12+
import android.widget.FrameLayout;
713
import android.widget.TextView;
814
import android.widget.Toast;
915

16+
import com.squareup.picasso.Picasso;
17+
18+
import org.xml.sax.XMLReader;
19+
1020
import butterknife.BindView;
1121
import butterknife.ButterKnife;
22+
import butterknife.OnClick;
1223
import hamletleon.empleado_androidjava.R;
24+
import hamletleon.empleado_androidjava.app.shared.IApiService;
25+
import hamletleon.empleado_androidjava.infrastructure.api.ApiUtils;
1326
import hamletleon.empleado_androidjava.infrastructure.entities.Job;
27+
import hamletleon.empleado_androidjava.infrastructure.entities.JobDetails;
28+
import retrofit2.Call;
29+
import retrofit2.Callback;
30+
import retrofit2.Response;
31+
32+
import static hamletleon.empleado_androidjava.infrastructure.utils.tools.SendEmailIntent;
1433

1534
public class JobDetailsActivity extends AppCompatActivity {
35+
@BindView(R.id.scrollView)
36+
View mScrollView;
37+
@BindView(R.id.progress)
38+
View mProgress;
39+
40+
// Obsolete Design
41+
@BindView(R.id.oldView)
42+
View mOldView;
1643
@BindView(R.id.jobTitle)
1744
TextView mJobTitle;
1845
@BindView(R.id.jobType)
@@ -26,39 +53,144 @@ public class JobDetailsActivity extends AppCompatActivity {
2653
@BindView(R.id.jobDate)
2754
TextView mJobDate;
2855

56+
// New Design
57+
@BindView(R.id.newView)
58+
View mNewView;
59+
@BindView(R.id.companyLogo)
60+
AppCompatImageView mCompanyLogo;
61+
@BindView(R.id.companyName)
62+
TextView mCompanyName;
63+
@BindView(R.id.companyLocation)
64+
TextView mCompanyLocation;
65+
@BindView(R.id.companyWebsite)
66+
TextView mCompanyWebsite;
67+
@BindView(R.id.jobTitleNew)
68+
TextView mJobTitleNew;
69+
@BindView(R.id.jobCategoryNew)
70+
TextView mJobCategoryNew;
71+
@BindView(R.id.jobDetails)
72+
TextView mJobDetailsTextView;
73+
@BindView(R.id.jobContactEmail)
74+
TextView mJobContactEmail;
75+
76+
private IApiService mApiService;
77+
private Job mJob;
78+
private JobDetails mJobDetails;
79+
2980
@Override
3081
protected void onCreate(@Nullable Bundle savedInstanceState) {
3182
super.onCreate(savedInstanceState);
3283
setContentView(R.layout.activity_job_details);
3384
ButterKnife.bind(this);
3485
Intent intent = getIntent();
3586

36-
Job mJob;
3787
if (intent != null && intent.getExtras() != null && intent.getExtras().containsKey(Job.class.getSimpleName())) {
3888
mJob = intent.getExtras().getParcelable(Job.class.getSimpleName());
3989
if (mJob == null) return;
4090
} else {
4191
Toast.makeText(this, "FATAL ERROR!", Toast.LENGTH_SHORT).show();
4292
return;
4393
}
94+
mApiService = ApiUtils.getApiService();
4495

4596
if (getSupportActionBar() != null) {
4697
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
4798
getSupportActionBar().setDisplayShowHomeEnabled(true);
4899
}
49100
setTitle("Detalles de puesto");
50101

102+
if (mJob.JobURI != null) {
103+
requestJobDetails(mJob.JobURI);
104+
} else {
105+
setOldView();
106+
}
107+
}
108+
109+
private void setOldView() {
51110
mJobTitle.setText(mJob.jobTitle);
52111
mJobType.setText(mJob.jobType);
53112
mJobLocation.setText(mJob.jobLocation);
54113
mJobCompany.setText(mJob.jobCompany);
55114
mJobCategory.setText(mJob.jobCategory);
56115
mJobDate.setText(mJob.jobDate);
116+
mProgress.setVisibility(View.GONE);
117+
mOldView.setVisibility(View.VISIBLE);
118+
}
119+
120+
private void requestJobDetails(String jobUri) {
121+
mApiService.getJobsDetails(jobUri.replaceFirst("/", "")).enqueue(new Callback<JobDetails>() {
122+
@Override
123+
public void onResponse(Call<JobDetails> call, Response<JobDetails> response) {
124+
if (response.isSuccessful() && response.body() != null) {
125+
mJobDetails = response.body();
126+
setNewView();
127+
} else {
128+
setOldView();
129+
Toast.makeText(JobDetailsActivity.this, "Error: " + response.message(), Toast.LENGTH_SHORT).show();
130+
}
131+
}
132+
133+
@Override
134+
public void onFailure(Call<JobDetails> call, Throwable t) {
135+
setOldView();
136+
Toast.makeText(JobDetailsActivity.this, "Error -> " + t.getMessage(), Toast.LENGTH_SHORT).show();
137+
}
138+
});
139+
}
140+
141+
private void setNewView() {
142+
mScrollView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
143+
144+
if (mJobDetails.companyLogo != null) {
145+
String imgUrl;
146+
if (mJobDetails.companyLogo.contains("http") || mJobDetails.companyLogo.contains("www."))
147+
imgUrl = mJobDetails.companyLogo.trim();
148+
else imgUrl = "http://www.emplea.do" + mJobDetails.companyLogo.trim();
149+
Picasso.with(JobDetailsActivity.this).load(imgUrl).into(mCompanyLogo);
150+
}
151+
152+
mCompanyName.setText(mJobDetails.companyName.trim());
153+
mCompanyLocation.setText(mJobDetails.jobLocation.trim());
154+
155+
if (mJobDetails.companyWebsite != null)
156+
mCompanyWebsite.setText(mJobDetails.companyWebsite.trim());
157+
else mCompanyWebsite.setVisibility(View.GONE);
158+
if (mJobDetails.jobTitle != null)
159+
mJobTitleNew.setText(mJobDetails.jobTitle.trim());
160+
else mJobTitleNew.setText(R.string.notSpecified);
161+
if (mJobDetails.jobCategory != null)
162+
mJobCategoryNew.setText(mJobDetails.jobCategory.trim());
163+
else mJobCategoryNew.setText(R.string.notSpecified);
164+
if (mJobDetails.jobDetails != null)
165+
mJobDetailsTextView.setText(Html.fromHtml(mJobDetails.jobDetails.trim(), null, new UlTagHandler()));
166+
else mJobDetailsTextView.setText(R.string.notSpecified);
167+
if (mJobDetails.jobContacEmail != null)
168+
mJobContactEmail.setText(String.format(getString(R.string.contactEmail), mJobDetails.jobContacEmail.trim()));
169+
else mJobContactEmail.setText(R.string.notContactEmail);
170+
171+
mProgress.setVisibility(View.GONE);
172+
mNewView.setVisibility(View.VISIBLE);
57173
}
58174

59175
@Override
60176
public boolean onSupportNavigateUp() {
61177
onBackPressed();
62178
return true;
63179
}
180+
181+
@OnClick(R.id.jobContactLayout)
182+
public void OnContactLayoutClicked() {
183+
SendEmailIntent(JobDetailsActivity.this, mJobDetails.jobContacEmail, "CV Puesto - " + mJobDetails.jobTitle,
184+
"Saludos,\nEstoy interesado en el puesto de trabajo (" + mJobDetails.jobTitle + ")." +
185+
"\n\nLe adjunto mi CV para que evalue si soy un candidato pertinente para el puesto." +
186+
"\n\nGracias anteladas por su atención.\nQue tenga buen resto del día.");
187+
}
188+
189+
public class UlTagHandler implements Html.TagHandler {
190+
@Override
191+
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
192+
if (tag.equals("ul") && !opening) output.append("\n");
193+
if (tag.equals("li") && opening) output.append("\n\t");
194+
}
195+
}
64196
}

app/src/main/java/hamletleon/empleado_androidjava/app/activities/MainActivity.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.os.Bundle;
44
import android.os.Parcelable;
5+
import android.support.annotation.NonNull;
56
import android.support.v7.app.AppCompatActivity;
67
import android.support.v7.widget.LinearLayoutManager;
78
import android.support.v7.widget.RecyclerView;
@@ -83,8 +84,11 @@ private void restorePreviousState(Bundle savedInstanceState) {
8384
mJobCategorySpinner.setEnabled(savedInstanceState.getBoolean("SAVED_SPINNER_ENABLED", true));
8485
if (list != null && list.size() != 0) setJobsList(list);
8586
else requestJobs();
86-
if (mRecyclerView.getLayoutManager() != null)
87+
if (mRecyclerView.getLayoutManager() != null) {
8788
mRecyclerView.getLayoutManager().onRestoreInstanceState(listState);
89+
mRecyclerView.clearOnScrollListeners();
90+
setScrollListener((LinearLayoutManager) mRecyclerView.getLayoutManager());
91+
}
8892
if (mProgress.getVisibility() == View.VISIBLE) {
8993
mProgress.setVisibility(View.GONE);
9094
mRecyclerView.setVisibility(View.VISIBLE);
@@ -95,7 +99,7 @@ private void restorePreviousState(Bundle savedInstanceState) {
9599
private void requestJobs() {
96100
CallUtil.enqueueWithRetry(mApiService.getJobsByCriteria(mCriteria.getMap()), new Callback<List<Job>>() {
97101
@Override
98-
public void onResponse(Call<List<Job>> call, Response<List<Job>> response) {
102+
public void onResponse(@NonNull Call<List<Job>> call, @NonNull Response<List<Job>> response) {
99103
if (response.isSuccessful() && response.body() != null) {
100104
setJobsList(response.body());
101105
if (mProgress.getVisibility() == View.VISIBLE) {
@@ -109,7 +113,7 @@ public void onResponse(Call<List<Job>> call, Response<List<Job>> response) {
109113
}
110114

111115
@Override
112-
public void onFailure(Call<List<Job>> call, Throwable t) {
116+
public void onFailure(@NonNull Call<List<Job>> call, @NonNull Throwable t) {
113117
Toast.makeText(MainActivity.this, "Error Fatal - " + t.getMessage(), Toast.LENGTH_SHORT).show();
114118
}
115119
});
@@ -118,15 +122,16 @@ private void setJobsList(List<Job> list) {
118122
if (list != null && list.size() != 0) {
119123
if (mAdapter == null) {
120124
mAdapter = new JobsAdapter(list, mCriteria);
121-
LinearLayoutManager manager = new LinearLayoutManager(this);
125+
RecyclerView.LayoutManager manager = mRecyclerView.getLayoutManager();
126+
if (manager == null) manager = new LinearLayoutManager(this);
122127
mRecyclerView.setLayoutManager(manager);
123128
mRecyclerView.setAdapter(mAdapter);
124-
setScrollListener(manager);
129+
setScrollListener((LinearLayoutManager) manager);
125130
} else {
126131
mAdapter.onSearchPagination(list, mCriteria);
127132
}
128133
if (list.size() == mCriteria.PageSize) mCriteria.page++;
129-
else endPageReached = true;
134+
else if (list.size() < mCriteria.PageSize) endPageReached = true;
130135
}
131136
}
132137
private void setScrollListener(final LinearLayoutManager manager) {
@@ -139,6 +144,7 @@ public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
139144
}
140145
}
141146
};
147+
mScrollListener.setCurrentPage(mCriteria.page);
142148
assert mRecyclerView != null;
143149
mRecyclerView.addOnScrollListener(mScrollListener);
144150
}

app/src/main/java/hamletleon/empleado_androidjava/app/shared/IApiService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import java.util.Map;
55

66
import hamletleon.empleado_androidjava.infrastructure.entities.Job;
7+
import hamletleon.empleado_androidjava.infrastructure.entities.JobDetails;
78
import retrofit2.Call;
89
import retrofit2.http.GET;
10+
import retrofit2.http.Path;
911
import retrofit2.http.QueryMap;
1012

1113
/**
@@ -16,4 +18,7 @@
1618
public interface IApiService {
1719
@GET("empleos.json")
1820
Call<List<Job>> getJobsByCriteria(@QueryMap Map<String, Object> criteria);
21+
22+
@GET("{jobUri}.json")
23+
Call<JobDetails> getJobsDetails(@Path(value = "jobUri", encoded = true) String jobUri);
1924
}

app/src/main/java/hamletleon/empleado_androidjava/infrastructure/entities/Job.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public Job[] newArray(int size) {
2828
private static transient SimpleDateFormat dateFormat = new SimpleDateFormat("dd MM 'de' yyyy", Locale.ENGLISH);
2929
public String jobTitle;
3030
public String JobLink;
31+
public String JobURI;
3132
public String jobCompany;
3233
public String jobLocation;
3334
public String jobDate;
@@ -37,6 +38,7 @@ public Job[] newArray(int size) {
3738
protected Job(Parcel in) {
3839
jobTitle = in.readString();
3940
JobLink = in.readString();
41+
JobURI = in.readString();
4042
jobCompany = in.readString();
4143
jobLocation = in.readString();
4244
jobDate = in.readString();
@@ -57,6 +59,7 @@ public int describeContents() {
5759
public void writeToParcel(Parcel dest, int flags) {
5860
dest.writeString(jobTitle);
5961
dest.writeString(JobLink);
62+
dest.writeString(JobURI);
6063
dest.writeString(jobCompany);
6164
dest.writeString(jobLocation);
6265
dest.writeString(jobDate);
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package hamletleon.empleado_androidjava.infrastructure.entities;
2+
3+
import android.os.Parcel;
4+
import android.os.Parcelable;
5+
6+
/**
7+
* Created by hsantana on 28/11/2017.
8+
*/
9+
10+
public class JobDetails implements Parcelable {
11+
public static final Creator<JobDetails> CREATOR = new Creator<JobDetails>() {
12+
@Override
13+
public JobDetails createFromParcel(Parcel in) {
14+
return new JobDetails(in);
15+
}
16+
17+
@Override
18+
public JobDetails[] newArray(int size) {
19+
return new JobDetails[size];
20+
}
21+
};
22+
public String jobTitle;
23+
public String jobLocation;
24+
public String jobCategory;
25+
public String jobDetails;
26+
public String jobContacEmail;
27+
public String companyName;
28+
public String companyWebsite;
29+
public String companyLogo;
30+
31+
public JobDetails() {
32+
}
33+
34+
private JobDetails(Parcel in) {
35+
jobTitle = in.readString();
36+
jobLocation = in.readString();
37+
jobCategory = in.readString();
38+
jobDetails = in.readString();
39+
jobContacEmail = in.readString();
40+
companyName = in.readString();
41+
companyWebsite = in.readString();
42+
companyLogo = in.readString();
43+
}
44+
45+
@Override
46+
public int describeContents() {
47+
return 0;
48+
}
49+
50+
@Override
51+
public void writeToParcel(Parcel dest, int flags) {
52+
dest.writeString(jobTitle);
53+
dest.writeString(jobLocation);
54+
dest.writeString(jobCategory);
55+
dest.writeString(jobDetails);
56+
dest.writeString(jobContacEmail);
57+
dest.writeString(companyName);
58+
dest.writeString(companyWebsite);
59+
dest.writeString(companyLogo);
60+
}
61+
}

app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/EndlessRecyclerViewScrollListener.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ public EndlessRecyclerViewScrollListener(StaggeredGridLayoutManager layoutManage
3333
visibleThreshold = visibleThreshold * layoutManager.getSpanCount();
3434
}
3535

36+
public void setCurrentPage(int page) {
37+
currentPage = page;
38+
}
39+
3640
public int getLastVisibleItem(int[] lastVisibleItemPositions) {
3741
int maxSize = 0;
3842
for (int i = 0; i < lastVisibleItemPositions.length; i++) {

app/src/main/java/hamletleon/empleado_androidjava/infrastructure/utils/requestUtils/RetrofitClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ public static Retrofit getClient(String baseUrl) {
2323
// interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
2424
okHttpClient = new OkHttpClient.Builder()
2525
// .addInterceptor(interceptor)
26-
.connectTimeout(2, TimeUnit.MINUTES)
27-
.writeTimeout(2, TimeUnit.MINUTES)
28-
.readTimeout(2, TimeUnit.MINUTES)
26+
.connectTimeout(30, TimeUnit.SECONDS)
27+
.writeTimeout(30, TimeUnit.SECONDS)
28+
.readTimeout(30, TimeUnit.SECONDS)
2929
.build();
3030
retrofit = new Retrofit.Builder()
3131
.baseUrl(baseUrl)

0 commit comments

Comments
 (0)