1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.providers.contacts;
18
19import android.accounts.Account;
20import android.text.TextUtils;
21
22import com.google.common.base.Objects;
23
24/**
25 * Account information that includes the data set, if any.
26 */
27public class AccountWithDataSet {
28    public static final AccountWithDataSet LOCAL = new AccountWithDataSet(null, null, null);
29
30    private final String mAccountName;
31    private final String mAccountType;
32    private final String mDataSet;
33
34    public AccountWithDataSet(String accountName, String accountType, String dataSet) {
35        mAccountName = emptyToNull(accountName);
36        mAccountType = emptyToNull(accountType);
37        mDataSet = emptyToNull(dataSet);
38    }
39
40    private static final String emptyToNull(String text) {
41        return TextUtils.isEmpty(text) ? null : text;
42    }
43
44    public static AccountWithDataSet get(String accountName, String accountType, String dataSet) {
45        return new AccountWithDataSet(accountName, accountType, dataSet);
46    }
47
48    public static AccountWithDataSet get(Account account, String dataSet) {
49        return new AccountWithDataSet(account.name, account.type, null);
50    }
51
52    public String getAccountName() {
53        return mAccountName;
54    }
55
56    public String getAccountType() {
57        return mAccountType;
58    }
59
60    public String getDataSet() {
61        return mDataSet;
62    }
63
64    public boolean isLocalAccount() {
65        return (mAccountName == null) && (mAccountType == null);
66    }
67
68    @Override
69    public boolean equals(Object obj) {
70        if (obj instanceof AccountWithDataSet) {
71            AccountWithDataSet other = (AccountWithDataSet) obj;
72            return Objects.equal(mAccountName, other.getAccountName())
73                    && Objects.equal(mAccountType, other.getAccountType())
74                    && Objects.equal(mDataSet, other.getDataSet());
75        }
76        return false;
77    }
78
79    @Override
80    public int hashCode() {
81        int result = mAccountName != null ? mAccountName.hashCode() : 0;
82        result = 31 * result + (mAccountType != null ? mAccountType.hashCode() : 0);
83        result = 31 * result + (mDataSet != null ? mDataSet.hashCode() : 0);
84        return result;
85    }
86
87    @Override
88    public String toString() {
89        return "AccountWithDataSet {name=" + mAccountName + ", type=" + mAccountType + ", dataSet="
90                + mDataSet + "}";
91    }
92
93    /**
94     * @return {@code true} if the owning {@link Account} is in the passed array.
95     */
96    public boolean inSystemAccounts(Account[] systemAccounts) {
97        // Note we don't want to create a new Account object from this instance, as it may contain
98        // null account name/type, which Account wouldn't accept.  So we need to compare field by
99        // field.
100        for (Account systemAccount : systemAccounts) {
101            if (Objects.equal(systemAccount.name, getAccountName())
102                    && Objects.equal(systemAccount.type, getAccountType())) {
103                return true;
104            }
105        }
106        return false;
107    }
108}
109