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