1 /* 2 * Copyright (C) 2009 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 17 package com.android.contacts; 18 19 import java.util.HashMap; 20 import java.util.Iterator; 21 import java.util.ArrayList; 22 23 /** 24 * Class used for collapsing data items into groups of similar items. The data items that should be 25 * collapsible should implement the Collapsible interface. The class also contains a utility 26 * function that takes an ArrayList of items and returns a list of the same items collapsed into 27 * groups. 28 */ 29 public final class Collapser { 30 31 /* 32 * This utility class cannot be instantiated. 33 */ Collapser()34 private Collapser() {} 35 36 /* 37 * Interface implemented by data types that can be collapsed into groups of similar data. This 38 * can be used for example to collapse similar contact data items into a single item. 39 */ 40 public interface Collapsible<T> { collapseWith(T t)41 public boolean collapseWith(T t); shouldCollapseWith(T t)42 public boolean shouldCollapseWith(T t); 43 } 44 45 /** 46 * Collapses a list of Collapsible items into a list of collapsed items. Items are collapsed 47 * if {@link Collapsible#shouldCollapseWith(Object) return strue, and are collapsed 48 * through the {@Link Collapsible#collapseWith(Object)} function implemented by the data item. 49 * 50 * @param list ArrayList of Objects of type <T extends Collapsible<T>> to be collapsed. 51 */ collapseList(ArrayList<T> list)52 public static <T extends Collapsible<T>> void collapseList(ArrayList<T> list) { 53 54 int listSize = list.size(); 55 56 for (int i = 0; i < listSize; i++) { 57 T iItem = list.get(i); 58 if (iItem != null) { 59 for (int j = i + 1; j < listSize; j++) { 60 T jItem = list.get(j); 61 if (jItem != null) { 62 if (iItem.shouldCollapseWith(jItem)) { 63 iItem.collapseWith(jItem); 64 list.set(j, null); 65 } 66 } 67 } 68 } 69 } 70 71 // Remove the null items 72 Iterator<T> itr = list.iterator(); 73 while (itr.hasNext()) { 74 if (itr.next() == null) { 75 itr.remove(); 76 } 77 } 78 79 } 80 } 81