This is an automated email from the ASF dual-hosted git repository.

rajanmaurya154 pushed a commit to branch development
in repository https://gitbox.apache.org/repos/asf/fineract-cn-mobile.git

commit 27c51d62b73490d9420a9c07c6867b8abcd7034f
Author: Mohak <[email protected]>
AuthorDate: Thu Jul 19 13:34:30 2018 +0530

    feat : search and list accounts
---
 .../java/org/apache/fineract/FakeJsonName.java     |   1 +
 .../org/apache/fineract/FakeRemoteDataSource.java  |   5 +
 .../data/datamanager/DataManagerAccounting.kt      |  14 ++
 .../fineract/data/models/accounts/Account.kt       |  39 +++++
 .../fineract/data/models/accounts/AccountPage.kt   |   9 ++
 .../fineract/data/services/AccountingService.kt    |   8 +
 .../injection/component/ActivityComponent.java     |   3 +
 .../apache/fineract/ui/adapters/AccountsAdapter.kt |  66 ++++++++
 .../fineract/ui/online/DashboardActivity.java      |   4 +
 .../online/accounting/accounts/AccountContract.kt  |  33 ++++
 .../online/accounting/accounts/AccountsFragment.kt | 166 +++++++++++++++++++++
 .../accounting/accounts/AccountsPresenter.kt       |  82 ++++++++++
 app/src/main/res/layout/fragment_accounts.xml      |  26 ++++
 app/src/main/res/layout/item_account.xml           |  76 ++++++++++
 app/src/main/res/menu/menu_account_search.xml      |  12 ++
 app/src/main/res/menu/menu_navigation_drawer.xml   |   5 +
 app/src/main/res/values/strings.xml                |   2 +
 app/src/main/resources/accountsPage.json           |  94 ++++++++++++
 18 files changed, 645 insertions(+)

diff --git a/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java 
b/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java
index 95a3bdd..29c2de8 100644
--- a/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java
+++ b/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java
@@ -18,4 +18,5 @@ public class FakeJsonName {
     public static final String PLANNED_PAYMENT_PAGE = 
"plannedPaymentPage.json";
     public static final String ROLES = "role.json";
     public static final String LEDGER_PAGE = "ledgerPage.json";
+    public static final String ACCOUNT_PAGE = "accountsPage.json";
 }
diff --git 
a/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java 
b/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java
index 02611f9..c510bc1 100644
--- a/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java
+++ b/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java
@@ -4,6 +4,7 @@ import com.google.gson.reflect.TypeToken;
 
 import org.apache.fineract.data.models.Authentication;
 import org.apache.fineract.data.models.accounts.LedgerPage;
+import org.apache.fineract.data.models.accounts.AccountPage;
 import org.apache.fineract.data.models.customer.Command;
 import org.apache.fineract.data.models.customer.Customer;
 import org.apache.fineract.data.models.customer.CustomerPage;
@@ -84,4 +85,8 @@ public class FakeRemoteDataSource {
         return testDataFactory.getObjectTypePojo(LedgerPage.class, 
FakeJsonName.LEDGER_PAGE);
     }
 
+    public static AccountPage getAccountPage() {
+        return testDataFactory.getObjectTypePojo(AccountPage.class, 
FakeJsonName.ACCOUNT_PAGE);
+    }
+
 }
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAccounting.kt
 
b/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAccounting.kt
index 8d96cc6..ed1304d 100644
--- 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAccounting.kt
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAccounting.kt
@@ -9,6 +9,8 @@ import javax.inject.Inject
 import org.apache.fineract.FakeRemoteDataSource
 import org.apache.fineract.data.datamanager.api.DataManagerAuth
 import org.apache.fineract.data.datamanager.api.FineractBaseDataManager
+import org.apache.fineract.data.models.accounts.Account
+import org.apache.fineract.data.models.accounts.AccountPage
 import org.apache.fineract.data.models.accounts.Ledger
 import org.apache.fineract.data.models.accounts.LedgerPage
 import javax.inject.Singleton
