1/*
2 * Copyright (C) 2012 Google Inc.
3 * Licensed to The Android Open Source Project.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.mail.providers;
19
20import android.database.DataSetObserver;
21
22import com.android.mail.ui.AccountController;
23import com.android.mail.utils.LogTag;
24import com.android.mail.utils.LogUtils;
25
26/**
27 * A simple extension of {@link DataSetObserver} to provide the updated account in
28 * {@link #onChanged(Account)} when the account changes. Initializing the object registers with
29 * the observer with the {@link AccountController} provided. The object will then begin to
30 * receive {@link #onChanged(Account)} till {@link #unregisterAndDestroy()} is called.
31 * <p>
32 * To implement an {@link AccountObserver}, you need to implement the {@link #onChanged(Account)}
33 * method.
34 */
35public abstract class AccountObserver extends DataSetObserver {
36    /**
37     * The AccountController that the observer is registered with.
38     */
39    private AccountController mController;
40
41    private static final String LOG_TAG = LogTag.getLogTag();
42
43    /**
44     * The no-argument constructor leaves the object unusable till
45     * {@link #initialize(AccountController)} is called.
46     */
47    public AccountObserver () {
48    }
49
50    /**
51     * Initializes an {@link AccountObserver} object that receives a call to
52     * {@link #onChanged(Account)} when the controller changes the account.
53     *
54     * @param controller
55     */
56    public Account initialize(AccountController controller) {
57        if (controller == null) {
58            LogUtils.wtf(LOG_TAG, "AccountObserver initialized with null controller!");
59        }
60        mController = controller;
61        mController.registerAccountObserver(this);
62        return mController.getAccount();
63    }
64
65    @Override
66    public final void onChanged() {
67        if (mController == null) {
68            return;
69        }
70        onChanged(mController.getAccount());
71    }
72
73    /**
74     * Callback invoked when the account object is changed.  Since {@link Account} objects are
75     * immutable, updates can be received on changes to individual settings (sync on/off)
76     * in addition to changes of accounts: alice@example.com -> bob@example.com.
77     * The updated account is passed as the argument.
78     * @param newAccount
79     */
80    public abstract void onChanged(Account newAccount);
81
82    /**
83     * Return the most current account.
84     * @return
85     */
86    public final Account getAccount() {
87        if (mController == null) {
88            return null;
89        }
90        return mController.getAccount();
91    }
92
93    /**
94     * Unregisters for account changes and makes the object unusable.
95     */
96    public void unregisterAndDestroy() {
97        if (mController == null) {
98            return;
99        }
100        mController.unregisterAccountObserver(this);
101    }
102}