diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 508b3d9b8..7ac24c777 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -11,12 +11,7 @@
-
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 5cef573e1..5484635a4 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,9 +3,6 @@
-
-
-
@@ -30,48 +27,7 @@
-
-
-
-
-
-
-
-
- Android
-
-
- Android > Lint > Correctness
-
-
- Java
-
-
- Java language level migration aidsJava
-
-
-
-
- Android
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 98ed72a04..5f45b01b2 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,8 +2,8 @@
-
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index 7f68460d8..000000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 63b93e1df..1174b4839 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,4 +1,5 @@
apply plugin: 'com.android.application'
+apply plugin: 'android-apt'
android {
compileSdkVersion 23
@@ -20,7 +21,16 @@ android {
}
dependencies {
+ final RETROFIT_VERSION = '2.0.0-beta3'
+
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
+ compile 'com.android.support:design:23.4.0'
+ compile 'com.jakewharton:butterknife:8.0.1'
+ compile "com.squareup.retrofit2:retrofit:$RETROFIT_VERSION"
+ compile "com.squareup.retrofit2:converter-gson:$RETROFIT_VERSION"
+ compile 'com.squareup.okhttp3:logging-interceptor:3.0.0-RC1'
+ compile 'com.squareup.okhttp3:okhttp:3.0.0-RC1'
+ apt 'com.jakewharton:butterknife-compiler:8.0.1'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2a139b8a9..6fea96192 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,13 +1,32 @@
+
+
+ android:theme="@style/MaterialAppTheme">
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/org/mifos/selfserviceapp/adapters/ClientListAdapter.java b/app/src/main/java/org/mifos/selfserviceapp/adapters/ClientListAdapter.java
new file mode 100644
index 000000000..e8be588da
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/adapters/ClientListAdapter.java
@@ -0,0 +1,83 @@
+package org.mifos.selfserviceapp.adapters;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.data.Client;
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+/**
+ * @author Vishwajeet
+ * @since 20/06/16
+ */
+
+public class ClientListAdapter extends RecyclerView.Adapter {
+
+ LayoutInflater layoutInflater;
+ List listItems;
+ private Context mContext;
+
+ public ClientListAdapter(Context context, List listItems) {
+
+ layoutInflater = LayoutInflater.from(context);
+ this.listItems = listItems;
+ this.mContext = context;
+ }
+
+ public Client getItem(int position) {
+ return listItems.get(position);
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ RecyclerView.ViewHolder vh;
+ View v = LayoutInflater.from(parent.getContext()).inflate(
+ R.layout.row_client_name, parent, false);
+ vh = new ViewHolder(v);
+ return vh;
+ }
+
+ @Override
+ public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof RecyclerView.ViewHolder) {
+
+ Client client = getItem(position);
+ ((ViewHolder) holder).tv_clientName.setText(client.getFirstname() + " " + client
+ .getLastname());
+ ((ViewHolder) holder).tv_clientAccountNumber.setText(client.getAccountNo().toString());
+
+ }
+ }
+
+ @Override
+ public long getItemId(int i) {
+ return 0;
+ }
+
+ @Override
+ public int getItemCount() {
+ return listItems.size();
+ }
+
+
+ public static class ViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.tv_clientName)
+ TextView tv_clientName;
+ @BindView(R.id.tv_clientAccountNumber)
+ TextView tv_clientAccountNumber;
+
+ public ViewHolder(View v) {
+ super(v);
+ ButterKnife.bind(this, v);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/mifos/selfserviceapp/adapters/LoanAccountsListAdapter.java b/app/src/main/java/org/mifos/selfserviceapp/adapters/LoanAccountsListAdapter.java
new file mode 100644
index 000000000..b98354e3f
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/adapters/LoanAccountsListAdapter.java
@@ -0,0 +1,74 @@
+package org.mifos.selfserviceapp.adapters;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.data.accounts.LoanAccount;
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+/**
+ * @author Vishwajeet
+ * @since 22/6/16.
+ */
+public class LoanAccountsListAdapter extends RecyclerView.Adapter {
+ private final Context context;
+ private final LayoutInflater layoutInflater;
+ private List loanAccountsList = new ArrayList<>();
+
+ public LoanAccountsListAdapter(Context context, List loanAccountsList) {
+ this.context = context;
+ layoutInflater = LayoutInflater.from(context);
+ this.loanAccountsList = loanAccountsList;
+ }
+
+ public LoanAccount getItem(int position) {
+ return loanAccountsList.get(position);
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ RecyclerView.ViewHolder vh;
+ View v = LayoutInflater.from(parent.getContext()).inflate(
+ R.layout.row_loan_account, parent, false);
+ vh = new ViewHolder(v);
+ return vh;
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof RecyclerView.ViewHolder) {
+
+ LoanAccount loanAccount = getItem(position);
+ ((ViewHolder) holder).tv_clientLoanAccountNumber.setText(loanAccount.getAccountNo().toString());
+ ((ViewHolder) holder).tv_loanAccountProductName.setText(loanAccount.getProductName());
+
+ }
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return loanAccountsList.size();
+ }
+
+ public static class ViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.tv_clientLoanAccountNumber)
+ TextView tv_clientLoanAccountNumber;
+ @BindView(R.id.tv_loanAccountProductName)
+ TextView tv_loanAccountProductName;
+
+ public ViewHolder(View v) {
+ super(v);
+ ButterKnife.bind(this, v);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/mifos/selfserviceapp/adapters/SavingAccountsListAdapter.java b/app/src/main/java/org/mifos/selfserviceapp/adapters/SavingAccountsListAdapter.java
new file mode 100644
index 000000000..bf5df1fa5
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/adapters/SavingAccountsListAdapter.java
@@ -0,0 +1,75 @@
+package org.mifos.selfserviceapp.adapters;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.data.accounts.SavingAccount;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+/**
+ * @author Vishwajeet
+ * @since 22/6/16.
+ */
+public class SavingAccountsListAdapter extends RecyclerView.Adapter {
+ private final Context context;
+ private final LayoutInflater layoutInflater;
+ private List savingAccountsList = new ArrayList<>();
+
+ public SavingAccountsListAdapter(Context context, List savingAccountsList) {
+ this.context = context;
+ layoutInflater = LayoutInflater.from(context);
+ this.savingAccountsList = savingAccountsList;
+ }
+
+ public SavingAccount getItem(int position) {
+ return savingAccountsList.get(position);
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ RecyclerView.ViewHolder vh;
+ View v = LayoutInflater.from(parent.getContext()).inflate(
+ R.layout.row_saving_account, parent, false);
+ vh = new ViewHolder(v);
+ return vh;
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof RecyclerView.ViewHolder) {
+
+ SavingAccount savingAccount = getItem(position);
+ ((ViewHolder) holder).tv_clientSavingAccountNumber.setText(savingAccount.getAccountNo().toString());
+ ((ViewHolder) holder).tv_savingAccountProductName.setText(savingAccount.getProductName());
+
+ }
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return savingAccountsList.size();
+ }
+
+public static class ViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.tv_clientSavingAccountNumber)
+ TextView tv_clientSavingAccountNumber;
+ @BindView(R.id.tv_savingAccountProductName)
+ TextView tv_savingAccountProductName;
+
+ public ViewHolder(View v) {
+ super(v);
+ ButterKnife.bind(this, v);
+ }
+}
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/mifos/selfserviceapp/adapters/ViewPagerAdapter.java b/app/src/main/java/org/mifos/selfserviceapp/adapters/ViewPagerAdapter.java
new file mode 100644
index 000000000..15c1add38
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/adapters/ViewPagerAdapter.java
@@ -0,0 +1,41 @@
+package org.mifos.selfserviceapp.adapters;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Vishwajeet
+ * @since 21/6/16.
+ */
+public class ViewPagerAdapter extends FragmentPagerAdapter {
+ private final List mFragmentList = new ArrayList<>();
+ private final List mFragmentTitleList = new ArrayList<>();
+
+ public ViewPagerAdapter(FragmentManager manager) {
+ super(manager);
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ return mFragmentList.get(position);
+ }
+
+ @Override
+ public int getCount() {
+ return mFragmentList.size();
+ }
+
+ public void addFragment(Fragment fragment, String title) {
+ mFragmentList.add(fragment);
+ mFragmentTitleList.add(title);
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ return mFragmentTitleList.get(position);
+ }
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/api/ApiRequestInterceptor.java b/app/src/main/java/org/mifos/selfserviceapp/api/ApiRequestInterceptor.java
new file mode 100644
index 000000000..da2073e0d
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/api/ApiRequestInterceptor.java
@@ -0,0 +1,49 @@
+/*
+ * This project is licensed under the open source MPL V2.
+ * See https://github.com/openMF/android-client/blob/master/LICENSE.md
+ */
+
+package org.mifos.selfserviceapp.api;
+
+
+import android.content.Context;
+import android.util.Log;
+
+import org.mifos.selfserviceapp.utils.PrefManager;
+
+import java.io.IOException;
+
+import okhttp3.Interceptor;
+import okhttp3.Request;
+import okhttp3.Request.Builder;
+import okhttp3.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 21/06/16
+ */
+public class ApiRequestInterceptor implements Interceptor {
+
+ public static final String HEADER_TENANT = "Fineract-Platform-TenantId";
+ public static final String HEADER_AUTH = "Authorization";
+ private Context context;
+
+ public ApiRequestInterceptor(Context context) {
+ this.context = context;
+ }
+
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ Request chainrequest = chain.request();
+ Builder builder = chainrequest.newBuilder()
+ .header(HEADER_TENANT, "default");
+
+ if (PrefManager.getInstance(context).isAuthenticated()) {
+ builder.header(HEADER_AUTH, PrefManager.getInstance(context).getToken());
+ Log.v("TAG", PrefManager.getInstance(context).getToken());
+ }
+
+ Request request = builder.build();
+ return chain.proceed(request);
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/api/BaseApiManager.java b/app/src/main/java/org/mifos/selfserviceapp/api/BaseApiManager.java
new file mode 100644
index 000000000..daa7afa43
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/api/BaseApiManager.java
@@ -0,0 +1,73 @@
+package org.mifos.selfserviceapp.api;
+
+import android.content.Context;
+
+import org.mifos.selfserviceapp.api.services.AuthenticationService;
+import org.mifos.selfserviceapp.api.services.ClientService;
+import org.mifos.selfserviceapp.api.services.LoanAccountsListService;
+import org.mifos.selfserviceapp.api.services.SavingAccountsListService;
+import org.mifos.selfserviceapp.home.SavingAccountsListFragment;
+
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+import retrofit2.GsonConverterFactory;
+import retrofit2.Retrofit;
+
+/**
+ * @author Vishwajeet
+ * @since 13/6/16
+ */
+public class BaseApiManager {
+
+ private BaseURL baseUrl = new BaseURL();
+ private final String BASE_URL = baseUrl.getUrl();
+
+ private AuthenticationService authenticationApi;
+ private ClientService clientsApi;
+ private SavingAccountsListService savingAccountsListApi;
+ private LoanAccountsListService loanAccountsListApi;
+ private Context context;
+
+ public BaseApiManager(Context context){
+ this.context = context;
+ authenticationApi = createApi(AuthenticationService.class, BASE_URL);
+ clientsApi = createApi(ClientService.class, BASE_URL);
+ savingAccountsListApi = createApi(SavingAccountsListService.class, BASE_URL);
+ loanAccountsListApi = createApi(LoanAccountsListService.class, BASE_URL);
+ }
+
+ public OkHttpClient getOkHttpClient() {
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).addInterceptor(new ApiRequestInterceptor(context)).build();
+
+ return client;
+ }
+
+ private T createApi(Class clazz, String baseUrl) {
+
+ return new Retrofit.Builder()
+ .baseUrl(baseUrl)
+ .addConverterFactory(GsonConverterFactory.create())
+ .client(getOkHttpClient())
+ .build()
+ .create(clazz);
+ }
+
+ public AuthenticationService getAuthenticationApi(){
+ return authenticationApi;
+ }
+
+ public ClientService getClientsApi() {
+ return clientsApi;
+ }
+
+ public SavingAccountsListService getSavingAccountsListApi() {
+ return savingAccountsListApi;
+ }
+
+ public LoanAccountsListService getLoanAccountsListApi() {
+ return loanAccountsListApi;
+ }
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/api/BaseURL.java b/app/src/main/java/org/mifos/selfserviceapp/api/BaseURL.java
new file mode 100644
index 000000000..fc022dcb7
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/api/BaseURL.java
@@ -0,0 +1,21 @@
+package org.mifos.selfserviceapp.api;
+
+/**
+ * @author Vishwajeet
+ * @since 09/06/16
+ */
+
+public class BaseURL {
+
+ public static final String API_ENDPOINT = "demo.openmf.org";
+ public static final String API_PATH = "/fineract-provider/api/v1/self/";
+ public static final String PROTOCOL_HTTPS = "https://";
+
+ private String url;
+
+ public String getUrl() {
+ if (url == null)
+ return PROTOCOL_HTTPS + API_ENDPOINT + API_PATH;
+ return url;
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/api/DataManager.java b/app/src/main/java/org/mifos/selfserviceapp/api/DataManager.java
new file mode 100644
index 000000000..5d95bc0b8
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/api/DataManager.java
@@ -0,0 +1,37 @@
+package org.mifos.selfserviceapp.api;
+
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.data.User;
+import org.mifos.selfserviceapp.data.accounts.LoanAccount;
+import org.mifos.selfserviceapp.data.accounts.SavingAccount;
+
+import retrofit2.Call;
+
+/**
+ * @author Vishwajeet
+ * @since 13/6/16.
+ */
+public class DataManager {
+
+ public final BaseApiManager mBaseApiManager;
+
+ public DataManager(BaseApiManager baseApiManager){
+ mBaseApiManager = baseApiManager;
+ }
+
+ public Call login(String username, String password) {
+ return mBaseApiManager.getAuthenticationApi().authenticate(username, password);
+ }
+
+ public Call getClients() {
+ return mBaseApiManager.getClientsApi().getAllClients();
+ }
+
+ public Call getSavingAccounts(int id) {
+ return mBaseApiManager.getSavingAccountsListApi().getSavingAccountsList(id);
+ }
+
+ public Call getLoanAccounts(int id) {
+ return mBaseApiManager.getLoanAccountsListApi().getLoanAccountsList(id);
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/api/model/ApiEndPoints.java b/app/src/main/java/org/mifos/selfserviceapp/api/model/ApiEndPoints.java
new file mode 100644
index 000000000..57fb8952a
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/api/model/ApiEndPoints.java
@@ -0,0 +1,14 @@
+package org.mifos.selfserviceapp.api.model;
+
+/**
+ * @author Vishwajeet
+ * @since 11/06/16
+ */
+
+public class ApiEndPoints {
+
+ //This class contains all the Constants for API End Points
+
+ public static final String AUTHENTICATION = "authentication";
+ public static final String CLIENTS = "clients";
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/api/services/AuthenticationService.java b/app/src/main/java/org/mifos/selfserviceapp/api/services/AuthenticationService.java
new file mode 100644
index 000000000..6b3c0b373
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/api/services/AuthenticationService.java
@@ -0,0 +1,20 @@
+package org.mifos.selfserviceapp.api.services;
+
+import org.mifos.selfserviceapp.api.model.ApiEndPoints;
+import org.mifos.selfserviceapp.data.User;
+
+import retrofit2.Call;
+import retrofit2.http.POST;
+import retrofit2.http.Query;
+
+/**
+ * @author Vishwajeet
+ * @since 09/06/16
+ */
+
+public interface AuthenticationService {
+
+ @POST(ApiEndPoints.AUTHENTICATION)
+ Call authenticate(@Query("username") String username,
+ @Query("password") String password);
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/api/services/ClientService.java b/app/src/main/java/org/mifos/selfserviceapp/api/services/ClientService.java
new file mode 100644
index 000000000..6904aa752
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/api/services/ClientService.java
@@ -0,0 +1,19 @@
+package org.mifos.selfserviceapp.api.services;
+
+import org.mifos.selfserviceapp.api.model.ApiEndPoints;
+import org.mifos.selfserviceapp.data.Client;
+
+import retrofit2.Call;
+import retrofit2.http.GET;
+
+/**
+ * @author Vishwajeet
+ * @since 20/6/16.
+ */
+public interface ClientService {
+
+ //This is a default call and Loads client from 0 to 200
+ @GET(ApiEndPoints.CLIENTS)
+ Call getAllClients();
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/api/services/LoanAccountsListService.java b/app/src/main/java/org/mifos/selfserviceapp/api/services/LoanAccountsListService.java
new file mode 100644
index 000000000..9a233181b
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/api/services/LoanAccountsListService.java
@@ -0,0 +1,17 @@
+package org.mifos.selfserviceapp.api.services;
+
+import org.mifos.selfserviceapp.api.model.ApiEndPoints;
+import org.mifos.selfserviceapp.data.accounts.LoanAccount;
+
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.Path;
+
+/**
+ * Created by vjs3 on 23/6/16.
+ */
+
+public interface LoanAccountsListService {
+ @GET(ApiEndPoints.CLIENTS + "/{clientId}/accounts?fields=loanAccounts")
+ Call getLoanAccountsList(@Path("clientId") int clientId);
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/api/services/SavingAccountsListService.java b/app/src/main/java/org/mifos/selfserviceapp/api/services/SavingAccountsListService.java
new file mode 100644
index 000000000..8c506d24a
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/api/services/SavingAccountsListService.java
@@ -0,0 +1,17 @@
+package org.mifos.selfserviceapp.api.services;
+
+import org.mifos.selfserviceapp.api.model.ApiEndPoints;
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.data.accounts.SavingAccount;
+
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.Path;
+
+/**
+ * Created by vjs3 on 21/6/16.
+ */
+public interface SavingAccountsListService {
+ @GET(ApiEndPoints.CLIENTS + "/{clientId}/accounts?fields=savingsAccounts")
+ Call getSavingAccountsList(@Path("clientId") int clientId);
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/data/Client.java b/app/src/main/java/org/mifos/selfserviceapp/data/Client.java
new file mode 100644
index 000000000..3071c0f75
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/data/Client.java
@@ -0,0 +1,117 @@
+package org.mifos.selfserviceapp.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Vishwajeet
+ * @since 20/06/16
+ */
+public class Client {
+
+ private int id;
+ private String accountNo;
+ private List activationDate = new ArrayList();
+ private List dobDate = new ArrayList();
+ private String firstname;
+ private String middlename;
+ private String lastname;
+ private String displayName;
+ private String fullname;
+ private List pageItems = new ArrayList();
+
+ public List getPageItems() {
+ return pageItems;
+ }
+
+ public void setPageItems(List pageItems) {
+ this.pageItems = pageItems;
+ }
+
+ public List getDobDate() {
+ return dobDate;
+ }
+
+ public void setDobDate(List dobDate) {
+ this.dobDate = dobDate;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getAccountNo() {
+ return accountNo;
+ }
+
+ public void setAccountNo(String accountNo) {
+ this.accountNo = accountNo;
+ }
+
+ public List getActivationDate() {
+ return activationDate;
+ }
+
+ public void setActivationDate(List activationDate) {
+ this.activationDate = activationDate;
+ }
+
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ public String getMiddlename() {
+ return middlename;
+ }
+
+ public void setMiddlename(String middlename) {
+ this.middlename = middlename;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getFullname() {
+ return fullname;
+ }
+
+ public void setFullname(String fullname) {
+ this.fullname = fullname;
+ }
+
+ @Override
+ public String toString() {
+ return "Client{" +
+ "id=" + id +
+ ", accountNo='" + accountNo + '\'' +
+ ", activationDate=" + activationDate +
+ ", firstname='" + firstname + '\'' +
+ ", middlename='" + middlename + '\'' +
+ ", lastname='" + lastname + '\'' +
+ ", displayName='" + displayName + '\'' +
+ ", fullname='" + fullname + '\'' +
+ '}';
+ }
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/data/User.java b/app/src/main/java/org/mifos/selfserviceapp/data/User.java
new file mode 100644
index 000000000..fef393e5f
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/data/User.java
@@ -0,0 +1,70 @@
+package org.mifos.selfserviceapp.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Vishwajeet
+ * @since 12/06/16
+ */
+
+public class User {
+
+ private String username;
+ private int userId;
+ private String base64EncodedAuthenticationKey;
+ private boolean authenticated;
+ private List permissions = new ArrayList();
+
+ public String getUserName() {
+ return username;
+ }
+
+ public void setUserName(String username) {
+ this.username = username;
+ }
+
+ public int getUserId() {
+ return userId;
+ }
+
+ public void setUserId(int userId) {
+ this.userId = userId;
+ }
+
+ public boolean isAuthenticated() {
+ return authenticated;
+ }
+
+ public void setAuthenticated(boolean authenticated) {
+ this.authenticated = authenticated;
+ }
+
+
+ public String getBase64EncodedAuthenticationKey() {
+ return base64EncodedAuthenticationKey;
+ }
+
+ public void setBase64EncodedAuthenticationKey(String base64EncodedAuthenticationKey) {
+ this.base64EncodedAuthenticationKey = base64EncodedAuthenticationKey;
+ }
+
+ public List getPermissions() {
+ return permissions;
+ }
+
+ public void setPermissions(List permissions) {
+ this.permissions = permissions;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" +
+ "username='" + username + '\'' +
+ ", userId=" + userId +
+ ", base64EncodedAuthenticationKey='" + base64EncodedAuthenticationKey + '\'' +
+ ", authenticated=" + authenticated +
+ ", permissions=" + permissions +
+ '}';
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/data/accounts/LoanAccount.java b/app/src/main/java/org/mifos/selfserviceapp/data/accounts/LoanAccount.java
new file mode 100644
index 000000000..753ec6848
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/data/accounts/LoanAccount.java
@@ -0,0 +1,47 @@
+package org.mifos.selfserviceapp.data.accounts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Vishwajeet
+ * @since 22/06/16.
+ */
+public class LoanAccount {
+ private int id;
+ private String accountNo;
+ private String productName;
+ private List loanAccounts = new ArrayList();
+
+ public List getLoanAccounts() {
+ return loanAccounts;
+ }
+
+ public void setLoanAccounts(List loanAccounts) {
+ this.loanAccounts = loanAccounts;
+ }
+
+ public String getAccountNo() {
+ return accountNo;
+ }
+
+ public void setAccountNo(String accountNo) {
+ this.accountNo = accountNo;
+ }
+
+ public String getProductName() {
+ return productName;
+ }
+
+ public void setProductName(String productName) {
+ this.productName = productName;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/data/accounts/SavingAccount.java b/app/src/main/java/org/mifos/selfserviceapp/data/accounts/SavingAccount.java
new file mode 100644
index 000000000..094d683be
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/data/accounts/SavingAccount.java
@@ -0,0 +1,48 @@
+package org.mifos.selfserviceapp.data.accounts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *@author Vishwajeet
+ * @since 22/06/16
+ */
+
+public class SavingAccount {
+ private int id;
+ private String accountNo;
+ private String productName;
+ private List savingsAccounts = new ArrayList();
+
+ public List getSavingsAccounts() {
+ return savingsAccounts;
+ }
+
+ public void setSavingsAccounts(List savingsAccounts) {
+ this.savingsAccounts = savingsAccounts;
+ }
+
+ public String getAccountNo() {
+ return accountNo;
+ }
+
+ public void setAccountNo(String accountNo) {
+ this.accountNo = accountNo;
+ }
+
+ public String getProductName() {
+ return productName;
+ }
+
+ public void setProductName(String productName) {
+ this.productName = productName;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/ClientAccountsActivity.java b/app/src/main/java/org/mifos/selfserviceapp/home/ClientAccountsActivity.java
new file mode 100644
index 000000000..dc0c58fb7
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/ClientAccountsActivity.java
@@ -0,0 +1,43 @@
+package org.mifos.selfserviceapp.home;
+
+import android.os.Bundle;
+import android.support.design.widget.TabLayout;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.adapters.ViewPagerAdapter;
+import org.mifos.selfserviceapp.utils.Constants;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+/**
+ * @author Vishwajeet
+ * @since 21/6/16.
+ */
+public class ClientAccountsActivity extends AppCompatActivity{
+
+ @BindView(R.id.viewpager)
+ ViewPager viewPager;
+ @BindView(R.id.tabs)
+ TabLayout tabLayout;
+ private int clientId;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_client_accounts);
+ ButterKnife.bind(this);
+ clientId = getIntent().getExtras().getInt(Constants.CLIENT_ID);
+ setupViewPager(viewPager);
+ tabLayout.setupWithViewPager(viewPager);
+ }
+
+ private void setupViewPager(ViewPager viewPager) {
+ ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
+ viewPagerAdapter.addFragment(SavingAccountsListFragment.newInstance(clientId), getString(R.string.saving_accounts));
+ viewPagerAdapter.addFragment(LoanAccountsListFragment.newInstance(clientId), getString(R.string.loan_accounts));
+ viewPager.setAdapter(viewPagerAdapter);
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/ClientListFragment.java b/app/src/main/java/org/mifos/selfserviceapp/home/ClientListFragment.java
new file mode 100644
index 000000000..ff8ea0271
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/ClientListFragment.java
@@ -0,0 +1,146 @@
+package org.mifos.selfserviceapp.home;
+
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Toast;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.adapters.ClientListAdapter;
+import org.mifos.selfserviceapp.api.BaseApiManager;
+import org.mifos.selfserviceapp.api.DataManager;
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.utils.Constants;
+import org.mifos.selfserviceapp.utils.RecyclerItemClickListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 19/06/16
+ */
+
+public class ClientListFragment extends Fragment implements RecyclerItemClickListener.OnItemClickListener, ClientListMvpView {
+
+ @BindView(R.id.rv_clients)
+ RecyclerView rv_clients;
+ @BindView(R.id.swipe_container)
+ SwipeRefreshLayout swipeRefreshLayout;
+
+ ClientListAdapter clientListAdapter;
+ ClientListPresenter mClientListPresenter;
+ private View rootView;
+ private List clientList = new ArrayList<>();
+ private LinearLayoutManager layoutManager;
+ private DataManager mDataManager;
+ private BaseApiManager mBaseApiManager;
+ private ProgressDialog progress;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
+ savedInstanceState) {
+ rootView = inflater.inflate(R.layout.fragment_client_list, container, false);
+ setHasOptionsMenu(true);
+ getActivity().setTitle(getResources().getString(R.string.clients));
+ ButterKnife.bind(this, rootView);
+
+ mBaseApiManager = new BaseApiManager(getActivity());
+ mDataManager = new DataManager(mBaseApiManager);
+ mClientListPresenter = new ClientListPresenter(mDataManager);
+ mClientListPresenter.attachView(this);
+
+ layoutManager = new LinearLayoutManager(getActivity());
+ layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+ rv_clients.setLayoutManager(layoutManager);
+ rv_clients.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), this));
+ rv_clients.setHasFixedSize(true);
+
+ swipeRefreshLayout.setColorSchemeResources(R.color.blue_light, R.color.green_light, R
+ .color.orange_light, R.color.red_light);
+ swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ fetchClientList();
+ }
+ });
+
+ fetchClientList();
+
+ return rootView;
+ }
+
+ private void fetchClientList() {
+ mClientListPresenter.loadClients();
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ mClientListPresenter.detachView();
+ }
+
+ @Override
+ public void onItemClick(View childView, int position) {
+ Intent clientActivityIntent = new Intent(getActivity(), ClientAccountsActivity.class);
+ clientActivityIntent.putExtra(Constants.CLIENT_ID, clientList.get(position).getId());
+ startActivity(clientActivityIntent);
+ }
+
+ @Override
+ public void onItemLongPress(View childView, int position) {
+
+ }
+
+ @Override
+ public void showProgress() {
+ if (progress == null) {
+ progress = new ProgressDialog(getActivity(), ProgressDialog.STYLE_SPINNER);
+ progress.setCancelable(false);
+ }
+ progress.setMessage(getResources().getText(R.string.progress_message_loading));
+ progress.show();
+ }
+
+ @Override
+ public void hideProgress() {
+ if (progress != null && progress.isShowing())
+ progress.dismiss();
+ }
+
+ @Override
+ public void showClients(Response response) {
+ clientList = response.body().getPageItems();
+ inflateClientList();
+ if (swipeRefreshLayout.isRefreshing())
+ swipeRefreshLayout.setRefreshing(false);
+ }
+
+ private void inflateClientList() {
+ clientListAdapter = new ClientListAdapter(getContext(), clientList);
+ rv_clients.setAdapter(clientListAdapter);
+ }
+
+ @Override
+ public void showErrorFetchingClients(String message) {
+
+ //TODO: Handle this error properly
+ Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
+ }
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/ClientListMvpView.java b/app/src/main/java/org/mifos/selfserviceapp/home/ClientListMvpView.java
new file mode 100644
index 000000000..975b0f38a
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/ClientListMvpView.java
@@ -0,0 +1,22 @@
+package org.mifos.selfserviceapp.home;
+
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.ui.views.base.MVPView;
+
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 20/6/16.
+ */
+public interface ClientListMvpView extends MVPView {
+
+ void showClients(Response response);
+
+ void showErrorFetchingClients(String message);
+
+ void showProgress();
+
+ void hideProgress();
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/ClientListPresenter.java b/app/src/main/java/org/mifos/selfserviceapp/home/ClientListPresenter.java
new file mode 100644
index 000000000..22505f4e2
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/ClientListPresenter.java
@@ -0,0 +1,44 @@
+package org.mifos.selfserviceapp.home;
+
+import android.util.Log;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.api.DataManager;
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.presenters.BasePresenter;
+
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+/**
+ * @author Vishwajeet
+ * @since 19/06/16
+ */
+
+public class ClientListPresenter extends BasePresenter{
+
+ DataManager mDataManager;
+
+ public ClientListPresenter(DataManager dataManager) {
+ mDataManager = dataManager;
+ }
+
+ public void loadClients() {
+ Call call = mDataManager.getClients();
+ getMvpView().showProgress();
+ call.enqueue(new Callback() {
+ @Override
+ public void onResponse(Response response) {
+ getMvpView().hideProgress();
+ getMvpView().showClients(response);
+ }
+
+ @Override
+ public void onFailure(Throwable t) {
+ getMvpView().hideProgress();
+ getMvpView().showErrorFetchingClients(context.getString(R.string.error_fetching_client_list));
+ Log.e("Error",context.getString(R.string.error_message_server));
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/HomeActivity.java b/app/src/main/java/org/mifos/selfserviceapp/home/HomeActivity.java
new file mode 100644
index 000000000..e5c4492b4
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/HomeActivity.java
@@ -0,0 +1,161 @@
+package org.mifos.selfserviceapp.home;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.design.widget.NavigationView;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.util.Log;
+import android.view.MenuItem;
+import android.view.View;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.api.BaseApiManager;
+import org.mifos.selfserviceapp.api.DataManager;
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.utils.Constants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 16/06/16
+ */
+public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
+
+ private NavigationView mNavigationView;
+ private DrawerLayout mDrawerLayout;
+
+ @BindView(R.id.toolbar)
+ Toolbar toolbar;
+ private DataManager mDataManager;
+ private Intent clientActivityIntent;
+ private List clientList = new ArrayList<>();
+
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_home);
+ BaseApiManager baseApiManager = new BaseApiManager(this);
+ mDataManager = new DataManager(baseApiManager);
+ ButterKnife.bind(this);
+
+ if (toolbar != null) {
+ setSupportActionBar(toolbar);
+ toolbar.setTitle(getString(R.string.home));
+ }
+
+ loadClientDetails();
+ //replaceFragment(new ClientListFragment(), false, R.id.container);
+ // setup navigation drawer
+ setupNavigationBar();
+ }
+
+ //TODO For testing purpose only, convert it to MVP
+ private void loadClientDetails() {
+ Call call = mDataManager.getClients();
+ call.enqueue(new Callback() {
+ @Override
+ public void onResponse(Response response) {
+ if(response.body().getPageItems().size()==1) {
+ /*clientList = response.body().getPageItems();*/
+ clientActivityIntent = new Intent(getParent(), ClientAccountsActivity.class);
+ clientActivityIntent.putExtra(Constants.CLIENT_ID, response.body().getId());
+ startActivity(clientActivityIntent);
+ }
+ else {
+ replaceFragment(new ClientListFragment(), false, R.id.container);
+ }
+ }
+
+ @Override
+ public void onFailure(Throwable t) {
+
+ }
+ });
+ }
+
+ @Override
+ public boolean onNavigationItemSelected(MenuItem item) {
+ // ignore the current selected item
+ if (item.isChecked()) {
+ mDrawerLayout.closeDrawer(GravityCompat.START);
+ return false;
+ }
+
+ // select which item to open
+ switch (item.getItemId()) {
+ case R.id.item_clients:
+ replaceFragment(new ClientListFragment(), false, R.id.container);
+ break;
+ case R.id.item_accounts:
+ break;
+ case R.id.item_funds_transfer:
+ break;
+ case R.id.item_recent_transactions:
+ break;
+ case R.id.item_questionnaire:
+ break;
+ case R.id.item_about_us:
+ break;
+ }
+
+ // close the drawer
+ mDrawerLayout.closeDrawer(GravityCompat.START);
+ mNavigationView.setCheckedItem(R.id.item_clients);
+ return true;
+ }
+
+ protected void setupNavigationBar() {
+
+ // setup navigation view
+ mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
+ mNavigationView.setNavigationItemSelectedListener(this);
+
+ // setup drawer layout and sync to toolbar
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
+ ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,
+ mDrawerLayout, toolbar, R.string.open_drawer, R.string.close_drawer) {
+
+ @Override
+ public void onDrawerClosed(View drawerView) {
+ super.onDrawerClosed(drawerView);
+ }
+
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ super.onDrawerOpened(drawerView);
+ }
+ };
+ mDrawerLayout.addDrawerListener(actionBarDrawerToggle);
+ actionBarDrawerToggle.syncState();
+ }
+
+ public void replaceFragment(Fragment fragment, boolean addToBackStack, int containerId) {
+ invalidateOptionsMenu();
+ String backStateName = fragment.getClass().getName();
+ boolean fragmentPopped = getSupportFragmentManager().popBackStackImmediate(backStateName,
+ 0);
+
+ if (!fragmentPopped && getSupportFragmentManager().findFragmentByTag(backStateName) ==
+ null) {
+ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+ transaction.replace(containerId, fragment, backStateName);
+ if (addToBackStack) {
+ transaction.addToBackStack(backStateName);
+ }
+ transaction.commit();
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/LoanAccountsListFragment.java b/app/src/main/java/org/mifos/selfserviceapp/home/LoanAccountsListFragment.java
new file mode 100644
index 000000000..1d94157a6
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/LoanAccountsListFragment.java
@@ -0,0 +1,143 @@
+package org.mifos.selfserviceapp.home;
+
+import android.app.ProgressDialog;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.adapters.LoanAccountsListAdapter;
+import org.mifos.selfserviceapp.adapters.SavingAccountsListAdapter;
+import org.mifos.selfserviceapp.api.BaseApiManager;
+import org.mifos.selfserviceapp.api.DataManager;
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.data.accounts.LoanAccount;
+import org.mifos.selfserviceapp.data.accounts.SavingAccount;
+import org.mifos.selfserviceapp.utils.Constants;
+import org.mifos.selfserviceapp.utils.RecyclerItemClickListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 21/06/16
+ */
+public class LoanAccountsListFragment extends Fragment implements RecyclerItemClickListener.OnItemClickListener, LoanAccountsListView {
+
+ @BindView(R.id.rv_loan_accounts_list)
+ RecyclerView rvLoanAccounts;
+ @BindView(R.id.swipe_loan_container)
+ SwipeRefreshLayout swipeLoanContainer;
+
+ public int clientId;
+ private View rootView;
+ LoanAccountsListPresenter mLoanAccountsListPresenter;
+ private LinearLayoutManager linearLayoutManager;
+ private ProgressDialog progress;
+ private List loanAccountList = new ArrayList<>();
+ private LoanAccountsListAdapter loanAccountsListAdapter;
+ private BaseApiManager mBaseApiManager;
+ private DataManager mDataManager;
+
+ public static LoanAccountsListFragment newInstance(int clientId) {
+ LoanAccountsListFragment fragment = new LoanAccountsListFragment();
+ Bundle args = new Bundle();
+ args.putInt(Constants.CLIENT_ID, clientId);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null)
+ clientId = getArguments().getInt(Constants.CLIENT_ID);
+ setHasOptionsMenu(true);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
+ savedInstanceState) {
+ rootView = inflater.inflate(R.layout.fragment_loan_accounts_list, container, false);
+ ButterKnife.bind(this, rootView);
+ mBaseApiManager = new BaseApiManager(getActivity());
+ mDataManager = new DataManager(mBaseApiManager);
+ mLoanAccountsListPresenter = new LoanAccountsListPresenter(mDataManager);
+ mLoanAccountsListPresenter.attachView(this);
+ linearLayoutManager = new LinearLayoutManager(getActivity());
+ linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+ rvLoanAccounts.setLayoutManager(linearLayoutManager);
+ rvLoanAccounts.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), this));
+ rvLoanAccounts.setHasFixedSize(true);
+
+ swipeLoanContainer.setColorSchemeResources(R.color.blue_light, R.color.green_light, R
+ .color.orange_light, R.color.red_light);
+ swipeLoanContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ fetchLoanAccountsList();
+ }
+ });
+ fetchLoanAccountsList();
+ return rootView;
+ }
+
+ private void fetchLoanAccountsList() {
+ mLoanAccountsListPresenter.fetchLoanAccounts(clientId);
+ }
+
+ @Override
+ public void onItemClick(View childView, int position) {
+
+ }
+
+ @Override
+ public void onItemLongPress(View childView, int position) {
+
+ }
+
+ @Override
+ public void showLoanAccounts(Response response) {
+ loanAccountList = response.body().getLoanAccounts();
+ inflateLoanAccountsList();
+ if (swipeLoanContainer.isRefreshing())
+ swipeLoanContainer.setRefreshing(false);
+ }
+
+ @Override
+ public void showErrorFetchingLoanAccounts(String string) {
+
+ }
+
+ private void inflateLoanAccountsList() {
+ loanAccountsListAdapter = new LoanAccountsListAdapter(getContext(), loanAccountList);
+ rvLoanAccounts.setAdapter(loanAccountsListAdapter);
+ }
+
+ @Override
+ public void showProgress() {
+ if (progress == null) {
+ progress = new ProgressDialog(getActivity(), ProgressDialog.STYLE_SPINNER);
+ progress.setCancelable(false);
+ }
+ progress.setMessage(getResources().getText(R.string.progress_message_loading));
+ progress.show();
+ }
+
+ @Override
+ public void hideProgress() {
+ if (progress != null && progress.isShowing())
+ progress.dismiss();
+ }
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/LoanAccountsListPresenter.java b/app/src/main/java/org/mifos/selfserviceapp/home/LoanAccountsListPresenter.java
new file mode 100644
index 000000000..8ec67ab9c
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/LoanAccountsListPresenter.java
@@ -0,0 +1,46 @@
+package org.mifos.selfserviceapp.home;
+
+import android.util.Log;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.api.DataManager;
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.data.accounts.LoanAccount;
+import org.mifos.selfserviceapp.data.accounts.SavingAccount;
+import org.mifos.selfserviceapp.presenters.BasePresenter;
+
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 21/6/16.
+ */
+
+public class LoanAccountsListPresenter extends BasePresenter{
+ DataManager mDataManager;
+
+ protected LoanAccountsListPresenter(DataManager dataManager) {
+ mDataManager = dataManager;
+ }
+
+ public void fetchLoanAccounts(int id) {
+ Call call = mDataManager.getLoanAccounts(id);
+ getMvpView().showProgress();
+ call.enqueue(new Callback() {
+ @Override
+ public void onResponse(Response response) {
+ getMvpView().hideProgress();
+ getMvpView().showLoanAccounts(response);
+ }
+
+ @Override
+ public void onFailure(Throwable t) {
+ getMvpView().hideProgress();
+ getMvpView().showErrorFetchingLoanAccounts(context.getString(R.string.error_fetching_loan_accounts_list));
+ Log.e("Error",context.getString(R.string.error_message_server));
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/LoanAccountsListView.java b/app/src/main/java/org/mifos/selfserviceapp/home/LoanAccountsListView.java
new file mode 100644
index 000000000..734d95a9f
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/LoanAccountsListView.java
@@ -0,0 +1,21 @@
+package org.mifos.selfserviceapp.home;
+
+import org.mifos.selfserviceapp.data.accounts.LoanAccount;
+import org.mifos.selfserviceapp.ui.views.base.MVPView;
+
+import retrofit2.Response;
+
+/**
+ * Created by vjs3 on 23/6/16.
+ */
+
+public interface LoanAccountsListView extends MVPView {
+
+ void showLoanAccounts(Response response);
+
+ void showErrorFetchingLoanAccounts(String string);
+
+ void showProgress();
+
+ void hideProgress();
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/SavingAccountsListFragment.java b/app/src/main/java/org/mifos/selfserviceapp/home/SavingAccountsListFragment.java
new file mode 100644
index 000000000..b8a307c42
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/SavingAccountsListFragment.java
@@ -0,0 +1,142 @@
+package org.mifos.selfserviceapp.home;
+
+import android.app.ProgressDialog;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.adapters.SavingAccountsListAdapter;
+import org.mifos.selfserviceapp.api.BaseApiManager;
+import org.mifos.selfserviceapp.api.DataManager;
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.data.accounts.SavingAccount;
+import org.mifos.selfserviceapp.utils.Constants;
+import org.mifos.selfserviceapp.utils.RecyclerItemClickListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 21/06/16
+ */
+
+public class SavingAccountsListFragment extends Fragment implements RecyclerItemClickListener.OnItemClickListener, SavingAccountsListView {
+
+ @BindView(R.id.rv_saving_accounts_list)
+ RecyclerView rv_SavingAccounts;
+ @BindView(R.id.swipe_savings_container)
+ SwipeRefreshLayout swipeSavingsContainer;
+
+ public int clientId;
+ private View rootView;
+ SavingAccountsListPresenter mSavingAccountsListPresenter;
+ private LinearLayoutManager linearLayoutManager;
+ private ProgressDialog progress;
+ private List savingAccountsList = new ArrayList<>();
+ private SavingAccountsListAdapter savingAccountsListAdapter;
+ private BaseApiManager mBaseApiManager;
+ private DataManager mDataManager;
+
+ public static SavingAccountsListFragment newInstance(int clientId) {
+ SavingAccountsListFragment fragment = new SavingAccountsListFragment();
+ Bundle args = new Bundle();
+ args.putInt(Constants.CLIENT_ID, clientId);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null)
+ clientId = getArguments().getInt(Constants.CLIENT_ID);
+ setHasOptionsMenu(true);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
+ savedInstanceState) {
+ rootView = inflater.inflate(R.layout.fragment_saving_accounts_list, container, false);
+ ButterKnife.bind(this, rootView);
+ mBaseApiManager = new BaseApiManager(getActivity());
+ mDataManager = new DataManager(mBaseApiManager);
+ mSavingAccountsListPresenter = new SavingAccountsListPresenter(mDataManager);
+ mSavingAccountsListPresenter.attachView(this);
+ linearLayoutManager = new LinearLayoutManager(getActivity());
+ linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+ rv_SavingAccounts.setLayoutManager(linearLayoutManager);
+ rv_SavingAccounts.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), this));
+ rv_SavingAccounts.setHasFixedSize(true);
+
+ swipeSavingsContainer.setColorSchemeResources(R.color.blue_light, R.color.green_light, R
+ .color.orange_light, R.color.red_light);
+ swipeSavingsContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ fetchSavingAccountsList();
+ }
+ });
+ fetchSavingAccountsList();
+ return rootView;
+ }
+
+ private void fetchSavingAccountsList() {
+ mSavingAccountsListPresenter.fetchSavingAccounts(clientId);
+ }
+
+ @Override
+ public void onItemClick(View childView, int position) {
+
+ }
+
+ @Override
+ public void onItemLongPress(View childView, int position) {
+
+ }
+
+ @Override
+ public void showSavingAccounts(Response response) {
+ savingAccountsList = response.body().getSavingsAccounts();
+ inflateSavingAccountsList();
+ if (swipeSavingsContainer.isRefreshing())
+ swipeSavingsContainer.setRefreshing(false);
+ }
+
+ private void inflateSavingAccountsList() {
+ savingAccountsListAdapter = new SavingAccountsListAdapter(getContext(), savingAccountsList);
+ rv_SavingAccounts.setAdapter(savingAccountsListAdapter);
+ }
+
+ @Override
+ public void showErrorFetchingSavingAccounts(String string) {
+
+ }
+
+ @Override
+ public void showProgress() {
+ if (progress == null) {
+ progress = new ProgressDialog(getActivity(), ProgressDialog.STYLE_SPINNER);
+ progress.setCancelable(false);
+ }
+ progress.setMessage(getResources().getText(R.string.progress_message_loading));
+ progress.show();
+ }
+
+ @Override
+ public void hideProgress() {
+ if (progress != null && progress.isShowing())
+ progress.dismiss();
+ }
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/SavingAccountsListPresenter.java b/app/src/main/java/org/mifos/selfserviceapp/home/SavingAccountsListPresenter.java
new file mode 100644
index 000000000..f1ca50d3f
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/SavingAccountsListPresenter.java
@@ -0,0 +1,44 @@
+package org.mifos.selfserviceapp.home;
+
+import android.util.Log;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.api.DataManager;
+import org.mifos.selfserviceapp.data.Client;
+import org.mifos.selfserviceapp.data.accounts.SavingAccount;
+import org.mifos.selfserviceapp.presenters.BasePresenter;
+
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 21/6/16.
+ */
+public class SavingAccountsListPresenter extends BasePresenter{
+ DataManager mDataManager;
+
+ protected SavingAccountsListPresenter(DataManager dataManager) {
+ mDataManager = dataManager;
+ }
+
+ public void fetchSavingAccounts(int id) {
+ Call call = mDataManager.getSavingAccounts(id);
+ getMvpView().showProgress();
+ call.enqueue(new Callback() {
+ @Override
+ public void onResponse(Response response) {
+ getMvpView().hideProgress();
+ getMvpView().showSavingAccounts(response);
+ }
+
+ @Override
+ public void onFailure(Throwable t) {
+ getMvpView().hideProgress();
+ getMvpView().showErrorFetchingSavingAccounts(context.getString(R.string.error_fetching_saving_accounts_list));
+ Log.e("Error",context.getString(R.string.error_message_server));
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/home/SavingAccountsListView.java b/app/src/main/java/org/mifos/selfserviceapp/home/SavingAccountsListView.java
new file mode 100644
index 000000000..f2dd45496
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/home/SavingAccountsListView.java
@@ -0,0 +1,21 @@
+package org.mifos.selfserviceapp.home;
+
+import org.mifos.selfserviceapp.data.accounts.SavingAccount;
+import org.mifos.selfserviceapp.ui.views.base.MVPView;
+
+import retrofit2.Response;
+
+/**
+ * Created by vjs3 on 21/6/16.
+ */
+public interface SavingAccountsListView extends MVPView{
+
+ void showSavingAccounts(Response response);
+
+ void showErrorFetchingSavingAccounts(String string);
+
+ void showProgress();
+
+ void hideProgress();
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/login/LoginActivity.java b/app/src/main/java/org/mifos/selfserviceapp/login/LoginActivity.java
new file mode 100644
index 000000000..374a85101
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/login/LoginActivity.java
@@ -0,0 +1,122 @@
+package org.mifos.selfserviceapp.login;
+
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.AppCompatButton;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import org.mifos.selfserviceapp.data.User;
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.api.BaseApiManager;
+import org.mifos.selfserviceapp.api.DataManager;
+import org.mifos.selfserviceapp.home.HomeActivity;
+import org.mifos.selfserviceapp.utils.PrefManager;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 05/06/16
+ */
+
+public class LoginActivity extends AppCompatActivity implements LoginView{
+
+ private LoginPresenter mLoginPresenter;
+ private DataManager mDataManager;
+ private BaseApiManager mBaseApiManager;
+ private ProgressDialog progress;
+ private PrefManager prefManager;
+
+ @BindView(R.id.btn_login)
+ AppCompatButton btnLogin;
+ @BindView(R.id.et_username)
+ EditText etUsername;
+ @BindView(R.id.et_password)
+ EditText etPassword;
+
+ private String username;
+ private String password;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login);
+ ButterKnife.bind(this);
+
+ mBaseApiManager = new BaseApiManager(getApplicationContext());
+ mDataManager = new DataManager(mBaseApiManager);
+ mLoginPresenter = new LoginPresenter(mDataManager);
+ prefManager = PrefManager.getInstance(getApplicationContext());
+ mLoginPresenter.attachView(this);
+ }
+
+ public boolean validateUserInputs() {
+ username = etUsername.getEditableText().toString();
+ if (username.length() < 5) {
+ Toast.makeText(this, R.string.invalid_username, Toast.LENGTH_LONG);
+ return false;
+ }
+ password = etPassword.getEditableText().toString();
+ if (password.length() < 6) {
+ Toast.makeText(this, R.string.invalid_password, Toast.LENGTH_LONG);
+ return false;
+ }
+ return true;
+ }
+ @Override
+ public void onLoginSuccessful(String userName) {
+
+ Toast.makeText(this, getString(R.string.toast_welcome) + " "
+ +userName, Toast.LENGTH_LONG).show();
+
+ mLoginPresenter.setPref(prefManager);
+ startActivity(new Intent(this, HomeActivity.class));
+ finish();
+ }
+
+ @Override
+ public void onLoginError(Throwable throwable) {
+
+ //TODO: Handle this error properly
+ Toast.makeText(this, R.string.unable_to_connect, Toast.LENGTH_LONG).show();
+
+ }
+
+ @Override
+ public void showProgress() {
+ if (progress == null) {
+ progress = new ProgressDialog(this, ProgressDialog.STYLE_SPINNER);
+ progress.setCancelable(false);
+ }
+ progress.setMessage(getResources().getText(R.string.progress_message_login));
+ progress.show();
+ }
+
+ @Override
+ public void hideProgress() {
+ if (progress != null && progress.isShowing())
+ progress.dismiss();
+ }
+
+ @OnClick(R.id.btn_login)
+ public void loginClick(){
+ if (!validateUserInputs())
+ return;
+
+ mLoginPresenter.login(username, password);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mLoginPresenter.detachView();
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/login/LoginPresenter.java b/app/src/main/java/org/mifos/selfserviceapp/login/LoginPresenter.java
new file mode 100644
index 000000000..1249e2108
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/login/LoginPresenter.java
@@ -0,0 +1,62 @@
+package org.mifos.selfserviceapp.login;
+
+import android.util.Log;
+
+import org.mifos.selfserviceapp.R;
+import org.mifos.selfserviceapp.data.User;
+import org.mifos.selfserviceapp.api.DataManager;
+import org.mifos.selfserviceapp.presenters.BasePresenter;
+import org.mifos.selfserviceapp.utils.PrefManager;
+
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 05/06/16
+ */
+public class LoginPresenter extends BasePresenter {
+
+ DataManager mDataManager;
+ PrefManager prefManager;
+
+ protected LoginPresenter(DataManager dataManager) {
+ mDataManager = dataManager;
+ }
+
+ public void login(String username, String password) {
+ Call call = mDataManager.login(username, password);
+ getMvpView().showProgress();
+ call.enqueue(new Callback() {
+ @Override
+ public void onResponse(Response response) {
+ getMvpView().hideProgress();
+ getMvpView().onLoginSuccessful(response.body().getUserName());
+ setUserInfo(response);
+ }
+
+ @Override
+ public void onFailure(Throwable t) {
+ getMvpView().hideProgress();
+ getMvpView().onLoginError(t);
+ Log.e("Error",context.getString(R.string.error_message_server));
+ }
+ });
+ }
+
+ public void setUserInfo(Response response) {
+ // Saving userID
+ getPref().setUserId(response.body().getUserId());
+ // Saving user's token
+ getPref().saveToken("Basic "+ response.body().getBase64EncodedAuthenticationKey());
+ }
+
+ public void setPref(PrefManager prefManager) {
+ this.prefManager = prefManager;
+ }
+
+ public PrefManager getPref() {
+ return prefManager;
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/login/LoginView.java b/app/src/main/java/org/mifos/selfserviceapp/login/LoginView.java
new file mode 100644
index 000000000..b9fb572b4
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/login/LoginView.java
@@ -0,0 +1,23 @@
+package org.mifos.selfserviceapp.login;
+
+import org.mifos.selfserviceapp.data.User;
+import org.mifos.selfserviceapp.ui.views.base.MVPView;
+
+import retrofit2.Response;
+
+/**
+ * @author Vishwajeet
+ * @since 05/06/16
+ */
+
+public interface LoginView extends MVPView {
+
+ void onLoginSuccessful(String userName);
+
+ void onLoginError(Throwable throwable);
+
+ void showProgress();
+
+ void hideProgress();
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/presenters/BasePresenter.java b/app/src/main/java/org/mifos/selfserviceapp/presenters/BasePresenter.java
index 7cd8673b7..0b1c57727 100644
--- a/app/src/main/java/org/mifos/selfserviceapp/presenters/BasePresenter.java
+++ b/app/src/main/java/org/mifos/selfserviceapp/presenters/BasePresenter.java
@@ -14,9 +14,9 @@ public class BasePresenter implements Presenter {
protected Context context;
- protected BasePresenter(Context context) {
+ /*protected BasePresenter(Context context) {
this.context = context;
- }
+ }*/
@Override
public void attachView(T mvpView) {
diff --git a/app/src/main/java/org/mifos/selfserviceapp/utils/Constants.java b/app/src/main/java/org/mifos/selfserviceapp/utils/Constants.java
new file mode 100644
index 000000000..044af0ebb
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/utils/Constants.java
@@ -0,0 +1,14 @@
+package org.mifos.selfserviceapp.utils;
+
+/**
+ * @author Vishwajeet
+ * @since 21/06/16.
+ */
+
+public class Constants {
+
+ public static final String CLIENT_NAME = "clientName";
+
+ public static final String CLIENT_ID = "clientId";
+
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/utils/PrefManager.java b/app/src/main/java/org/mifos/selfserviceapp/utils/PrefManager.java
new file mode 100644
index 000000000..66cc9fd70
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/utils/PrefManager.java
@@ -0,0 +1,85 @@
+package org.mifos.selfserviceapp.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+/**
+ * @author Vishwajeet
+ * @since 07/06/16
+ */
+
+public class PrefManager {
+ private static final String USER_ID = "preferences_user_id";
+ private static final String TOKEN = "preferences_token";
+ private static final String TENANT = "preferences_tenant";
+ private Context context;
+
+ private static PrefManager instance = null;
+
+ private PrefManager(Context context) {
+ this.context = context;
+ }
+
+ public SharedPreferences getPreferences() {
+ return PreferenceManager.getDefaultSharedPreferences(context);
+ }
+
+ public static PrefManager getInstance(Context context){
+ if (instance == null) {
+ instance = new PrefManager(context);
+ }
+ return instance;
+ }
+
+ public int getInt(String preferenceKey, int preferenceDefaultValue) {
+ return getPreferences().getInt(preferenceKey, preferenceDefaultValue);
+ }
+
+ public void putInt(String preferenceKey, int preferenceValue) {
+ getPreferences().edit().putInt(preferenceKey, preferenceValue).commit();
+ }
+
+ public String getString(String preferenceKey, String preferenceDefaultValue) {
+ return getPreferences().getString(preferenceKey, preferenceDefaultValue);
+ }
+
+ public void putString(String preferenceKey, String preferenceValue) {
+ getPreferences().edit().putString(preferenceKey, preferenceValue).commit();
+ }
+
+ public void saveToken(String token) {
+ putString(TOKEN, token);
+ }
+
+ public void clearToken() {
+ putString(TOKEN, "");
+ }
+
+ public String getToken() {
+ return getString(TOKEN, "");
+ }
+
+ public boolean isAuthenticated() {
+ return !TextUtils.isEmpty(getToken());
+ }
+
+ public int getUserId() {
+ return getInt(USER_ID, -1);
+ }
+
+ public void setUserId(int id) {
+ putInt(USER_ID, id);
+ }
+
+ public String getTenant() {
+ return getString(TENANT, "default");
+ }
+
+ public void setTenant(String tenant) {
+ if (!TextUtils.isEmpty(tenant))
+ putString(TENANT, tenant);
+ }
+}
diff --git a/app/src/main/java/org/mifos/selfserviceapp/utils/RecyclerItemClickListener.java b/app/src/main/java/org/mifos/selfserviceapp/utils/RecyclerItemClickListener.java
new file mode 100644
index 000000000..ede5576e6
--- /dev/null
+++ b/app/src/main/java/org/mifos/selfserviceapp/utils/RecyclerItemClickListener.java
@@ -0,0 +1,125 @@
+package org.mifos.selfserviceapp.utils;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.RecyclerView;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * Created by vjs3 on 20/6/16.
+ */
+
+ public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
+
+ protected OnItemClickListener listener;
+
+ private GestureDetector gestureDetector;
+
+ @Nullable
+ private View childView;
+
+ private int childViewPosition;
+
+ public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
+ this.gestureDetector = new GestureDetector(context, new GestureListener());
+ this.listener = listener;
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent event) {
+ childView = view.findChildViewUnder(event.getX(), event.getY());
+ childViewPosition = view.getChildAdapterPosition(childView);
+
+ return childView != null && gestureDetector.onTouchEvent(event);
+ }
+
+ @Override
+ public void onTouchEvent(RecyclerView view, MotionEvent event) {
+ // Not needed.
+ }
+
+ @Override
+ public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+
+ }
+
+ /**
+ * A click listener for items.
+ */
+ public interface OnItemClickListener {
+
+ /**
+ * Called when an item is clicked.
+ *
+ * @param childView View of the item that was clicked.
+ * @param position Position of the item that was clicked.
+ */
+ public void onItemClick(View childView, int position);
+
+ /**
+ * Called when an item is long pressed.
+ *
+ * @param childView View of the item that was long pressed.
+ * @param position Position of the item that was long pressed.
+ */
+ public void onItemLongPress(View childView, int position);
+
+ }
+
+ /**
+ * A simple click listener whose methods can be overridden one by one.
+ */
+ public abstract static class SimpleOnItemClickListener implements OnItemClickListener {
+
+ /**
+ * Called when an item is clicked. The default implementation is a no-op.
+ *
+ * @param childView View of the item that was clicked.
+ * @param position Position of the item that was clicked.
+ */
+ public void onItemClick(View childView, int position) {
+ // Do nothing.
+ }
+
+ /**
+ * Called when an item is long pressed. The default implementation is a no-op.
+ *
+ * @param childView View of the item that was long pressed.
+ * @param position Position of the item that was long pressed.
+ */
+ public void onItemLongPress(View childView, int position) {
+ // Do nothing.
+ }
+
+ }
+
+ protected class GestureListener extends GestureDetector.SimpleOnGestureListener {
+
+ @Override
+ public boolean onSingleTapUp(MotionEvent event) {
+ if (childView != null) {
+ listener.onItemClick(childView, childViewPosition);
+ }
+
+ return true;
+ }
+
+ @Override
+ public void onLongPress(MotionEvent event) {
+ if (childView != null) {
+ listener.onItemLongPress(childView, childViewPosition);
+ }
+ }
+
+ @Override
+ public boolean onDown(MotionEvent event) {
+ // Best practice to always return true here.
+ // http://developer.android.com/training/gestures/detector.html#detect
+ return true;
+ }
+
+ }
+
+}
diff --git a/app/src/main/res/layout/activity_client_accounts.xml b/app/src/main/res/layout/activity_client_accounts.xml
new file mode 100644
index 000000000..623a9af52
--- /dev/null
+++ b/app/src/main/res/layout/activity_client_accounts.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml
new file mode 100644
index 000000000..44ba2ab7d
--- /dev/null
+++ b/app/src/main/res/layout/activity_home.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 000000000..2fe2f56dc
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_client_list.xml b/app/src/main/res/layout/fragment_client_list.xml
new file mode 100644
index 000000000..d57ecb6a0
--- /dev/null
+++ b/app/src/main/res/layout/fragment_client_list.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_loan_accounts_list.xml b/app/src/main/res/layout/fragment_loan_accounts_list.xml
new file mode 100644
index 000000000..ec46d0b60
--- /dev/null
+++ b/app/src/main/res/layout/fragment_loan_accounts_list.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_saving_accounts_list.xml b/app/src/main/res/layout/fragment_saving_accounts_list.xml
new file mode 100644
index 000000000..64a52f82a
--- /dev/null
+++ b/app/src/main/res/layout/fragment_saving_accounts_list.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/nav_drawer_header.xml b/app/src/main/res/layout/nav_drawer_header.xml
new file mode 100644
index 000000000..23d7a9790
--- /dev/null
+++ b/app/src/main/res/layout/nav_drawer_header.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/row_client_name.xml b/app/src/main/res/layout/row_client_name.xml
new file mode 100644
index 000000000..c6d5d6093
--- /dev/null
+++ b/app/src/main/res/layout/row_client_name.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/row_loan_account.xml b/app/src/main/res/layout/row_loan_account.xml
new file mode 100644
index 000000000..6633a5043
--- /dev/null
+++ b/app/src/main/res/layout/row_loan_account.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/row_saving_account.xml b/app/src/main/res/layout/row_saving_account.xml
new file mode 100644
index 000000000..70fd5a020
--- /dev/null
+++ b/app/src/main/res/layout/row_saving_account.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/toolbar.xml b/app/src/main/res/layout/toolbar.xml
new file mode 100644
index 000000000..da239d2ee
--- /dev/null
+++ b/app/src/main/res/layout/toolbar.xml
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_nav_drawer.xml b/app/src/main/res/menu/menu_nav_drawer.xml
new file mode 100644
index 000000000..0496445ae
--- /dev/null
+++ b/app/src/main/res/menu/menu_nav_drawer.xml
@@ -0,0 +1,55 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_clients.png b/app/src/main/res/mipmap-hdpi/ic_clients.png
new file mode 100644
index 000000000..5a39aa030
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_clients.png differ
diff --git a/app/src/main/res/mipmap-hdpi/mifos_logo.jpg b/app/src/main/res/mipmap-hdpi/mifos_logo.jpg
new file mode 100644
index 000000000..a067a3c8e
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/mifos_logo.jpg differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 3ab3e9cbc..9681945c4 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,6 +1,54 @@
- #3F51B5
- #303F9F
- #FF4081
-
+ #ffffffff
+ #000000
+ #ff14c416
+ #ff8bf98a
+ #fff9ac06
+ #FF87DBF9
+ #fff9393c
+ #ffd1d1d1
+ #8ad3da44
+ #8ada6134
+ #ff003fff
+ #FF0000
+
+
+ #ff33b5e5
+
+ #33999999
+
+ #BB666666
+
+ #ff99cc00
+
+ #ffff4444
+
+ #ff0099cc
+
+ #ff669900
+
+ #ffcc0000
+
+ #ffaa66cc
+
+ #ffffbb33
+
+ #ffff8800
+
+ #ff00ddff
+
+ #33CCCCCC
+
+
+
+ #3F51B5
+ #303F9F
+ #BBDEFB
+ #03A9F4
+ #212121
+ #727272
+ #FFFFFF
+ #B6B6B6
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 000000000..f9b56df01
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml
new file mode 100644
index 000000000..f76ac19fe
--- /dev/null
+++ b/app/src/main/res/values/ids.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ 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 bc250c368..d0b056ba1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,3 +1,32 @@
Self Service App
+ Login
+ Welcome
+ Not connected to internet
+ Basic
+ Invalid username
+ Invalid password
+ Logging In
+ Loading
+ Password
+ Email
+ Error loading response from server
+ Accounts
+ Clients
+ Funds Transfer
+ Recent Transactions
+ Questionnaire
+ About Us
+ Open Drawer
+ Close Drawer
+ Home
+ Medium Text
+ Small Text
+ There was some error in fetching client list
+ There was some error in fetching saving accounts list
+ There was some error in fetching loan accounts list
+ Client Accounts
+ Splash
+ Saving Accounts
+ Loan Accounts
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 5885930df..eb8fd1762 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -3,9 +3,25 @@
+
+
+
+
+
diff --git a/app/src/main/res/values/styles_frame.xml b/app/src/main/res/values/styles_frame.xml
new file mode 100644
index 000000000..4c2c04a80
--- /dev/null
+++ b/app/src/main/res/values/styles_frame.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_linear.xml b/app/src/main/res/values/styles_linear.xml
new file mode 100644
index 000000000..e4eff4eb6
--- /dev/null
+++ b/app/src/main/res/values/styles_linear.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_toolbar.xml b/app/src/main/res/values/styles_toolbar.xml
new file mode 100644
index 000000000..fded91963
--- /dev/null
+++ b/app/src/main/res/values/styles_toolbar.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 03bced9f3..cc19335cd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,6 +6,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
+ classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files