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.List;
21d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport java.util.Map;
22d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport java.util.Set;
23d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
24d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fuimport static com.android.internal.util.Preconditions.checkNotNull;
25d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
26517d590dc73e5efcf7c94e2431faec2473924ca2Makoto Onukiimport android.util.ArrayMap;
27517d590dc73e5efcf7c94e2431faec2473924ca2Makoto Onukiimport android.util.ArraySet;
28517d590dc73e5efcf7c94e2431faec2473924ca2Makoto Onuki
29d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu/**
30d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu * Matching candidates for a raw contact, used in the contact aggregator.
31d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu */
32d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fupublic class RawContactMatchingCandidates {
33aa18c233fdec3359c5231d4a5f61188446bf5d6fZheng Fu    private List<MatchScore> mBestMatches;
34d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private Set<Long> mRawContactIds = null;
35d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private Map<Long, Long> mRawContactToContact = null;
36d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private Map<Long, Long> mRawContactToAccount = null;
37d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
38aa18c233fdec3359c5231d4a5f61188446bf5d6fZheng Fu    public RawContactMatchingCandidates(List<MatchScore> mBestMatches) {
39d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        checkNotNull(mBestMatches);
40d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        this.mBestMatches = mBestMatches;
41d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
42d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
43d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public RawContactMatchingCandidates() {
44aa18c233fdec3359c5231d4a5f61188446bf5d6fZheng Fu        mBestMatches = new ArrayList<MatchScore>();
45d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
46d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
47d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public int getCount() {
48d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mBestMatches.size();
49d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
50d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
51aa18c233fdec3359c5231d4a5f61188446bf5d6fZheng Fu    public void add(MatchScore score) {
52d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        mBestMatches.add(score);
53d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactIds != null) {
54d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactIds.add(score.getRawContactId());
55d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
56d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToAccount != null) {
57d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactToAccount.put(score.getRawContactId(), score.getAccountId());
58d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
59d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToContact != null) {
60d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactToContact.put(score.getRawContactId(), score.getContactId());
61d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
62d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
63d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
64d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public Set<Long> getRawContactIdSet() {
65d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactIds == null) {
66d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            createRawContactIdSet();
67d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
68d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mRawContactIds;
69d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
70d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
71d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public Map<Long, Long> getRawContactToAccount() {
72d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToAccount == null) {
73d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            createRawContactToAccountMap();
74d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
75d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mRawContactToAccount;
76d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
77d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
78d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public Long getContactId(Long rawContactId) {
79d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToContact == null) {
80d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            createRawContactToContactMap();
81d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
82d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mRawContactToContact.get(rawContactId);
83d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
84d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
85d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    public Long getAccountId(Long rawContactId) {
86d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        if (mRawContactToAccount == null) {
87d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            createRawContactToAccountMap();
88d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
89d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        return mRawContactToAccount.get(rawContactId);
90d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
91d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
92d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private void createRawContactToContactMap() {
93517d590dc73e5efcf7c94e2431faec2473924ca2Makoto Onuki        mRawContactToContact = new ArrayMap<>();
94d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        for (int i = 0; i < mBestMatches.size(); i++) {
95d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactToContact.put(mBestMatches.get(i).getRawContactId(),
96d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu                    mBestMatches.get(i).getContactId());
97d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
98d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
99d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
100d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private void createRawContactToAccountMap() {
101517d590dc73e5efcf7c94e2431faec2473924ca2Makoto Onuki        mRawContactToAccount = new ArrayMap<>();
102d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        for (int i = 0; i <  mBestMatches.size(); i++) {
103d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactToAccount.put(mBestMatches.get(i).getRawContactId(),
104d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu                    mBestMatches.get(i).getAccountId());
105d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
106d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
107d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu
108d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    private void createRawContactIdSet() {
109517d590dc73e5efcf7c94e2431faec2473924ca2Makoto Onuki        mRawContactIds = new ArraySet<>();
110d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        for (int i = 0; i < mBestMatches.size(); i++) {
111d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu            mRawContactIds.add(mBestMatches.get(i).getRawContactId());
112d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu        }
113d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu    }
114d6c0a1330d3e51706d70351a34631f1f4e8fb02fZheng Fu}
115