Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions Confirmation of Submission.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Dear Sales-i

The following project contains my submitted code for the requirements specified within your github page
(https://github.com/sales-i/android-coding-test).

I just wanted to affirm and let you know that I implemented as many of the requirements as I could
within the two hour time limit, unfortunately I couldn't implement them all.

I didn't get a chance to implement tasks iV and V.

If I did have enough time I would have done the following:

*Implement and injected the RuntimePermissions class
*Added the necessary permissions within the manifest
*Checked that the device running the app could make phone calls and had an network connection
*Check if they had permission granted, and if not request them.
*Store the granted permission within the onActivityResult callback

Looking forward to hearing from you.

James
4 changes: 4 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.salesi.coding">

<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".MainApp"
android:allowBackup="true"
Expand All @@ -18,6 +20,8 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".DetailsActivity" android:theme="@style/AppTheme.NoActionBar" />
</application>

</manifest>
46 changes: 46 additions & 0 deletions app/src/main/java/com/salesi/coding/DetailsActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.salesi.coding;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import com.salesi.coding.entity.ContactEntity;
import com.salesi.coding.ui.Fragments.DetailFragment;
import com.salesi.coding.ui.screens.FContacts;

import butterknife.Bind;
import butterknife.ButterKnife;

/**
* Created by buxtonj on 05/11/2017.
*/

public class DetailsActivity extends AppCompatActivity {
@Bind(R.id.toolbar) protected Toolbar mToolbar;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_detail);

ButterKnife.bind(this);

setSupportActionBar(mToolbar);

if (savedInstanceState == null) {
// Create the detail fragment and add it to the activity
// using a fragment transaction.

ContactEntity fContacts = (ContactEntity) getIntent().getSerializableExtra("contact");

DetailFragment fragment = new DetailFragment();
fragment.setData(fContacts);

getSupportFragmentManager().beginTransaction()
.add(R.id.contact_detail_container, fragment, MainActivity.DETAILFRAGMENT_TAG)
.commit();
}
}
}
32 changes: 32 additions & 0 deletions app/src/main/java/com/salesi/coding/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import com.salesi.coding.ui.Fragments.DetailFragment;
import com.salesi.coding.ui.adapter.TabsAdapter;

import butterknife.Bind;
Expand All @@ -16,6 +19,9 @@ public class MainActivity extends AppCompatActivity {
@Bind(R.id.view_pager) protected ViewPager mViewPager;
@Bind(R.id.toolbar) protected Toolbar mToolbar;

public static final String DETAILFRAGMENT_TAG = "DFTAG";
public static final String CONTACTFRAGMENT_TAG = "CFTAG";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Expand All @@ -26,8 +32,34 @@ protected void onCreate(Bundle savedInstanceState) {
setSupportActionBar(mToolbar);
getSupportActionBar().setLogo(R.mipmap.ic_launcher);

if (findViewById(R.id.contact_detail_container) != null) {
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.contact_detail_container, new DetailFragment(), DETAILFRAGMENT_TAG)
.commit();
}
}

TabsAdapter adapter = new TabsAdapter(getSupportFragmentManager(), getApplicationContext());
mViewPager.setAdapter(adapter);
mTabLayout.setupWithViewPager(mViewPager);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_activity, menu);

return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();

if (id == R.id.close_app_option) {
finish();
}

return super.onOptionsItemSelected(item);
}
}
56 changes: 54 additions & 2 deletions app/src/main/java/com/salesi/coding/entity/ContactEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

import com.google.gson.annotations.Expose;

import java.io.Serializable;
import java.security.spec.PSSParameterSpec;
import java.util.List;
import java.util.Locale;

/**
* Contact Entity
Expand All @@ -11,9 +14,58 @@
* Copyright © 2017 sales­i
*/