@@ -28,4 +30,16 @@ class DataManagerAccounting @Inject constructor(val 
baseManagerApi: BaseApiManag
             baseManagerApi.accountingService.findLedger(identifier)
                     .onErrorResumeNext(Function<Throwable, 
ObservableSource<Ledger>>
                     { 
Observable.just(FakeRemoteDataSource.getLedgerPage()!!.ledgers!![0]) })
+
+    fun getAccounts(): Observable<AccountPage> =
+            baseManagerApi.accountingService.fetchAccounts()
+                    .onErrorResumeNext(Function<Throwable, 
ObservableSource<AccountPage>>
+                    { Observable.just(FakeRemoteDataSource.getAccountPage()) })
+
+
+    fun findAccount(identifier: String): Observable<Account> =
+            baseManagerApi.accountingService.findAccount(identifier)
+                    .onErrorResumeNext(Function<Throwable, 
ObservableSource<Account>>
+                    { 
Observable.just(FakeRemoteDataSource.getAccountPage()!!.accounts!![0]) })
+
 }
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/data/models/accounts/Account.kt 
b/app/src/main/java/org/apache/fineract/data/models/accounts/Account.kt
new file mode 100644
index 0000000..52761c4
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/data/models/accounts/Account.kt
@@ -0,0 +1,39 @@
+package org.apache.fineract.data.models.accounts
+
+import android.os.Parcelable
+import com.google.gson.annotations.SerializedName
+import kotlinx.android.parcel.Parcelize
+
+@Parcelize
+data class Account(
+
+        @SerializedName("type") val type: AccountType? = null,
+        @SerializedName("identifier") val identifier: String? = null,
+        @SerializedName("name") val name: String? = null,
+        @SerializedName("holders") val holders: Set<String>? = null,
+        @SerializedName("signatureAuthorities") val signatureAuthorities: 
Set<String>? = null,
+        @SerializedName("balance") val balance: Double? = null,
+        @SerializedName("referenceAccount") val referenceAccount: String? = 
null,
+        @SerializedName("ledger") val ledger: String? = null,
+        @SerializedName("state") val state: State? = null,
+        @SerializedName("alternativeAccountNumber") val 
alternativeAccountNumber: String? = null,
+        @SerializedName("createdOn") val createdOn: String? = null,
+        @SerializedName("createdBy") val createdBy: String? = null,
+        @SerializedName("lastModifiedOn") val lastModifiedOn: String? = null,
+        @SerializedName("lastModifiedBy") val lastModifiedBy: String? = null
+
+) : Parcelable {
+
+    enum class State {
+
+        @SerializedName("OPEN")
+        OPEN,
+
+        @SerializedName("LOCKED")
+        LOCKED,
+
+        @SerializedName("CLOSED")
+        CLOSED
+    }
+}
+
diff --git 
a/app/src/main/java/org/apache/fineract/data/models/accounts/AccountPage.kt 
b/app/src/main/java/org/apache/fineract/data/models/accounts/AccountPage.kt
new file mode 100644
index 0000000..b13dcb1
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/data/models/accounts/AccountPage.kt
@@ -0,0 +1,9 @@
+package org.apache.fineract.data.models.accounts
+
+import com.google.gson.annotations.SerializedName
+
+data class AccountPage(
+        @SerializedName("accounts") val accounts: List<Account>? = null,
+        @SerializedName("totalPages") val totalPages: Int? = null,
+        @SerializedName("totalElements") val totalElements: Long? = null
+)
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/data/services/AccountingService.kt 
b/app/src/main/java/org/apache/fineract/data/services/AccountingService.kt
index fa94fff..491e11e 100644
--- a/app/src/main/java/org/apache/fineract/data/services/AccountingService.kt
+++ b/app/src/main/java/org/apache/fineract/data/services/AccountingService.kt
@@ -1,6 +1,8 @@
 package org.apache.fineract.data.services
 
 import io.reactivex.Observable
+import org.apache.fineract.data.models.accounts.Account
+import org.apache.fineract.data.models.accounts.AccountPage
 import org.apache.fineract.data.models.accounts.Ledger
 import org.apache.fineract.data.models.accounts.LedgerPage
 import org.apache.fineract.data.remote.EndPoints
@@ -16,4 +18,10 @@ interface AccountingService {
     @GET(EndPoints.API_ACCOUNTING_PATH + "/ledgers/{identifier}")
     fun findLedger(@Path("identifier") identifier: String): Observable<Ledger>
 
+    @GET(EndPoints.API_ACCOUNTING_PATH + "/accounts")
+    fun fetchAccounts() : Observable<AccountPage>
+
+    @GET(EndPoints.API_ACCOUNTING_PATH + "/accounts/{identifier}")
+    fun findAccount(@Path("identifier") identifier: String): 
Observable<Account>
+
 }
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
 
