SetupData.java revision a7bc0319a75184ad706bb35c049af107ac3688e6
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.email.activity.setup;
18
19import com.android.emailcommon.provider.EmailContent.Account;
20import com.android.emailcommon.service.PolicySet;
21
22import android.accounts.AccountAuthenticatorResponse;
23import android.os.Bundle;
24import android.os.Parcel;
25import android.os.Parcelable;
26
27public class SetupData implements Parcelable {
28    // The "extra" name for the Bundle saved with SetupData
29    public static final String EXTRA_SETUP_DATA = "com.android.email.setupdata";
30
31    // NORMAL is the standard entry from the Email app; EAS and POP_IMAP are used when entering via
32    // Settings -> Accounts
33    public static final int FLOW_MODE_NORMAL = 0;
34    public static final int FLOW_MODE_ACCOUNT_MANAGER_EAS = 1;
35    public static final int FLOW_MODE_ACCOUNT_MANAGER_POP_IMAP = 2;
36    public static final int FLOW_MODE_EDIT = 3;
37    public static final int FLOW_MODE_FORCE_CREATE = 4;
38    // The following two modes are used to "pop the stack" and return from the setup flow.  We
39    // either return to the caller (if we're in an account type flow) or go to the message list
40    public static final int FLOW_MODE_RETURN_TO_CALLER = 5;
41    public static final int FLOW_MODE_RETURN_TO_MESSAGE_LIST = 6;
42
43    // For debug logging
44    private static final String[] FLOW_MODES = {"normal", "eas", "pop/imap", "edit", "force",
45            "rtc", "rtl"};
46
47    // Mode bits for AccountSetupCheckSettings, indicating the type of check requested
48    public static final int CHECK_INCOMING = 1;
49    public static final int CHECK_OUTGOING = 2;
50    public static final int CHECK_AUTODISCOVER = 4;
51
52    // All access will be through getters/setters
53    private int mFlowMode = FLOW_MODE_NORMAL;
54    private Account mAccount;
55    private String mUsername;
56    private String mPassword;
57    private int mCheckSettingsMode = 0;
58    private boolean mAllowAutodiscover = true;
59    private PolicySet mPolicySet;
60    private boolean mAutoSetup = false;
61    private boolean mDefault = false;
62    private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
63
64    // We only have one instance of SetupData; if/when the process is destroyed, this data will be
65    // saved in the savedInstanceState Bundle
66    private static SetupData INSTANCE = null;
67
68    public static synchronized SetupData getInstance() {
69        if (INSTANCE == null) {
70            INSTANCE = new SetupData();
71        }
72        return INSTANCE;
73    }
74
75    // Don't allow instantiation outside of this class
76    private SetupData() {
77    }
78
79    static public int getFlowMode() {
80        return getInstance().mFlowMode;
81    }
82
83    static public void setFlowMode(int mFlowMode) {
84        getInstance().mFlowMode = mFlowMode;
85    }
86
87    static public Account getAccount() {
88        return getInstance().mAccount;
89    }
90
91    static public void setAccount(Account mAccount) {
92        getInstance().mAccount = mAccount;
93    }
94
95    static public String getUsername() {
96        return getInstance().mUsername;
97    }
98
99    static public void setUsername(String mUsername) {
100        getInstance().mUsername = mUsername;
101    }
102
103    static public String getPassword() {
104        return getInstance().mPassword;
105    }
106
107    static public void setPassword(String mPassword) {
108        getInstance().mPassword = mPassword;
109    }
110
111    static public void setCheckSettingsMode(int mCheckSettingsMode) {
112        getInstance().mCheckSettingsMode = mCheckSettingsMode;
113    }
114
115    static public boolean isCheckIncoming() {
116        return (getInstance().mCheckSettingsMode & CHECK_INCOMING) != 0;
117    }
118
119    static public boolean isCheckOutgoing() {
120        return (getInstance().mCheckSettingsMode & CHECK_OUTGOING) != 0;
121    }
122    static public boolean isCheckAutodiscover() {
123        return (getInstance().mCheckSettingsMode & CHECK_AUTODISCOVER) != 0;
124    }
125    static public boolean isAllowAutodiscover() {
126        return getInstance().mAllowAutodiscover;
127    }
128
129    static public void setAllowAutodiscover(boolean mAllowAutodiscover) {
130        getInstance().mAllowAutodiscover = mAllowAutodiscover;
131    }
132
133    static public PolicySet getPolicySet() {
134        return getInstance().mPolicySet;
135    }
136
137    static public void setPolicySet(PolicySet mPolicySet) {
138        getInstance().mPolicySet = mPolicySet;
139    }
140
141    static public boolean isAutoSetup() {
142        return getInstance().mAutoSetup;
143    }
144
145    static public void setAutoSetup(boolean mAutoSetup) {
146        getInstance().mAutoSetup = mAutoSetup;
147    }
148
149    static public boolean isDefault() {
150        return getInstance().mDefault;
151    }
152
153    static public void setDefault(boolean mDefault) {
154        getInstance().mDefault = mDefault;
155    }
156
157    static public AccountAuthenticatorResponse getAccountAuthenticatorResponse() {
158        return getInstance().mAccountAuthenticatorResponse;
159    }
160
161    static public void setAccountAuthenticatorResponse(AccountAuthenticatorResponse response) {
162        getInstance().mAccountAuthenticatorResponse = response;
163    }
164
165    public static void init(int flowMode) {
166        SetupData data = getInstance();
167        data.commonInit();
168        data.mFlowMode = flowMode;
169    }
170
171    public static void init(int flowMode, Account account) {
172        SetupData data = getInstance();
173        data.commonInit();
174        data.mFlowMode = flowMode;
175        data.mAccount = account;
176    }
177
178    void commonInit() {
179        mPolicySet = null;
180        mAutoSetup = false;
181        mAllowAutodiscover = true;
182        mCheckSettingsMode = 0;
183        mAccount = new Account();
184        mDefault = false;
185        mUsername = null;
186        mPassword = null;
187        mAccountAuthenticatorResponse = null;
188    }
189
190    // Parcelable methods
191    public int describeContents() {
192        return 0;
193    }
194
195    public static final Parcelable.Creator<SetupData> CREATOR =
196            new Parcelable.Creator<SetupData>() {
197        public SetupData createFromParcel(Parcel in) {
198            return new SetupData(in);
199        }
200
201        public SetupData[] newArray(int size) {
202            return new SetupData[size];
203        }
204    };
205
206    public void writeToParcel(Parcel dest, int flags) {
207        dest.writeInt(mFlowMode);
208        dest.writeParcelable(mAccount, 0);
209        dest.writeString(mUsername);
210        dest.writeString(mPassword);
211        dest.writeInt(mCheckSettingsMode);
212        dest.writeInt(mAllowAutodiscover ? 1 : 0);
213        dest.writeParcelable(mPolicySet, 0);
214        dest.writeInt(mAutoSetup ? 1 : 0);
215        dest.writeInt(mDefault ? 1 : 0);
216        dest.writeParcelable(mAccountAuthenticatorResponse, 0);
217    }
218
219    public SetupData(Parcel in) {
220        ClassLoader loader = getClass().getClassLoader();
221        mFlowMode = in.readInt();
222        mAccount = in.readParcelable(loader);
223        mUsername = in.readString();
224        mPassword = in.readString();
225        mCheckSettingsMode = in.readInt();
226        mAllowAutodiscover = in.readInt() == 1;
227        mPolicySet = in.readParcelable(loader);
228        mAutoSetup = in.readInt() == 1;
229        mDefault = in.readInt() == 1;
230        mAccountAuthenticatorResponse = in.readParcelable(loader);
231    }
232
233    // Save/restore our SetupData (used in AccountSetupActivity)
234    static public void save(Bundle bundle) {
235        bundle.putParcelable(EXTRA_SETUP_DATA, getInstance());
236    }
237
238    static public synchronized SetupData restore(Bundle bundle) {
239        if (bundle != null && bundle.containsKey(EXTRA_SETUP_DATA)) {
240            INSTANCE = bundle.getParcelable(EXTRA_SETUP_DATA);
241            return INSTANCE;
242        } else {
243            return getInstance();
244        }
245    }
246
247    public static String debugString() {
248        StringBuilder sb = new StringBuilder("SetupData");
249        SetupData data = getInstance();
250        sb.append(":flow=" + FLOW_MODES[data.mFlowMode]);
251        sb.append(":acct=" + (data.mAccount == null ? "none" : data.mAccount.mId));
252        if (data.mUsername != null) {
253            sb.append(":user=" + data.mUsername);
254        }
255        if (data.mPassword != null) {
256            sb.append(":pass=" + data.mPassword);
257        }
258        sb.append(":a/d=" + data.mAllowAutodiscover);
259        sb.append(":auto=" + data.mAutoSetup);
260        sb.append(":default=" + data.mDefault);
261        sb.append(":check=");
262        if (SetupData.isCheckIncoming()) sb.append("in+");
263        if (SetupData.isCheckOutgoing()) sb.append("out+");
264        if (SetupData.isCheckAutodiscover()) sb.append("a/d");
265        sb.append(":policy=" + (data.mPolicySet == null ? "none" : "exists"));
266        return sb.toString();
267    }
268}
269