public class ContactEntity {
public class ContactEntity implements Serializable{
@Expose public Integer ContactID;
@Expose public String Title;
@Expose public String FirstName;
@Expose public String FirstNane;
@Expose public String LastName;
@Expose public String JobTitle;
@Expose public String PhoneNumber;
@Expose public String Email;

/**
* Address : {"Address1":"Marine Drive","Address2":"","Address3":"Clove Lane","Address4":"","Town":"Solihull","County":"","Postcode":"","Country":"CCV23A"}
* Hobbies : ["table-tennis","badminton"]
*/

@Expose
public AddressBean Address;
@Expose
public List<String> Hobbies;

public static class AddressBean implements Serializable {
/**
* Address1 : Marine Drive
* Address2 :
* Address3 : Clove Lane
* Address4 :
* Town : Solihull
* County :
* Postcode :
* Country : CCV23A
*/

@Expose
public String Address1;
@Expose
public String Address2;
@Expose
public String Address3;
@Expose
public String Address4;
@Expose
public String Town;
@Expose
public String County;
@Expose
public String Postcode;
@Expose
public String Country;

@Override
public String toString() {
return String.format(Locale.UK, "%s, %s, %s, %s, %s, %s, %s, %s",
Address1, Address2, Address3, Address4, Town, County,Postcode, Country);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.salesi.coding.ui.Fragments;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.salesi.coding.R;
import com.salesi.coding.entity.ContactEntity;
import com.salesi.coding.ui.screens.FContacts;

import java.util.Locale;

import static com.salesi.coding.MainActivity.CONTACTFRAGMENT_TAG;

/**
* Created by buxtonj on 05/11/2017.
*/

public class DetailFragment extends Fragment {

TextView contactName, jobTitle, phoneNumber, email, address, hobbies;
private ContactEntity contact;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {


View rootView = inflater.inflate(R.layout.fragment_detail, container, false);
contactName = (TextView) rootView.findViewById(R.id.contact_name);
jobTitle = (TextView) rootView.findViewById(R.id.jobTitle);
phoneNumber = (TextView) rootView.findViewById(R.id.phoneNumber);
email = (TextView) rootView.findViewById(R.id.email);
address = (TextView) rootView.findViewById(R.id.adress);
hobbies = (TextView) rootView.findViewById(R.id.hobbies);

if (contact != null && rootView.findViewById(R.id.contacts_frag_container) != null) {
if (savedInstanceState == null) {
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.contacts_frag_container, FContacts.instance(), CONTACTFRAGMENT_TAG)
.commit();
}
}

return rootView;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

if (contact != null) {
contactName.setText(String.format(Locale.UK, "%s %s %s", contact.Title, contact.FirstNane, contact.LastName));
jobTitle.setText(contact.JobTitle);
phoneNumber.setText(contact.PhoneNumber);
email.setText(contact.Email);


if (contact.Address != null)
address.setText(contact.Address.toString());

if (contact.Hobbies != null)
hobbies.setText(contact.Hobbies.toString());
}
}

public void setData(ContactEntity contacts) {
this.contact = contacts;
}

public ContactEntity getContact() {
return contact;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,22 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.TextView;
import android.widget.Toast;

import com.salesi.coding.MainApp;
import com.salesi.coding.R;
import com.salesi.coding.entity.ContactEntity;

import java.util.List;
import java.util.Locale;

import javax.inject.Inject;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;

/**
* Contacts view adapter
Expand All @@ -24,12 +29,20 @@
*/
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ViewHolder> {
private List<ContactEntity> mContacts;
private OnItemClickListener listener;

public interface OnItemClickListener {
void onItemClick(ContactEntity item);
}


@Inject
public ContactsAdapter() {}
public ContactsAdapter() {
}

public void setData(List<ContactEntity> contacts) {
mContacts = contacts;
public void setData(List<ContactEntity> contacts, OnItemClickListener listener) {
this.mContacts = contacts;
this.listener = listener;
}

@Override
Expand All @@ -41,7 +54,7 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(mContacts.get(position));
holder.bind(mContacts.get(position), listener);
}

@Override
Expand All @@ -53,14 +66,32 @@ class ViewHolder extends RecyclerView.ViewHolder {
@Nullable @Bind(R.id.contact_id) protected TextView mId;
@Nullable @Bind(R.id.contact_name) protected TextView mName;

@OnClick(R.id.phone)
void callContact() {
//TODO Implement Call feature
Toast.makeText(itemView.getContext(), "Calling contact...", Toast.LENGTH_SHORT).show();
}

@OnClick(R.id.email)
void emailContact() {
//TODO Implement Email feature
Toast.makeText(itemView.getContext(), "Emailing contact...", Toast.LENGTH_SHORT).show();
}

public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}

public void bind(ContactEntity entity) {
mId.setText(entity.ContactID);
mName.setText(entity.FirstName+" "+entity.LastName);
public void bind(final ContactEntity entity, final OnItemClickListener listener) {
mId.setText(String.valueOf(entity.ContactID));
mName.setText(String.format(Locale.UK, "%1$s %2$s", entity.FirstNane, entity.LastName));
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(entity);
}
});
}
}
}
Loading