Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 115495cd authored by Marcus Hagerott's avatar Marcus Hagerott Committed by Android (Google) Code Review
Browse files

Merge "Store selected state for all accounts in SIM import" into ub-contactsdialer-h-dev

parents 19a90b19 48a2936c
Loading
Loading
Loading
Loading
+55 −32
Original line number Diff line number Diff line
@@ -49,9 +49,11 @@ import com.android.contacts.common.model.SimContact;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.preference.ContactsPreferences;
import com.android.contacts.editor.AccountHeaderPresenter;
import com.google.common.primitives.Longs;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
@@ -64,7 +66,7 @@ public class SimImportFragment extends DialogFragment
        implements LoaderManager.LoaderCallbacks<SimImportFragment.LoaderResult>,
        MultiSelectEntryContactListAdapter.SelectedContactsListener, AbsListView.OnScrollListener {

    private static final String KEY_SELECTED_IDS = "selectedIds";
    private static final String KEY_SUFFIX_SELECTED_IDS = "_selectedIds";
    private static final String ARG_SUBSCRIPTION_ID = "subscriptionId";

    private ContactsPreferences mPreferences;
@@ -78,8 +80,6 @@ public class SimImportFragment extends DialogFragment
    private ListView mListView;
    private View mImportButton;

    private long[] mSelectedContacts;

    private int mSubscriptionId;

    @Override
@@ -100,9 +100,6 @@ public class SimImportFragment extends DialogFragment
        final Bundle args = getArguments();
        mSubscriptionId = args == null ? SimCard.NO_SUBSCRIPTION_ID :
                args.getInt(ARG_SUBSCRIPTION_ID, SimCard.NO_SUBSCRIPTION_ID);

        if (savedInstanceState == null) return;
        mSelectedContacts = savedInstanceState.getLongArray(KEY_SELECTED_IDS);
    }

    @Override
@@ -144,6 +141,7 @@ public class SimImportFragment extends DialogFragment
            }
        });
        mAdapter.setAccount(mAccountHeaderPresenter.getCurrentAccount());
        restoreAdapterSelectedStates(savedInstanceState);

        mListView = (ListView) view.findViewById(R.id.list);
        mListView.setOnScrollListener(this);
@@ -197,9 +195,7 @@ public class SimImportFragment extends DialogFragment
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mAccountHeaderPresenter.onSaveInstanceState(outState);
        if (mAdapter != null && mAdapter.mContacts != null) {
            outState.putLongArray(KEY_SELECTED_IDS, mAdapter.getSelectedContactIdsArray());
        }
        saveAdapterSelectedStates(outState);
    }

    @Override
@@ -216,17 +212,41 @@ public class SimImportFragment extends DialogFragment
            return;
        }
        mAdapter.setData(data);
        if (mSelectedContacts != null) {
            mAdapter.select(mSelectedContacts);
        } else {
            mAdapter.selectAll();
        }
    }

    @Override
    public void onLoaderReset(Loader<LoaderResult> loader) {
    }

    private void restoreAdapterSelectedStates(Bundle savedInstanceState) {
        if (savedInstanceState == null) {
            return;
        }

        final List<AccountWithDataSet> accounts = mAccountTypeManager.getAccounts(true);
        for (AccountWithDataSet account : accounts) {
            final long[] selections = savedInstanceState.getLongArray(
                    account.stringify() + KEY_SUFFIX_SELECTED_IDS);
            if (selections != null) {
                mAdapter.setSelectionsForAccount(account, selections);
            }
        }
    }

    private void saveAdapterSelectedStates(Bundle outState) {
        if (mAdapter == null) {
            return;
        }

        // Make sure the selections are up-to-date
        mAdapter.storeCurrentSelections();
        for (Map.Entry<AccountWithDataSet, TreeSet<Long>> entry :
                mAdapter.getSelectedIds().entrySet()) {
            final long[] ids = Longs.toArray(entry.getValue());
            outState.putLongArray(entry.getKey().stringify() + KEY_SUFFIX_SELECTED_IDS, ids);
        }
    }

    private void importCurrentSelections() {
        ContactSaveService.startService(getContext(), ContactSaveService
                .createImportFromSimIntent(getContext(), mSubscriptionId,
@@ -332,6 +352,7 @@ public class SimImportFragment extends DialogFragment
            mExistingMap = result.accountsMap;
            changeCursor(SimContact.convertToContactsCursor(mContacts,
                    ContactQuery.CONTACT_PROJECTION_PRIMARY));
            updateDisplayedSelections();
        }

        public void setAccount(AccountWithDataSet account) {
@@ -341,11 +362,25 @@ public class SimImportFragment extends DialogFragment
            }

            // Save the checked state for the current account.
            storeCurrentSelections();
            mSelectedAccount = account;
            updateDisplayedSelections();
        }

        public void storeCurrentSelections() {
            if (mSelectedAccount != null) {
                mPerAccountCheckedIds.put(mSelectedAccount, getSelectedContactIds());
            }
        }

            mSelectedAccount = account;
        public Map<AccountWithDataSet, TreeSet<Long>> getSelectedIds() {
            return mPerAccountCheckedIds;
        }

        private void updateDisplayedSelections() {
            if (mContacts == null) {
                return;
            }

            TreeSet<Long> checked = mPerAccountCheckedIds.get(mSelectedAccount);
            if (checked == null) {
@@ -370,24 +405,12 @@ public class SimImportFragment extends DialogFragment
            return selected;
        }

        public void selectAll() {
            if (mContacts == null) return;

            final TreeSet<Long> selected = new TreeSet<>();
            for (SimContact contact : mContacts) {
                if (!existsInCurrentAccount(contact)) {
                    selected.add(contact.getId());
                }
            }
            setSelectedContactIds(selected);
        }

        public void select(long[] contacts) {
            final TreeSet<Long> selected = new TreeSet<>();
            for (long contact : contacts) {
                selected.add(contact);
        public void setSelectionsForAccount(AccountWithDataSet account, long[] contacts) {
            final TreeSet<Long> selected = new TreeSet<>(Longs.asList(contacts));
            mPerAccountCheckedIds.put(account, selected);
            if (account.equals(mSelectedAccount)) {
                updateDisplayedSelections();
            }
            setSelectedContactIds(selected);
        }

        public boolean existsInCurrentAccount(int position) {