12aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton/* 22aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Copyright (C) 2009 The Android Open Source Project 32aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 42aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 52aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * you may not use this file except in compliance with the License. 62aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * You may obtain a copy of the License at 72aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 82aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 92aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 102aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Unless required by applicable law or agreed to in writing, software 112aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 122aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * See the License for the specific language governing permissions and 142aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * limitations under the License. 152aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 162aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 172aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonpackage com.android.loaderapp.model; 182aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 192aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport java.util.ArrayList; 202aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport java.util.Iterator; 212aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 222aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton/** 232aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Class used for collapsing data items into groups of similar items. The data items that should be 242aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * collapsible should implement the Collapsible interface. The class also contains a utility 252aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * function that takes an ArrayList of items and returns a list of the same items collapsed into 262aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * groups. 272aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 282aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonpublic final class Collapser { 292aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 302aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /* 312aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * This utility class cannot be instantiated. 322aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 332aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton private Collapser() {} 342aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 352aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /* 362aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Interface implemented by data types that can be collapsed into groups of similar data. This 372aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * can be used for example to collapse similar contact data items into a single item. 382aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 392aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public interface Collapsible<T> { 402aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean collapseWith(T t); 412aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean shouldCollapseWith(T t); 422aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 432aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 442aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 452aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Collapses a list of Collapsible items into a list of collapsed items. Items are collapsed 462aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * if {@link Collapsible#shouldCollapseWith(Object) return strue, and are collapsed 472aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * through the {@Link Collapsible#collapseWith(Object)} function implemented by the data item. 482aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 492aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * @param list ArrayList of Objects of type <T extends Collapsible<T>> to be collapsed. 502aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 512aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static <T extends Collapsible<T>> void collapseList(ArrayList<T> list) { 522aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 532aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton int listSize = list.size(); 542aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 552aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton for (int i = 0; i < listSize; i++) { 562aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton T iItem = list.get(i); 572aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (iItem != null) { 582aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton for (int j = i + 1; j < listSize; j++) { 592aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton T jItem = list.get(j); 602aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (jItem != null) { 612aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (iItem.shouldCollapseWith(jItem)) { 622aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton iItem.collapseWith(jItem); 632aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton list.set(j, null); 642aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 652aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 662aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 672aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 682aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 692aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 702aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // Remove the null items 712aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton Iterator<T> itr = list.iterator(); 722aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton while (itr.hasNext()) { 732aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (itr.next() == null) { 742aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton itr.remove(); 752aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 762aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 772aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 782aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 792aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton} 80