1960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam/* 2960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * Copyright (C) 2015 The Android Open Source Project 3960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * 4960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * Licensed under the Apache License, Version 2.0 (the "License"); 5960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * you may not use this file except in compliance with the License. 6960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * You may obtain a copy of the License at 7960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * 8960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * http://www.apache.org/licenses/LICENSE-2.0 9960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * 10960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * Unless required by applicable law or agreed to in writing, software 11960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * distributed under the License is distributed on an "AS IS" BASIS, 12960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * See the License for the specific language governing permissions and 14960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * limitations under the License. 15960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam */ 16960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 17960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lampackage com.android.setupwizardlib.items; 18960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 19960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lamimport android.content.Context; 20960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lamimport android.content.res.TypedArray; 21960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lamimport android.util.AttributeSet; 22ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lamimport android.util.Log; 23960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 24960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lamimport com.android.setupwizardlib.R; 25960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 26960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lamimport java.util.ArrayList; 27960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 28960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam/** 29960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam * An abstract item hierarchy; provides default implementation for ID and observers. 30960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam */ 31960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lampublic abstract class AbstractItemHierarchy implements ItemHierarchy { 32960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 33ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam /* static section */ 34ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 35ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam private static final String TAG = "AbstractItemHierarchy"; 36ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 37ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam /* non-static section */ 38ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 39960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam private ArrayList<Observer> mObservers = new ArrayList<>(); 40960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam private int mId = 0; 41960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 42960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam public AbstractItemHierarchy() { 43960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam } 44960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 45960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam public AbstractItemHierarchy(Context context, AttributeSet attrs) { 46960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SuwAbstractItem); 47960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam mId = a.getResourceId(R.styleable.SuwAbstractItem_android_id, 0); 48960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam a.recycle(); 49960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam } 50960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 51960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam public void setId(int id) { 52960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam mId = id; 53960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam } 54960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 55960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam public int getId() { 56960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam return mId; 57960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam } 58960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 5905acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur public int getViewId() { 6005acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur return getId(); 6105acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur } 6205acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur 63960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam @Override 64960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam public void registerObserver(Observer observer) { 65960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam mObservers.add(observer); 66960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam } 67960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 68960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam @Override 69960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam public void unregisterObserver(Observer observer) { 70960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam mObservers.remove(observer); 71960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam } 72960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam 73ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam /** 74ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam * @see Observer#onChanged(ItemHierarchy) 75ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam */ 76960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam public void notifyChanged() { 77960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam for (Observer observer : mObservers) { 78960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam observer.onChanged(this); 79960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam } 80960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam } 81ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 82ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam /** 83ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam * @see Observer#onItemRangeChanged(ItemHierarchy, int, int) 84ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam */ 85ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam public void notifyItemRangeChanged(int position, int itemCount) { 86ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam if (position < 0) { 87ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam Log.w(TAG, "notifyItemRangeChanged: Invalid position=" + position); 88ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam return; 89ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 90ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam if (itemCount < 0) { 91ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam Log.w(TAG, "notifyItemRangeChanged: Invalid itemCount=" + itemCount); 92ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam return; 93ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 94ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 95ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam for (Observer observer : mObservers) { 96ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam observer.onItemRangeChanged(this, position, itemCount); 97ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 98ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 99ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 100ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam /** 101ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam * @see Observer#onItemRangeInserted(ItemHierarchy, int, int) 102ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam */ 103ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam public void notifyItemRangeInserted(int position, int itemCount) { 104ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam if (position < 0) { 105ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam Log.w(TAG, "notifyItemRangeInserted: Invalid position=" + position); 106ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam return; 107ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 108ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam if (itemCount < 0) { 109ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam Log.w(TAG, "notifyItemRangeInserted: Invalid itemCount=" + itemCount); 110ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam return; 111ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 112ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 113ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam for (Observer observer : mObservers) { 114ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam observer.onItemRangeInserted(this, position, itemCount); 115ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 116ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 117ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 118ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam /** 119ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam * @see Observer#onItemRangeMoved(ItemHierarchy, int, int, int) 120ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam */ 121ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam public void notifyItemRangeMoved(int fromPosition, int toPosition, int itemCount) { 122ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam if (fromPosition < 0) { 123ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam Log.w(TAG, "notifyItemRangeMoved: Invalid fromPosition=" + fromPosition); 124ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam return; 125ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 126ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam if (toPosition < 0) { 127ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam Log.w(TAG, "notifyItemRangeMoved: Invalid toPosition=" + toPosition); 128ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam return; 129ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 130ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam if (itemCount < 0) { 131ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam Log.w(TAG, "notifyItemRangeMoved: Invalid itemCount=" + itemCount); 132ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam return; 133ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 134ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 135ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam for (Observer observer : mObservers) { 136ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam observer.onItemRangeMoved(this, fromPosition, toPosition, itemCount); 137ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 138ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 139ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 140ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam /** 141ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam * @see Observer#onItemRangeRemoved(ItemHierarchy, int, int) 142ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam */ 143ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam public void notifyItemRangeRemoved(int position, int itemCount) { 144ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam if (position < 0) { 145ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam Log.w(TAG, "notifyItemRangeInserted: Invalid position=" + position); 146ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam return; 147ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 148ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam if (itemCount < 0) { 149ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam Log.w(TAG, "notifyItemRangeInserted: Invalid itemCount=" + itemCount); 150ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam return; 151ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 152ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam 153ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam for (Observer observer : mObservers) { 154ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam observer.onItemRangeRemoved(this, position, itemCount); 155ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 156ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam } 157960c0ea0b1d36904beef0f01715dd43a211e88caMaurice Lam} 158