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