1*5eae8ebbSCole Faust /* 2*5eae8ebbSCole Faust * Copyright (C) 2010 The Android Open Source Project 3*5eae8ebbSCole Faust * 4*5eae8ebbSCole Faust * Licensed under the Apache License, Version 2.0 (the "License"); 5*5eae8ebbSCole Faust * you may not use this file except in compliance with the License. 6*5eae8ebbSCole Faust * You may obtain a copy of the License at 7*5eae8ebbSCole Faust * 8*5eae8ebbSCole Faust * http://www.apache.org/licenses/LICENSE-2.0 9*5eae8ebbSCole Faust * 10*5eae8ebbSCole Faust * Unless required by applicable law or agreed to in writing, software 11*5eae8ebbSCole Faust * distributed under the License is distributed on an "AS IS" BASIS, 12*5eae8ebbSCole Faust * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*5eae8ebbSCole Faust * See the License for the specific language governing permissions and 14*5eae8ebbSCole Faust * limitations under the License. 15*5eae8ebbSCole Faust */ 16*5eae8ebbSCole Faust 17*5eae8ebbSCole Faust 18*5eae8ebbSCole Faust package com.replica.replicaisland; 19*5eae8ebbSCole Faust 20*5eae8ebbSCole Faust import java.util.Comparator; 21*5eae8ebbSCole Faust 22*5eae8ebbSCole Faust /** 23*5eae8ebbSCole Faust * A derivation of ObjectManager that sorts its children if they are of type PhasedObject. 24*5eae8ebbSCole Faust * Sorting is performed on add. 25*5eae8ebbSCole Faust */ 26*5eae8ebbSCole Faust public class PhasedObjectManager extends ObjectManager { 27*5eae8ebbSCole Faust private final static PhasedObjectComparator sPhasedObjectComparator 28*5eae8ebbSCole Faust = new PhasedObjectComparator(); 29*5eae8ebbSCole Faust private boolean mDirty; 30*5eae8ebbSCole Faust private PhasedObject mSearchDummy; // A dummy object allocated up-front for searching by phase. 31*5eae8ebbSCole Faust PhasedObjectManager()32*5eae8ebbSCole Faust public PhasedObjectManager() { 33*5eae8ebbSCole Faust super(); 34*5eae8ebbSCole Faust mDirty = false; 35*5eae8ebbSCole Faust getObjects().setComparator(sPhasedObjectComparator); 36*5eae8ebbSCole Faust getPendingObjects().setComparator(sPhasedObjectComparator); 37*5eae8ebbSCole Faust mSearchDummy = new PhasedObject(); 38*5eae8ebbSCole Faust } 39*5eae8ebbSCole Faust PhasedObjectManager(int arraySize)40*5eae8ebbSCole Faust public PhasedObjectManager(int arraySize) { 41*5eae8ebbSCole Faust super(arraySize); 42*5eae8ebbSCole Faust mDirty = false; 43*5eae8ebbSCole Faust getObjects().setComparator(sPhasedObjectComparator); 44*5eae8ebbSCole Faust getPendingObjects().setComparator(sPhasedObjectComparator); 45*5eae8ebbSCole Faust mSearchDummy = new PhasedObject(); 46*5eae8ebbSCole Faust } 47*5eae8ebbSCole Faust 48*5eae8ebbSCole Faust @Override commitUpdates()49*5eae8ebbSCole Faust public void commitUpdates() { 50*5eae8ebbSCole Faust super.commitUpdates(); 51*5eae8ebbSCole Faust if (mDirty) { 52*5eae8ebbSCole Faust getObjects().sort(true); 53*5eae8ebbSCole Faust mDirty = false; 54*5eae8ebbSCole Faust } 55*5eae8ebbSCole Faust } 56*5eae8ebbSCole Faust 57*5eae8ebbSCole Faust @Override add(BaseObject object)58*5eae8ebbSCole Faust public void add(BaseObject object) { 59*5eae8ebbSCole Faust 60*5eae8ebbSCole Faust if (object instanceof PhasedObject) { 61*5eae8ebbSCole Faust super.add(object); 62*5eae8ebbSCole Faust mDirty = true; 63*5eae8ebbSCole Faust } else { 64*5eae8ebbSCole Faust // The only reason to restrict PhasedObjectManager to PhasedObjects is so that 65*5eae8ebbSCole Faust // the PhasedObjectComparator can assume all of its contents are PhasedObjects and 66*5eae8ebbSCole Faust // avoid calling instanceof every time. 67*5eae8ebbSCole Faust assert false : "Can't add a non-PhasedObject to a PhasedObjectManager!"; 68*5eae8ebbSCole Faust } 69*5eae8ebbSCole Faust } 70*5eae8ebbSCole Faust find(int phase)71*5eae8ebbSCole Faust public BaseObject find(int phase) { 72*5eae8ebbSCole Faust mSearchDummy.setPhase(phase); 73*5eae8ebbSCole Faust int index = getObjects().find(mSearchDummy, false); 74*5eae8ebbSCole Faust BaseObject result = null; 75*5eae8ebbSCole Faust if (index != -1) { 76*5eae8ebbSCole Faust result = getObjects().get(index); 77*5eae8ebbSCole Faust } else { 78*5eae8ebbSCole Faust index = getPendingObjects().find(mSearchDummy, false); 79*5eae8ebbSCole Faust if (index != -1) { 80*5eae8ebbSCole Faust result = getPendingObjects().get(index); 81*5eae8ebbSCole Faust } 82*5eae8ebbSCole Faust } 83*5eae8ebbSCole Faust return result; 84*5eae8ebbSCole Faust } 85*5eae8ebbSCole Faust 86*5eae8ebbSCole Faust /** Comparator for phased objects. */ 87*5eae8ebbSCole Faust private static class PhasedObjectComparator implements Comparator<BaseObject> { compare(BaseObject object1, BaseObject object2)88*5eae8ebbSCole Faust public int compare(BaseObject object1, BaseObject object2) { 89*5eae8ebbSCole Faust int result = 0; 90*5eae8ebbSCole Faust if (object1 != null && object2 != null) { 91*5eae8ebbSCole Faust result = ((PhasedObject) object1).phase - ((PhasedObject) object2).phase; 92*5eae8ebbSCole Faust } else if (object1 == null && object2 != null) { 93*5eae8ebbSCole Faust result = 1; 94*5eae8ebbSCole Faust } else if (object2 == null && object1 != null) { 95*5eae8ebbSCole Faust result = -1; 96*5eae8ebbSCole Faust } 97*5eae8ebbSCole Faust return result; 98*5eae8ebbSCole Faust } 99*5eae8ebbSCole Faust } 100*5eae8ebbSCole Faust 101*5eae8ebbSCole Faust } 102