b/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
index 144a10a..09e014e 100644
--- 
a/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
+++ 
b/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
@@ -43,6 +43,7 @@ import 
org.apache.fineract.ui.online.loanaccounts.loandetails.CustomerLoanDetail
 import 
org.apache.fineract.ui.online.loanaccounts.plannedpayment.PlannedPaymentFragment;
 import org.apache.fineract.ui.online.login.LoginActivity;
 import org.apache.fineract.ui.online.roles.roleslist.RolesFragment;
+import org.apache.fineract.ui.online.accounting.accounts.AccountsFragment;
 
 import dagger.Subcomponent;
 
@@ -112,4 +113,6 @@ public interface ActivityComponent {
     void inject(CustomerPayloadFragment customerPayloadFragment);
 
     void inject(LedgerFragment ledgerFragment);
+
+    void inject(AccountsFragment accountsFragment);
 }
diff --git 
a/app/src/main/java/org/apache/fineract/ui/adapters/AccountsAdapter.kt 
b/app/src/main/java/org/apache/fineract/ui/adapters/AccountsAdapter.kt
new file mode 100644
index 0000000..784603a
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/ui/adapters/AccountsAdapter.kt
@@ -0,0 +1,66 @@
+package org.apache.fineract.ui.adapters
+
+import android.content.Context
+import android.support.v7.widget.AppCompatImageView
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import kotlinx.android.synthetic.main.item_account.view.*
+import org.apache.fineract.R
+import org.apache.fineract.data.models.accounts.Account
+import org.apache.fineract.injection.ApplicationContext
+import org.apache.fineract.utils.DateUtils
+import org.apache.fineract.utils.StatusUtils
+import javax.inject.Inject
+
+class AccountsAdapter @Inject constructor(@ApplicationContext val context: 
Context)
+    : RecyclerView.Adapter<AccountsAdapter.ViewHolder>() {
+
+    var accounts: List<Account> = ArrayList()
+
+    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): 
ViewHolder {
+
+        val view = 
LayoutInflater.from(parent?.context).inflate(R.layout.item_account, parent, 
false)
+        return ViewHolder(view)
+    }
+
+    override fun getItemCount(): Int = accounts.size
+
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+
+        val account = accounts[position]
+
+        holder.tvIdentifier.text = account.identifier
+
+        val modifiedBy = context.getString(R.string.last_modified_by) + 
context.getString(
+                R.string.colon) + account.lastModifiedBy
+        holder.tvModifiedBy.text = modifiedBy
+
+        val lastModifiedOn = context.getString(R.string.last_modified_on) + 
context.getString(
+                R.string.colon) +
+                DateUtils.getDate(account.lastModifiedOn,
+                        DateUtils.INPUT_DATE_FORMAT, 
DateUtils.OUTPUT_DATE_FORMAT)
+
+        StatusUtils.setAccountType(account.type, 
holder.ivAccountTypeIndicator, context)
+
+        holder.tvModifiedOn.text = lastModifiedOn
+        holder.tvName.text = account.name
+    }
+
+    fun setAccountsList(accounts: List<Account>) {
+        this.accounts = accounts
+        notifyDataSetChanged()
+    }
+
+    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+
+        val tvIdentifier: TextView = itemView.tv_account_identifier
+        val tvModifiedBy: TextView = itemView.tv_modified_by
+        val tvModifiedOn: TextView = itemView.tv_modified_on
+        val tvName: TextView = itemView.tv_name
+        val ivAccountTypeIndicator: AppCompatImageView = 
itemView.iv_type_indicator
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java 
b/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java
index 2b782cb..fe07f9d 100644
--- a/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java
+++ b/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java
@@ -18,6 +18,7 @@ import org.apache.fineract.jobs.StartSyncJob;
 import org.apache.fineract.ui.base.FineractBaseActivity;
 import org.apache.fineract.ui.offline.CustomerPayloadFragment;
 import org.apache.fineract.ui.online.accounting.ledgers.LedgerFragment;
+import org.apache.fineract.ui.online.accounting.accounts.AccountsFragment;
 import org.apache.fineract.ui.online.customers.customerlist.CustomersFragment;
 import org.apache.fineract.ui.online.dashboard.DashboardFragment;
 import org.apache.fineract.ui.online.launcher.LauncherActivity;
