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
