+ markDrawerItemCurrent(R.id.nav_account_summary);
+
+ mViewPager.setAdapter(mSectionsPagerAdapter);
+
+ if (pageChangeListener == null) {
+ pageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
+ @Override
+ public void onPageSelected(int position) {
+ mCurrentPage = position;
+ switch (position) {
+ case 0:
+ markDrawerItemCurrent(R.id.nav_account_summary);
+ break;
+ case 1:
+ markDrawerItemCurrent(R.id.nav_latest_transactions);
+ break;
+ default:
+ Log.e("MainActivity",
+ String.format("Unexpected page index %d", position));
+ }
+
+ super.onPageSelected(position);
+ }
+ };
+ mViewPager.addOnPageChangeListener(pageChangeListener);
+ }
+
+ mCurrentPage = 0;
+ if (savedInstanceState != null) {
+ int currentPage = savedInstanceState.getInt(STATE_CURRENT_PAGE, -1);
+ if (currentPage != -1) {
+ mCurrentPage = currentPage;
+ }
+ Data.accountFilter.setValue(savedInstanceState.getString(STATE_ACC_FILTER, null));
+ }
+
+ Data.lastUpdateDate.observe(this, this::updateLastUpdateDisplay);
+
+ findViewById(R.id.btn_no_profiles_add)
+ .setOnClickListener(v -> startEditProfileActivity(null));
+
+ findViewById(R.id.btn_add_transaction).setOnClickListener(this::fabNewTransactionClicked);
+
+ findViewById(R.id.nav_new_profile_button)
+ .setOnClickListener(v -> startEditProfileActivity(null));
+
+ RecyclerView root = findViewById(R.id.nav_profile_list);
+ if (root == null)
+ throw new RuntimeException("Can't get hold on the transaction value view");
+
+ if (mProfileListAdapter == null) mProfileListAdapter = new ProfilesRecyclerViewAdapter();
+ root.setAdapter(mProfileListAdapter);
+
+ mProfileListAdapter.editingProfiles.observe(this, newValue -> {
+ if (newValue) {
+ profileListHeadMore.setVisibility(View.GONE);
+ profileListHeadCancel.setVisibility(View.VISIBLE);
+ profileListHeadAddProfile.setVisibility(View.VISIBLE);
+ if (drawer.isDrawerOpen(GravityCompat.START)) {
+ profileListHeadMore.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_out));
+ profileListHeadCancel.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_in));
+ profileListHeadAddProfile.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_in));
+ }
+ }
+ else {
+ profileListHeadCancel.setVisibility(View.GONE);
+ profileListHeadMore.setVisibility(View.VISIBLE);
+ profileListHeadAddProfile.setVisibility(View.GONE);
+ if (drawer.isDrawerOpen(GravityCompat.START)) {
+ profileListHeadCancel.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_out));
+ profileListHeadMore.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_in));
+ profileListHeadAddProfile.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_out));
+ }
+ }
+
+ mProfileListAdapter.notifyDataSetChanged();
+ });
+
+ LinearLayoutManager llm = new LinearLayoutManager(this);
+
+ llm.setOrientation(RecyclerView.VERTICAL);
+ root.setLayoutManager(llm);
+
+ profileListHeadMore.setOnClickListener((v) -> mProfileListAdapter.flipEditingProfiles());
+ profileListHeadCancel.setOnClickListener((v) -> mProfileListAdapter.flipEditingProfiles());
+ profileListHeadMoreAndCancel
+ .setOnClickListener((v) -> mProfileListAdapter.flipEditingProfiles());
+ if (drawerListener == null) {
+ drawerListener = new DrawerLayout.SimpleDrawerListener() {
+ @Override
+ public void onDrawerClosed(View drawerView) {
+ super.onDrawerClosed(drawerView);
+ mProfileListAdapter.setAnimationsEnabled(false);
+ mProfileListAdapter.editingProfiles.setValue(false);
+ }
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ super.onDrawerOpened(drawerView);
+ mProfileListAdapter.setAnimationsEnabled(true);
+ }
+ };
+ drawer.addDrawerListener(drawerListener);
+ }
+ setupProfile();
+ }
+ private void scheduleDataRetrievalIfStale(Date lastUpdate) {
+ long now = new Date().getTime();
+ if ((lastUpdate == null) || (now > (lastUpdate.getTime() + (24 * 3600 * 1000)))) {
+ if (lastUpdate == null) debug("db::", "WEB data never fetched. scheduling a fetch");
+ else debug("db", String.format(Locale.ENGLISH,
+ "WEB data last fetched at %1.3f and now is %1.3f. re-fetching",
+ lastUpdate.getTime() / 1000f, now / 1000f));
+
+ Data.scheduleTransactionListRetrieval(this);
+ }
+ }
+ private void createShortcuts(List<MobileLedgerProfile> list) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) return;
+
+ List<ShortcutInfo> shortcuts = new ArrayList<>();
+ int i = 0;
+ for (MobileLedgerProfile p : list) {
+ if (!p.isPostingPermitted()) continue;
+
+ ShortcutInfo si = new ShortcutInfo.Builder(this, "new_transaction_" + p.getUuid())
+ .setShortLabel(p.getName())
+ .setIcon(Icon.createWithResource(this, R.drawable.svg_thick_plus_white))
+ .setIntent(
+ new Intent(Intent.ACTION_VIEW, null, this, NewTransactionActivity.class)
+ .putExtra("profile_uuid", p.getUuid())).setRank(i).build();
+ shortcuts.add(si);
+ i++;
+ }
+ ShortcutManager sm = getSystemService(ShortcutManager.class);
+ sm.setDynamicShortcuts(shortcuts);
+ }
+ private void onProfileListChanged(List<MobileLedgerProfile> newList) {
+ if (newList == null) {
+ // profiles not yet loaded from DB
+ findViewById(R.id.loading_layout).setVisibility(View.VISIBLE);
+ findViewById(R.id.no_profiles_layout).setVisibility(View.GONE);
+ findViewById(R.id.pager_layout).setVisibility(View.GONE);
+ return;
+ }
+
+ if (newList.isEmpty()) {
+ findViewById(R.id.no_profiles_layout).setVisibility(View.VISIBLE);
+ findViewById(R.id.pager_layout).setVisibility(View.GONE);
+ findViewById(R.id.loading_layout).setVisibility(View.GONE);
+ return;
+ }
+
+ findViewById(R.id.pager_layout).setVisibility(View.VISIBLE);
+ findViewById(R.id.no_profiles_layout).setVisibility(View.GONE);
+ findViewById(R.id.loading_layout).setVisibility(View.GONE);
+
+ findViewById(R.id.nav_profile_list).setMinimumHeight(
+ (int) (getResources().getDimension(R.dimen.thumb_row_height) * newList.size()));
+
+ debug("profiles", "profile list changed");
+ mProfileListAdapter.notifyDataSetChanged();