@@ -117,7 +118,10 @@ public class DashboardActivity extends 
FineractBaseActivity implements
             case R.id.item_ledger:
                 replaceFragment(LedgerFragment.Companion.newInstance(), true, 
R.id.container);
                 break;
+            case R.id.item_accounts:
+                replaceFragment(AccountsFragment.Companion.newInstance(), 
true, R.id.container);
         }
+
         drawerLayout.closeDrawer(Gravity.START);
         setTitle(item.getTitle());
         return true;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/accounting/accounts/AccountContract.kt
 
b/app/src/main/java/org/apache/fineract/ui/online/accounting/accounts/AccountContract.kt
new file mode 100644
index 0000000..3fab8a6
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/accounting/accounts/AccountContract.kt
@@ -0,0 +1,33 @@
+package org.apache.fineract.ui.online.accounting.accounts
+
+import org.apache.fineract.data.models.accounts.Account
+import org.apache.fineract.ui.base.MvpView
+
+interface AccountContract {
+
+    interface View : MvpView {
+
+        fun showUserInterface()
+
+        fun showAccounts(accounts: List<Account>)
+
+        fun showEmptyAccounts()
+
+        fun showRecyclerView(status: Boolean)
+
+        fun showProgressbar()
+
+        fun hideProgressbar()
+
+        fun searchedAccount(account: Account)
+
+
+    }
+
+    interface Presenter {
+
+        fun getAccountsPage()
+
+        fun searchAccount(query: String)
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/accounting/accounts/AccountsFragment.kt
 
b/app/src/main/java/org/apache/fineract/ui/online/accounting/accounts/AccountsFragment.kt
new file mode 100644
index 0000000..a195fe3
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/accounting/accounts/AccountsFragment.kt
@@ -0,0 +1,166 @@
+package org.apache.fineract.ui.online.accounting.accounts
+
+import android.app.SearchManager
+import android.content.Context
+import android.os.Bundle
+import android.support.v4.widget.SwipeRefreshLayout
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.SearchView
+import android.text.TextUtils
+import android.view.*
+import kotlinx.android.synthetic.main.fragment_accounts.*
+import kotlinx.android.synthetic.main.layout_exception_handler.*
+import org.apache.fineract.R
+import org.apache.fineract.data.models.accounts.Account
+import org.apache.fineract.ui.adapters.AccountsAdapter
+import org.apache.fineract.ui.base.FineractBaseActivity
+import org.apache.fineract.ui.base.FineractBaseFragment
+import java.util.*
+import javax.inject.Inject
+
+
+class AccountsFragment : FineractBaseFragment(), AccountContract.View, 
SwipeRefreshLayout.OnRefreshListener {
+
+    @Inject
+    lateinit var accountsPresenter: AccountsPresenter
+
+    @Inject
+    lateinit var accountsAdapter: AccountsAdapter
+
+    lateinit var accountList : List<Account>
+
+    companion object {
+        fun newInstance() = AccountsFragment()
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setHasOptionsMenu(true)
+        accountList= ArrayList()
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                              savedInstanceState: Bundle?): View? {
+
+        val rootView = inflater.inflate(R.layout.fragment_accounts, container, 
false)
+        (activity as FineractBaseActivity).activityComponent.inject(this)
+        accountsPresenter.attachView(this)
+        initializeFineractUIErrorHandler(activity, rootView)
+
+        return rootView
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+        showUserInterface()
+
+        btn_try_again.setOnClickListener {
+            layoutError.visibility = View.GONE
+            accountsPresenter.getAccountsPage()
+        }
+
+        accountsPresenter.getAccountsPage()
+    }
+
+    override fun showUserInterface() {
+        setToolbarTitle(getString(R.string.accounts))
+        val layoutManager = LinearLayoutManager(activity)
+        layoutManager.orientation = LinearLayoutManager.VERTICAL
+        rvAccount.layoutManager = layoutManager
+        rvAccount.setHasFixedSize(true)
+
+        rvAccount.adapter = accountsAdapter
+
+        swipeContainer.setColorSchemeColors(*activity!!
+                .resources.getIntArray(R.array.swipeRefreshColors))
+        swipeContainer.setOnRefreshListener(this)
+    }
+
+
+    override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
+        super.onCreateOptionsMenu(menu, inflater)
+        inflater?.inflate(R.menu.menu_account_search, menu)
+        setUpSearchInterface(menu)
+    }
+
+    private fun setUpSearchInterface(menu: Menu?) {
+
+        val searchManager = activity?.getSystemService(Context.SEARCH_SERVICE) 
as? SearchManager
+        val searchView = menu?.findItem(R.id.account_search)?.actionView as? 
SearchView
+
+        
searchView?.setSearchableInfo(searchManager?.getSearchableInfo(activity?.componentName))
+
+        searchView?.setOnQueryTextListener(object : 
SearchView.OnQueryTextListener {
+            override fun onQueryTextSubmit(query: String): Boolean {
+                accountsPresenter.searchAccount(query)
+                return false
+            }
+
+            override fun onQueryTextChange(newText: String): Boolean {
+                if (TextUtils.isEmpty(newText)) {
+                    showRecyclerView(true)
+                    accountsAdapter.setAccountsList(accountList)
+                }
+
+                return false
+            }
+        })
+
+    }
+
+    override fun searchedAccount(account: Account) {
+        showRecyclerView(true)
+        accountsAdapter.setAccountsList(Collections.singletonList(account))
+    }
+
+    override fun onRefresh() {
+        accountsPresenter.getAccountsPage()
+    }
+
+
+    override fun showAccounts(accounts: List<Account>) {
+        showRecyclerView(true)
+        accountList = accounts
+        accountsAdapter.setAccountsList(accountList)
+    }
+
+    override fun showEmptyAccounts() {
+        showRecyclerView(false)
+        showFineractEmptyUI(getString(R.string.accounts), 
getString(R.string.accounts),
+                R.drawable.ic_person_outline_black_24dp)
+    }
+
+    override fun showRecyclerView(status: Boolean) {
+        if (status) {
+            rvAccount.visibility = View.VISIBLE
+            layoutError.visibility = View.GONE
+        } else {
+            rvAccount.visibility = View.GONE
+            layoutError.visibility = View.VISIBLE
+        }
+    }
+
+    override fun showProgressbar() {
+        swipeContainer.isRefreshing = true
+    }
+
+    override fun hideProgressbar() {
+        swipeContainer.isRefreshing = false
+    }
+
+    override fun showNoInternetConnection() {
+        showRecyclerView(false)
+        showFineractNoInternetUI()
+    }
+
+    override fun showError(message: String) {
+        showRecyclerView(false)
+        showFineractErrorUI(getString(R.string.accounts))
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        accountsPresenter.detachView()
+    }
+
+}
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/accounting/accounts/AccountsPresenter.kt
 
b/app/src/main/java/org/apache/fineract/ui/online/accounting/accounts/AccountsPresenter.kt
new file mode 100644
index 0000000..870335d
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/accounting/accounts/AccountsPresenter.kt
@@ -0,0 +1,82 @@
+package org.apache.fineract.ui.online.accounting.accounts
+
+import android.content.Context
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.CompositeDisposable
+import io.reactivex.observers.DisposableObserver
+import io.reactivex.schedulers.Schedulers
+import org.apache.fineract.R
+import org.apache.fineract.data.datamanager.DataManagerAccounting
+import org.apache.fineract.data.models.accounts.Account
+import org.apache.fineract.data.models.accounts.AccountPage
+import org.apache.fineract.injection.ApplicationContext
+import org.apache.fineract.ui.base.BasePresenter
+import javax.inject.Inject
+
+class AccountsPresenter @Inject constructor(@ApplicationContext context: 
Context,
+                                            val dataManagerAccounting: 
DataManagerAccounting)
+    : BasePresenter<AccountContract.View>(context), AccountContract.Presenter {
+
+    val compositeDisposable: CompositeDisposable = CompositeDisposable()
+
+    override fun getAccountsPage() {
+        checkViewAttached()
+        mvpView.showProgressbar()
+
+        compositeDisposable.add(dataManagerAccounting.getAccounts()
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribeWith(object : DisposableObserver<AccountPage>() {
+                    override fun onComplete() {
+
+                    }
+
+                    override fun onNext(accountPage: AccountPage) {
+
+                        mvpView.hideProgressbar()
+
+                        if (accountPage.accounts != null) {
+                            if (accountPage.accounts.isEmpty()) {
+                                mvpView.showEmptyAccounts()
+                            } else {
+                                mvpView.showAccounts(accountPage.accounts)
+                            }
+                        }
+                    }
+
+                    override fun onError(e: Throwable) {
+                        mvpView.hideProgressbar()
+                        showExceptionError(e, 
context.getString(R.string.error_fetching_accounts))
+                    }
+                }))
+    }
+
+    override fun searchAccount(query: String) {
+        checkViewAttached()
+        mvpView.showProgressbar()
+
+        compositeDisposable.add(dataManagerAccounting
+                .findAccount(query)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribeWith(object : DisposableObserver<Account>() {
+                    override fun onComplete() {
+
+                    }
+
+                    override fun onNext(account: Account) {
+                        mvpView.hideProgressbar()
+                        mvpView.searchedAccount(account)
+
+                    }
+
+                    override fun onError(e: Throwable) {
+
+                        mvpView.hideProgressbar()
+                        showExceptionError(e, 
context.getString(R.string.error_fetching_accounts))
+                    }
+                }))
+    }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_accounts.xml 
b/app/src/main/res/layout/fragment_accounts.xml
new file mode 100644
index 0000000..164d6a0
--- /dev/null
+++ b/app/src/main/res/layout/fragment_accounts.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_height="match_parent"
+    android:layout_width="match_parent">
+
+    <android.support.v4.widget.SwipeRefreshLayout
+        android:id="@+id/swipeContainer"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent">
+
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/rvAccount"
+            android:layout_centerHorizontal="true"
+            android:layout_height="0dp"
+            android:layout_marginBottom="@dimen/layout_padding_30dp"
+            android:layout_weight="1"
+            android:layout_width="wrap_content"/>
+    </android.support.v4.widget.SwipeRefreshLayout>
+
+    <include
+        layout="@layout/layout_exception_handler"
+        android:id="@+id/layoutError"
+        android:visibility="gone"/>
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_account.xml 
b/app/src/main/res/layout/item_account.xml
new file mode 100644
index 0000000..572c4ae
--- /dev/null
+++ b/app/src/main/res/layout/item_account.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:app="http://schemas.android.com/apk/res-auto";
+    xmlns:tools="http://schemas.android.com/tools";
+    android:id="@+id/ll_loan_accounts"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:clickable="true"
+    android:foreground="?android:attr/selectableItemBackground"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/ll_account"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <android.support.v7.widget.AppCompatImageView
+            android:id="@+id/iv_type_indicator"
+            android:layout_width="@dimen/side_bar_width"
+            android:layout_height="match_parent"
+            android:layout_marginBottom="@dimen/default_margin"
+            android:layout_marginTop="@dimen/default_margin"
+            app:srcCompat="@drawable/round_corner" />
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:orientation="vertical"
+            android:padding="@dimen/layout_padding_24dp">
+
+            <TextView
+                android:id="@+id/tv_account_identifier"
+                style="@style/Base.TextAppearance.AppCompat.Medium"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:textColor="@color/black"
+                tools:text="Account Identifier" />
+
+            <TextView
+                android:id="@+id/tv_modified_by"
+                style="@style/Base.TextAppearance.AppCompat.Small"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:ellipsize="end"
+                android:lines="1"
+                tools:text="Last modified by: rajan" />
+
+            <TextView
+                android:id="@+id/tv_modified_on"
+                style="@style/Base.TextAppearance.AppCompat.Small"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                tools:text="Last modified on: 10 July 2018" />
+
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/tv_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginEnd="@dimen/layout_padding_24dp"
+            android:layout_marginRight="@dimen/layout_padding_24dp"
+            android:textSize="@dimen/text_medium"
+            tools:text="Total Value" />
+
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.2dp"
+        android:background="#E7DFDF" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_account_search.xml 
b/app/src/main/res/menu/menu_account_search.xml
new file mode 100644
index 0000000..2970d73
--- /dev/null
+++ b/app/src/main/res/menu/menu_account_search.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:app="http://schemas.android.com/apk/res-auto";
+      xmlns:android="http://schemas.android.com/apk/res/android";>
+
+    <item
+        android:id="@+id/account_search"
+        android:icon="@drawable/ic_search_black_24dp"
+        android:title="@string/ledger_search"
+        app:showAsAction="always"
+        app:actionViewClass="android.support.v7.widget.SearchView"/>
+
+</menu>
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_navigation_drawer.xml 
b/app/src/main/res/menu/menu_navigation_drawer.xml
index 0d505c2..086432f 100644
--- a/app/src/main/res/menu/menu_navigation_drawer.xml
+++ b/app/src/main/res/menu/menu_navigation_drawer.xml
@@ -35,6 +35,11 @@
             android:id="@+id/item_ledger"
             android:title="@string/ledger"/>
 
+        <item
+            android:checked="true"
+            android:icon="@drawable/ic_customer_black_24dp"
+            android:id="@+id/item_accounts"
+            android:title="@string/accounts"/>
 
     </group>
 
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index e81ddf5..737d1ae 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -83,6 +83,7 @@
     <string name="description">Description</string>
     <string name="products">Products</string>
     <string name="ledger">Ledgers</string>
+    <string name="accounts">Accounts</string>
     <string name="day">Day</string>
     <string name="in">In</string>
     <string name="required">Required</string>
@@ -268,6 +269,7 @@
     <string name="error_fetching_customer_activities">Error fetching customer 
activities</string>
     <string name="error_fetching_roles">Error fetching roles</string>
     <string name="error_fetching_ledger">Error fetching ledger</string>
+    <string name="error_fetching_accounts">Error fetching accounts</string>
     <string name="error_sorry_not_able_to_load">Sorry we weren\'t able to 
load</string>
     <string name="error_fetching_customer_details">Failed to fetch customer 
details</string>
     <string name="error_fetching_deposit_product">Failed to fetch deposit 
product</string>
diff --git a/app/src/main/resources/accountsPage.json 
b/app/src/main/resources/accountsPage.json
new file mode 100644
index 0000000..09b69fb
--- /dev/null
+++ b/app/src/main/resources/accountsPage.json
@@ -0,0 +1,94 @@
+{
+  "accounts": [
+    {
+      "type": "ASSET",
+      "identifier": "identifier1",
+      "name": "name1",
+      "holders": [
+        "holders1",
+        "holders2"
+      ],
+      "signatureAuthorities": [
+        "signatureAuthorities1",
+        "signatureAuthorities2"
+      ],
+      "balance": 1200,
+      "referenceAccount": "referenceAccount",
+      "ledger": "ledger",
+      "state": "OPEN",
+      "alternativeAccountNumber": "alternativeAccountNumber",
+      "createdOn": "createdOn",
+      "createdBy": "createdBy",
+      "lastModifiedOn": "lastModifiedOn",
+      "lastModifiedBy": "lastModifiedBy"
+    },
+    {
+      "type": "LIABILITY",
+      "identifier": "identifier2",
+      "name": "name2",
+      "holders": [
+        "holders1",
+        "holders2"
+      ],
+      "signatureAuthorities": [
+        "signatureAuthorities1",
+        "signatureAuthorities2"
+      ],
+      "balance": 1500,
+      "referenceAccount": "referenceAccount",
+      "ledger": "ledger",
+      "state": "LOCKED",
+      "alternativeAccountNumber": "alternativeAccountNumber",
+      "createdOn": "createdOn",
+      "createdBy": "createdBy",
+      "lastModifiedOn": "lastModifiedOn",
+      "lastModifiedBy": "lastModifiedBy"
+    },
+    {
+      "type": "EQUITY",
+      "identifier": "identifier3",
+      "name": "name3",
+      "holders": [
+        "holders1",
+        "holders2"
+      ],
+      "signatureAuthorities": [
+        "signatureAuthorities1",
+        "signatureAuthorities2"
+      ],
+      "balance": 1500,
+      "referenceAccount": "referenceAccount",
+      "ledger": "ledger",
+      "state": "CLOSE",
+      "alternativeAccountNumber": "alternativeAccountNumber",
+      "createdOn": "createdOn",
+      "createdBy": "createdBy",
+      "lastModifiedOn": "lastModifiedOn",
+      "lastModifiedBy": "lastModifiedBy"
+    },
+    {
+      "type": "REVENUE",
+      "identifier": "identifier4",
+      "name": "name4",
+      "holders": [
+        "holders1",
+        "holders2"
+      ],
+      "signatureAuthorities": [
+        "signatureAuthorities1",
+        "signatureAuthorities2"
+      ],
+      "balance": 1500,
+      "referenceAccount": "referenceAccount",
+      "ledger": "ledger",
+      "state": "OPEN",
+      "alternativeAccountNumber": "alternativeAccountNumber",
+      "createdOn": "createdOn",
+      "createdBy": "createdBy",
+      "lastModifiedOn": "lastModifiedOn",
+      "lastModifiedBy": "lastModifiedBy"
+    }
+  ],
+  "totalPages": 1,
+  "totalElements": 4
+}
\ No newline at end of file

Reply via email to