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 @@ - - - - - - - - - - - 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