1d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu/*
2d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * Copyright (C) 2015 The Android Open Source Project
3d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu *
4d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * Licensed under the Apache License, Version 2.0 (the "License");
5d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * you may not use this file except in compliance with the License.
6d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * You may obtain a copy of the License at
7d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu *
8d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu *      http://www.apache.org/licenses/LICENSE-2.0
9d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu *
10d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * Unless required by applicable law or agreed to in writing, software
11d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * distributed under the License is distributed on an "AS IS" BASIS,
12d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * See the License for the specific language governing permissions and
14d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * limitations under the License
15d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu */
16d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
17d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fupackage com.android.providers.contacts.aggregation.util;
18d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
19d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport java.util.ArrayList;
20d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport java.util.HashMap;
21d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport java.util.HashSet;
22d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport java.util.List;
23d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport java.util.Map;
24d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport java.util.Set;
25d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
26d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport static com.android.internal.util.Preconditions.checkNotNull;
27d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
28d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu/**
29d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * Matching candidates for a raw contact, used in the contact aggregator.
30d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu */
31d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fupublic class RawContactMatchingCandidates {
32aa18c233fdec3359c5231d4a5f61188446bf5d6fZheng Fu    private List<MatchScore> mBestMatches;
33d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private Set<Long> mRawContactIds = null;
34d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private Map<Long, Long> mRawContactToContact = null;
35d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private Map<Long, Long> mRawContactToAccount = null;
36d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
37aa18c233fdec3359c5231d4a5f61188446bf5d6fZheng Fu    public RawContactMatchingCandidates(List<MatchScore> mBestMatches) {
38d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        checkNotNull(mBestMatches);
39d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        this.mBestMatches = mBestMatches;
40d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
41d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
42d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public RawContactMatchingCandidates() {
43aa18c233fdec3359c5231d4a5f61188446bf5d6fZheng Fu        mBestMatches = new ArrayList<MatchScore>();
44d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
45d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
46d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public int getCount() {
47d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mBestMatches.size();
48d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
49d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
50aa18c233fdec3359c5231d4a5f61188446bf5d6fZheng Fu    public void add(MatchScore score) {
51d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        mBestMatches.add(score);
52d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactIds != null) {
53d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactIds.add(score.getRawContactId());
54d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
55d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToAccount != null) {
56d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactToAccount.put(score.getRawContactId(), score.getAccountId());
57d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
58d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToContact != null) {
59d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactToContact.put(score.getRawContactId(), score.getContactId());
60d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
61d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
62d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
63d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public Set<Long> getRawContactIdSet() {
64d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactIds == null) {
65d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            createRawContactIdSet();
66d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
67d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mRawContactIds;
68d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
69d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
70d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public Map<Long, Long> getRawContactToAccount() {
71d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToAccount == null) {
72d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            createRawContactToAccountMap();
73d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
74d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mRawContactToAccount;
75d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
76d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
77d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public Long getContactId(Long rawContactId) {
78d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToContact == null) {
79d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            createRawContactToContactMap();
80d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
81d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mRawContactToContact.get(rawContactId);
82d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
83d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
84d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public Long getAccountId(Long rawContactId) {
85d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToAccount == null) {
86d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            createRawContactToAccountMap();
87d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
88d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mRawContactToAccount.get(rawContactId);
89d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
90d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
91d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private void createRawContactToContactMap() {
92d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        mRawContactToContact = new HashMap<Long, Long>();
93d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        for (int i = 0; i < mBestMatches.size(); i++) {
94d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactToContact.put(mBestMatches.get(i).getRawContactId(),
95d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu                    mBestMatches.get(i).getContactId());
96d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
97d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
98d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
99d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private void createRawContactToAccountMap() {
100d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        mRawContactToAccount = new HashMap<Long, Long>();
101d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        for (int i = 0; i <  mBestMatches.size(); i++) {
102d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactToAccount.put(mBestMatches.get(i).getRawContactId(),
103d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu                    mBestMatches.get(i).getAccountId());
104d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
105d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
106d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
107d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private void createRawContactIdSet() {
108d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        mRawContactIds = new HashSet<Long>();
109d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        for (int i = 0; i < mBestMatches.size(); i++) {
110d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactIds.add(mBestMatches.get(i).getRawContactId());
111d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
112d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
113d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu}
114