150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal/* 250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * Copyright (C) 2013 The Android Open Source Project 350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * 450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * Licensed under the Apache License, Version 2.0 (the "License"); 550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * you may not use this file except in compliance with the License. 650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * You may obtain a copy of the License at 750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * 850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * http://www.apache.org/licenses/LICENSE-2.0 950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * 1050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * Unless required by applicable law or agreed to in writing, software 1150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * distributed under the License is distributed on an "AS IS" BASIS, 1250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * See the License for the specific language governing permissions and 1450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * limitations under the License. 1550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal */ 1650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 1750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 1850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwalpackage com.android.mail.providers; 1950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 2050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwalimport com.android.mail.ui.FolderController; 2150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwalimport com.android.mail.utils.LogTag; 2250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwalimport com.android.mail.utils.LogUtils; 2350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 2450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwalimport android.database.DataSetObserver; 2550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 2650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal/** 2750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * A simple extension of {@link android.database.DataSetObserver} to provide the updated Folder in 2850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * {@link #onChanged(Folder)} when the Folder changes. Initializing the object registers with 2950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * the observer with the {@link com.android.mail.ui.FolderController} provided. The object will then begin to 3050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * receive {@link #onChanged(Folder)} till {@link #unregisterAndDestroy()} is called. 3150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * <p> 3250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * To implement an {@link FolderObserver}, you need to implement the {@link #onChanged(Folder)} 3350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * method. 3450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal */ 3550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwalpublic abstract class FolderObserver extends DataSetObserver { 3650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal /** 3750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * The FolderController that the observer is registered with. 3850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal */ 3950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal private FolderController mController; 4050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 4150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal private static final String LOG_TAG = LogTag.getLogTag(); 4250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 4350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal /** 4450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * The no-argument constructor leaves the object unusable till 4550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * {@link #initialize(FolderController)} is called. 4650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal */ 4750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal public FolderObserver () { 4850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal } 4950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 5050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal /** 5150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * Initializes an {@link FolderObserver} object that receives a call to 5250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * {@link #onChanged(Folder)} when the controller changes the Folder. 5350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * 5450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * @param controller 5550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal */ 5650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal public Folder initialize(FolderController controller) { 5750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal if (controller == null) { 5850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal LogUtils.wtf(LOG_TAG, "FolderObserver initialized with null controller!"); 5950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal } 6050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal mController = controller; 6150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal mController.registerFolderObserver(this); 6250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal return mController.getFolder(); 6350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal } 6450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 6550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal @Override 6650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal public final void onChanged() { 6750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal if (mController == null) { 6850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal return; 6950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal } 7050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal onChanged(mController.getFolder()); 7150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal } 7250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 7350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal /** 7450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * Callback invoked when the Folder object is changed. Since {@link Folder} objects are 7550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * immutable, updates can be received on changes to individual settings (sync on/off) 7650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * in addition to changes of Folders: alice@example.com -> bob@example.com. 7750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * The updated Folder is passed as the argument. 7850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * @param newFolder 7950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal */ 8050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal public abstract void onChanged(Folder newFolder); 8150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 8250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal /** 8350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * Return the current folder. 8450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * @return 8550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal */ 8650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal public final Folder getFolder() { 8750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal if (mController == null) { 8850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal return null; 8950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal } 9050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal return mController.getFolder(); 9150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal } 9250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal 9350ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal /** 9450ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal * Unregisters for Folder changes and makes the object unusable. 9550ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal */ 9650ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal public void unregisterAndDestroy() { 9750ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal if (mController == null) { 9850ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal return; 9950ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal } 10050ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal mController.unregisterFolderObserver(this); 10150ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal } 10250ff0e50f1a27144e55e4184f48e433439727e7bVikram Aggarwal} 103