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