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