158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal/*
258cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * Copyright (C) 2012 Google Inc.
358cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * Licensed to The Android Open Source Project.
458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal *
558cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * Licensed under the Apache License, Version 2.0 (the "License");
658cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * you may not use this file except in compliance with the License.
758cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * You may obtain a copy of the License at
858cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal *
958cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal *      http://www.apache.org/licenses/LICENSE-2.0
1058cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal *
1158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * Unless required by applicable law or agreed to in writing, software
1258cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * distributed under the License is distributed on an "AS IS" BASIS,
1358cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * See the License for the specific language governing permissions and
1558cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * limitations under the License.
1658cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal */
1758cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
1858cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwalpackage com.android.mail.providers;
1958cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
2058cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwalimport android.database.DataSetObserver;
2158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
2258cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwalimport com.android.mail.ui.RecentFolderController;
2358cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwalimport com.android.mail.ui.RecentFolderList;
2458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwalimport com.android.mail.utils.LogTag;
2558cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwalimport com.android.mail.utils.LogUtils;
2658cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
2758cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal/**
2858cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * A simple extension of {@link DataSetObserver} to provide the updated recent folders
2958cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * {@link #onChanged()} when they change. Initializing the object registers with
3058cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * the observer with the {@link RecentFolderObserver} provided. The object will then begin to
3158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * receive {@link #onChanged()} till {@link #unregisterAndDestroy()} is called.
3258cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * The {@link RecentFolderList} returned in {@link #initialize(RecentFolderController)} is updated
3358cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * directly, no new object is created when the recent folder list is updated.
3458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * <p>
3558cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * To implement an {@link RecentFolderObserver}, you need to implement the
3658cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal * {@link #onChanged()} method.
3758cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal */
3858cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwalpublic abstract class RecentFolderObserver extends DataSetObserver {
3958cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    /**
4058cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     * The RecentFolderController that the observer is registered with.
4158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     */
4258cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    private RecentFolderController mController;
4358cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
4458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    private static final String LOG_TAG = LogTag.getLogTag();
4558cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
4658cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    /**
4758cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     * The no-argument constructor leaves the object unusable till
4858cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     * {@link #initialize(RecentFolderController)} is called.
4958cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     */
5058cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    public RecentFolderObserver () {
5158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    }
5258cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
5358cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    /**
5458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     * Initializes an {@link RecentFolderObserver} object that receives a call to
5558cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     * {@link #onChanged()} when the controller changes the recent folder.
5658cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     *
5758cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     * @param controller
5858cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     */
5958cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    public RecentFolderList initialize(RecentFolderController controller) {
6058cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        if (controller == null) {
6158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal            LogUtils.wtf(LOG_TAG, "RecentFolderObserver initialized with null controller!");
6258cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        }
6358cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        mController = controller;
6458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        mController.registerRecentFolderObserver(this);
6558cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        return mController.getRecentFolders();
6658cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    }
6758cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
6858cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    @Override
6958cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    public abstract void onChanged();
7058cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
7158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    /**
7258cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     * Return the most current recent folder.
7358cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     * @return
7458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     */
7558cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    public final RecentFolderList getRecentFolders() {
7658cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        if (mController == null) {
7758cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal            return null;
7858cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        }
7958cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        return mController.getRecentFolders();
8058cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    }
8158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal
8258cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    /**
8358cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     * Unregisters for recent folder changes and makes the object unusable.
8458cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal     */
8558cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    public void unregisterAndDestroy() {
8658cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        if (mController == null) {
8758cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal            return;
8858cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        }
8958cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal        mController.unregisterRecentFolderObserver(this);
9058cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal    }
9158cad2eea744d41a11c0124e91308e38108d242eVikram Aggarwal}