]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java
reset rotation angle before animating rotation
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / activity / MainActivity.java
index ecd78167354df9b5bc046381476e27ba16186535..f446e1ab7ccd9ca17922265188b450a7973b9658 100644 (file)
@@ -27,6 +27,7 @@ import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewPropertyAnimator;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.widget.LinearLayout;
@@ -52,7 +53,9 @@ import net.ktnx.mobileledger.utils.MLDB;
 
 import java.lang.ref.WeakReference;
 import java.text.DateFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.Observable;
 import java.util.Observer;
 
@@ -70,6 +73,7 @@ import androidx.viewpager.widget.ViewPager;
 public class MainActivity extends ProfileThemedActivity {
     private static final String STATE_CURRENT_PAGE = "current_page";
     private static final String BUNDLE_SAVED_STATE = "bundle_savedState";
+    public AccountSummaryFragment mAccountSummaryFragment;
     DrawerLayout drawer;
     private LinearLayout profileListContainer;
     private View profileListHeadArrow, profileListHeadMore, profileListHeadCancel;
@@ -86,11 +90,12 @@ public class MainActivity extends ProfileThemedActivity {
     private boolean profileModificationEnabled = false;
     private boolean profileListExpanded = false;
     private ProfilesRecyclerViewAdapter mProfileListAdapter;
-
     @Override
     protected void onStart() {
         super.onStart();
 
+        setupProfile();
+
         updateLastUpdateTextFromDB();
         Date lastUpdate = Data.lastUpdateDate.get();
 
@@ -214,19 +219,11 @@ public class MainActivity extends ProfileThemedActivity {
 
         Data.lastUpdateDate.addObserver((o, arg) -> {
             Log.d("main", "lastUpdateDate changed");
-            runOnUiThread(() -> {
-                Date date = Data.lastUpdateDate.get();
-                if (date == null) {
-                    tvLastUpdate.setText(R.string.transaction_last_update_never);
-                }
-                else {
-                    final String text = DateFormat.getDateTimeInstance().format(date);
-                    tvLastUpdate.setText(text);
-                    Log.d("despair", String.format("Date formatted: %s", text));
-                }
-            });
+            runOnUiThread(this::updateLastUpdateDisplay);
         });
 
+        updateLastUpdateDisplay();
+
         findViewById(R.id.btn_no_profiles_add)
                 .setOnClickListener(v -> startEditProfileActivity(null));
 
@@ -280,6 +277,19 @@ public class MainActivity extends ProfileThemedActivity {
             }
         });
     }
+    private void updateLastUpdateDisplay() {
+        TextView v = findViewById(R.id.transactions_last_update);
+        Date date = Data.lastUpdateDate.get();
+        if (date == null) {
+            v.setText(R.string.transaction_last_update_never);
+            Log.d("main", "no last update date :(");
+        }
+        else {
+            final String text = DateFormat.getDateTimeInstance().format(date);
+            v.setText(text);
+            Log.d("main", String.format("Date formatted: %s", text));
+        }
+    }
     private void profileThemeChanged() {
         setupProfileColors();
 
@@ -291,11 +301,6 @@ public class MainActivity extends ProfileThemedActivity {
         intent.putExtra(BUNDLE_SAVED_STATE, bundle);
         startActivity(intent);
     }
-    @Override
-    protected void onResume() {
-        super.onResume();
-        setupProfile();
-    }
     public void startEditProfileActivity(MobileLedgerProfile profile) {
         Intent intent = new Intent(this, ProfileDetailActivity.class);
         Bundle args = new Bundle();
@@ -549,6 +554,70 @@ public class MainActivity extends ProfileThemedActivity {
         // FIXME disable rearranging
 
     }
+    public void onAccountSummaryRowViewClicked(View view) {
+        ViewGroup row = (ViewGroup) view.getParent();
+        if (view.getId() == R.id.account_expander_container) {
+            Log.d("accounts", "Account expander clicked");
+            LedgerAccount acc = (LedgerAccount) row.getTag();
+            if (!acc.hasSubAccounts()) return;
+
+            boolean wasExpanded = acc.isExpanded();
+
+            view.clearAnimation();
+            ViewPropertyAnimator animator = view.animate();
+
+            acc.toggleExpanded();
+            Data.profile.get().storeAccount(MLDB.getWritableDatabase(), acc);
+
+            if (wasExpanded) {
+                Log.d("accounts", String.format("Collapsing account '%s'", acc.getName()));
+                view.setRotation(0);
+                animator.rotationBy(180);
+
+                // removing all child accounts from the view
+                int start = -1, count = 0;
+                int i = 0;
+                final ArrayList<LedgerAccount> accountList = Data.accounts.get();
+                for (LedgerAccount a : accountList) {
+                    if (acc.isParentOf(a)) {
+                        if (start == -1) {
+                            start = i;
+                        }
+                        count++;
+                    }
+                    else {
+                        if (start != -1) {
+                            break;
+                        }
+                    }
+                    i++;
+                }
+
+                if (start != -1) {
+                    for (int j = 0; j < count; j++) {
+                        Log.d("accounts", String.format("Removing item %d: %s", start + j,
+                                accountList.get(start).getName()));
+                        accountList.remove(start);
+                    }
+
+                    mAccountSummaryFragment.modelAdapter.notifyItemRangeRemoved(start, count);
+                }
+            }
+            else {
+                Log.d("accounts", String.format("Expanding account '%s'", acc.getName()));
+                view.setRotation(180);
+                animator.rotationBy(-180);
+                ArrayList<LedgerAccount> accounts = Data.accounts.get();
+                List<LedgerAccount> children = Data.profile.get().loadVisibleChildAccountsOf(acc);
+                int parentPos = accounts.indexOf(acc);
+                if (parentPos == -1) throw new RuntimeException(
+                        "Can't find index of clicked account " + acc.getName());
+                accounts.addAll(parentPos + 1, children);
+                mAccountSummaryFragment.modelAdapter
+                        .notifyItemRangeInserted(parentPos + 1, children.size());
+            }
+        }
+    }
 
     public class SectionsPagerAdapter extends FragmentPagerAdapter {
 
@@ -561,7 +630,8 @@ public class MainActivity extends ProfileThemedActivity {
             Log.d("main", String.format("Switching to fragment %d", position));
             switch (position) {
                 case 0:
-                    return new AccountSummaryFragment();
+//                    Log.d("flow", "Creating account summary fragment");
+                    return mAccountSummaryFragment = new AccountSummaryFragment();
                 case 1:
                     return new TransactionListFragment();
                 default:
@@ -575,5 +645,4 @@ public class MainActivity extends ProfileThemedActivity {
             return 2;
         }
     }
-
 }