104be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott/*
204be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * Copyright (C) 2016 The Android Open Source Project
304be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott *
404be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * Licensed under the Apache License, Version 2.0 (the "License");
504be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * you may not use this file except in compliance with the License.
604be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * You may obtain a copy of the License at
704be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott *
804be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott *      http://www.apache.org/licenses/LICENSE-2.0
904be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott *
1004be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * Unless required by applicable law or agreed to in writing, software
1104be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * distributed under the License is distributed on an "AS IS" BASIS,
1204be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1304be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * See the License for the specific language governing permissions and
1404be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * limitations under the License.
1504be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott */
1604be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerottpackage com.android.contacts.model.account;
1704be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott
1804be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerottimport com.google.common.base.Objects;
1904be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott
2004be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerottimport java.util.Comparator;
2104be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott
2204be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott/**
2304be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott * Orders accounts for display such that the default account is first
2404be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott */
2504be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerottpublic class AccountComparator implements Comparator<AccountWithDataSet> {
2604be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott    private AccountWithDataSet mDefaultAccount;
2704be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott
2804be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott    public AccountComparator(AccountWithDataSet defaultAccount) {
2904be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        mDefaultAccount = defaultAccount;
3004be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott    }
3104be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott
3204be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott    @Override
3304be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott    public int compare(AccountWithDataSet a, AccountWithDataSet b) {
3404be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        if (Objects.equal(a.name, b.name) && Objects.equal(a.type, b.type)
3504be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott                && Objects.equal(a.dataSet, b.dataSet)) {
3604be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            return 0;
3704be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        } else if (b.name == null || b.type == null) {
3804be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            return -1;
3904be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        } else if (a.name == null || a.type == null) {
4004be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            return 1;
4104be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        } else if (isWritableGoogleAccount(a) && a.equals(mDefaultAccount)) {
4204be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            return -1;
4304be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        } else if (isWritableGoogleAccount(b) && b.equals(mDefaultAccount)) {
4404be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            return 1;
4504be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        } else if (isWritableGoogleAccount(a) && !isWritableGoogleAccount(b)) {
4604be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            return -1;
4704be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        } else if (isWritableGoogleAccount(b) && !isWritableGoogleAccount(a)) {
4804be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            return 1;
4904be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        } else {
5004be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            int diff = a.name.compareToIgnoreCase(b.name);
5104be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            if (diff != 0) {
5204be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott                return diff;
5304be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            }
5404be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            diff = a.type.compareToIgnoreCase(b.type);
5504be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            if (diff != 0) {
5604be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott                return diff;
5704be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            }
5804be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott
5904be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            // Accounts without data sets get sorted before those that have them.
6004be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            if (a.dataSet != null) {
6104be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott                return b.dataSet == null ? 1 : a.dataSet.compareToIgnoreCase(b.dataSet);
6204be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            } else {
6304be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott                return -1;
6404be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott            }
6504be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        }
6604be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott    }
6704be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott
6804be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott    private static boolean isWritableGoogleAccount(AccountWithDataSet account) {
6904be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott        return GoogleAccountType.ACCOUNT_TYPE.equals(account.type) && account.dataSet == null;
7004be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott    }
7104be88c2bec8d0a0cc9e1f4f0af3b3a2ff8ac4e7Marcus Hagerott}
72