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