AccountServerBaseFragment.java revision c890a4e4a2cbb489aea4847cf25368a723586530
11a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler/*
21a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Copyright (C) 2010 The Android Open Source Project
31a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler *
41a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Licensed under the Apache License, Version 2.0 (the "License");
51a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * you may not use this file except in compliance with the License.
61a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * You may obtain a copy of the License at
71a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler *
81a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler *      http://www.apache.org/licenses/LICENSE-2.0
91a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler *
101a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Unless required by applicable law or agreed to in writing, software
111a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * distributed under the License is distributed on an "AS IS" BASIS,
121a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * See the License for the specific language governing permissions and
141a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * limitations under the License.
151a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler */
161a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
171a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerpackage com.android.email.activity.setup;
181a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
191a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport com.android.email.R;
208d22e85e459df3d94968389852859dacaf2baafeAndy Stadlerimport com.android.email.Utility;
218d22e85e459df3d94968389852859dacaf2baafeAndy Stadlerimport com.android.email.provider.EmailContent;
228d22e85e459df3d94968389852859dacaf2baafeAndy Stadlerimport com.android.email.provider.EmailContent.Account;
232731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadlerimport com.android.email.provider.EmailContent.HostAuth;
241a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
251a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.app.Activity;
261a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.app.Fragment;
271a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.content.Context;
288d22e85e459df3d94968389852859dacaf2baafeAndy Stadlerimport android.os.AsyncTask;
291a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadlerimport android.os.Bundle;
30112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadlerimport android.view.View;
31112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadlerimport android.view.View.OnClickListener;
32112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadlerimport android.widget.Button;
331a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
34c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedyimport java.net.URI;
35c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedyimport java.net.URISyntaxException;
36c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
371a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler/**
381a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Common base class for server settings fragments, so they can be more easily manipulated by
391a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * AccountSettingsXL.  Provides the following common functionality:
401a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler *
411a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Activity-provided callbacks
421a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Activity callback during onAttach
431a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler * Present "Next" button and respond to its clicks
441a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler */
45fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadlerpublic abstract class AccountServerBaseFragment extends Fragment
46112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        implements AccountCheckSettingsFragment.Callbacks, OnClickListener {
47112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
48c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    public static Bundle sSetupModeArgs = null;
49c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    protected static URI sDefaultUri;
50c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
51112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    private final static String BUNDLE_KEY_SETTINGS = "AccountServerBaseFragment.settings";
521a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
531a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    protected Context mContext;
541a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    protected Callback mCallback = EmptyCallback.INSTANCE;
55112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    protected boolean mSettingsMode;
56c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    // The URI that represents this account's currently saved settings
57c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    protected URI mLoadedUri;
58c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
59112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    // This is null in the setup wizard screens, and non-null in AccountSettings mode
60112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    public Button mProceedButton;
618d22e85e459df3d94968389852859dacaf2baafeAndy Stadler    // This is used to debounce multiple clicks on the proceed button (which does async work)
628d22e85e459df3d94968389852859dacaf2baafeAndy Stadler    public boolean mProceedButtonPressed;
631a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
641a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
651a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Callback interface that owning activities must provide
661a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
671a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    public interface Callback {
681a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        /**
691a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler         * Called each time the user-entered input transitions between valid and invalid
701a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler         * @param enable true to enable proceed/next button, false to disable
711a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler         */
721a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        public void onEnableProceedButtons(boolean enable);
73fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler
741a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        /**
75fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler         * Called when user clicks "next".  Starts account checker.
761a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler         * @param checkMode values from {@link SetupData}
77fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler         * @param target the fragment that requested the check
781a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler         */
79fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        public void onProceedNext(int checkMode, AccountServerBaseFragment target);
80fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler
81fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        /**
822731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler         * Called when account checker completes.  Fragments are responsible for saving
83fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler         * own edited data;  This is primarily for the activity to do post-check navigation.
842731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler         * @param result check settings result code - success is CHECK_SETTINGS_OK
85fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler         * @param setupMode signals if we were editing or creating
86fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler         */
872731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler        public void onCheckSettingsComplete(int result, int setupMode);
881a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
891a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
901a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    private static class EmptyCallback implements Callback {
911a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        public static final Callback INSTANCE = new EmptyCallback();
921a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        @Override public void onEnableProceedButtons(boolean enable) { }
93fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler        @Override public void onProceedNext(int checkMode, AccountServerBaseFragment target) { }
942731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler        @Override public void onCheckSettingsComplete(int result, int setupMode) { }
951a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
961a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
971a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
98983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler     * Get the static arguments bundle that forces a server settings fragment into "settings" mode
99983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler     * (If not included, you'll be in "setup" mode which behaves slightly differently.)
1001a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
101983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler    public static synchronized Bundle getSettingsModeArgs() {
102983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler        if (sSetupModeArgs == null) {
103983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler            sSetupModeArgs = new Bundle();
104983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler            sSetupModeArgs.putBoolean(BUNDLE_KEY_SETTINGS, true);
105983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler        }
106983e1ad53b3ca3105655bf6d961713c61060a7f8Andy Stadler        return sSetupModeArgs;
1071a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
1081a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
109c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    public AccountServerBaseFragment() {
110c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        if (sDefaultUri == null) {
111c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            try {
112c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                sDefaultUri = new URI("");
113c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            } catch (URISyntaxException ignore) {
114c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy                // ignore; will never happen
115c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            }
116c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        }
117c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    }
118c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
1191a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
120112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     * At onCreate time, read the fragment arguments
1211a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
1221a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
1231a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    public void onCreate(Bundle savedInstanceState) {
1241a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        super.onCreate(savedInstanceState);
1251a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
126112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // Get arguments, which modally switch us into "settings" mode (different appearance)
127112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        mSettingsMode = false;
128112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        if (getArguments() != null) {
129112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler            mSettingsMode = getArguments().getBoolean(BUNDLE_KEY_SETTINGS);
130112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        }
1318d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
1328d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        mProceedButtonPressed = false;
1331a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
1341a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
135112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    /**
136112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     * Called from onCreateView, to do settings mode configuration
137112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     */
138112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    protected void onCreateViewSettingsMode(View view) {
139112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        if (mSettingsMode) {
140112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler            view.findViewById(R.id.cancel).setOnClickListener(this);
141112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler            mProceedButton = (Button) view.findViewById(R.id.done);
142112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler            mProceedButton.setOnClickListener(this);
143112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler            mProceedButton.setEnabled(false);
144e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler        }
1451a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
1461a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
1471a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
148112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     * Called when a fragment is first attached to its activity.
149112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     * {@link #onCreate(Bundle)} will be called after this.
1501a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
1511a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
152112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    public void onAttach(Activity activity) {
153112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        super.onAttach(activity);
154112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        mContext = activity;
155112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler
156112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // Notify the activity that we're here.
157112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        if (activity instanceof AccountSettingsXL) {
158112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler            ((AccountSettingsXL)activity).onAttach(this);
159e6c6587b04a589eeb04006f75759c09ea10811e0Andy Stadler        }
1601a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
1611a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
1621a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
163112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler     * Implements OnClickListener
1641a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
1651a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    @Override
166112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler    public void onClick(View v) {
167112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        switch (v.getId()) {
168112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler            case R.id.cancel:
169112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                getActivity().onBackPressed();
170112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                break;
171112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler            case R.id.done:
1728d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                // Simple debounce - just ignore while checks are underway
1738d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                if (mProceedButtonPressed) {
1748d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                    return;
1758d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                }
1768d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                mProceedButtonPressed = true;
1771a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler                onNext();
178112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler                break;
1791a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        }
1801a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
1811a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
1821a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
1831a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Activity provides callbacks here.
1841a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
1851a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    public void setCallback(Callback callback) {
1861a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
1871a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        mContext = getActivity();
1881a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
1891a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
1901a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
1911a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Enable/disable the "next" button
1921a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
1931a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    public void enableNextButton(boolean enable) {
194112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // If we are in settings "mode" we may be showing our own next button, and we'll
195112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // enable it directly, here
196112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        if (mProceedButton != null) {
197112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler            mProceedButton.setEnabled(enable);
1981a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        }
1991a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
200112ed496f817ebeab6b1ee1d5117259ef80342b2Andy Stadler        // TODO: This supports the phone UX activities and will be removed
2011a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler        mCallback.onEnableProceedButtons(enable);
2021a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    }
2031a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
2041a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
2058d22e85e459df3d94968389852859dacaf2baafeAndy Stadler     * Performs async operations as part of saving changes to the settings.
2068d22e85e459df3d94968389852859dacaf2baafeAndy Stadler     *      Check for duplicate account
2078d22e85e459df3d94968389852859dacaf2baafeAndy Stadler     *      Display dialog if necessary
2088d22e85e459df3d94968389852859dacaf2baafeAndy Stadler     *      Else, proceed via mCallback.onProceedNext
2098d22e85e459df3d94968389852859dacaf2baafeAndy Stadler     */
2108d22e85e459df3d94968389852859dacaf2baafeAndy Stadler    protected void startDuplicateTaskCheck(long accountId, String checkHost, String checkLogin,
2118d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            int checkSettingsMode) {
2128d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        new DuplicateCheckTask(accountId, checkHost, checkLogin, checkSettingsMode).execute();
2138d22e85e459df3d94968389852859dacaf2baafeAndy Stadler    }
2148d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
2158d22e85e459df3d94968389852859dacaf2baafeAndy Stadler    private class DuplicateCheckTask extends AsyncTask<Void, Void, Account> {
2168d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
2178d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        private final long mAccountId;
2188d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        private final String mCheckHost;
2198d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        private final String mCheckLogin;
2208d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        private final int mCheckSettingsMode;
2218d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
2228d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        public DuplicateCheckTask(long accountId, String checkHost, String checkLogin,
2238d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                int checkSettingsMode) {
2248d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            mAccountId = accountId;
2258d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            mCheckHost = checkHost;
2268d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            mCheckLogin = checkLogin;
2278d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            mCheckSettingsMode = checkSettingsMode;
2288d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        }
2298d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
2308d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        @Override
2318d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        protected Account doInBackground(Void... params) {
2328d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            EmailContent.Account account = Utility.findExistingAccount(mContext, mAccountId,
2338d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                    mCheckHost, mCheckLogin);
2348d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            return account;
2358d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        }
2368d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
2378d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        @Override
2388d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        protected void onPostExecute(Account duplicateAccount) {
2398d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            AccountServerBaseFragment fragment = AccountServerBaseFragment.this;
2408d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            if (duplicateAccount != null) {
2418d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                // Show duplicate account warning
2428d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                DuplicateAccountDialogFragment dialogFragment =
2438d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                    DuplicateAccountDialogFragment.newInstance(duplicateAccount.mDisplayName);
2448d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                dialogFragment.show(fragment.getFragmentManager(),
2458d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                        DuplicateAccountDialogFragment.TAG);
2468d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            } else {
2478d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                // Otherwise, proceed with the save/check
2488d22e85e459df3d94968389852859dacaf2baafeAndy Stadler                mCallback.onProceedNext(mCheckSettingsMode, fragment);
2498d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            }
2508d22e85e459df3d94968389852859dacaf2baafeAndy Stadler            mProceedButtonPressed = false;
2518d22e85e459df3d94968389852859dacaf2baafeAndy Stadler        }
2528d22e85e459df3d94968389852859dacaf2baafeAndy Stadler    }
2538d22e85e459df3d94968389852859dacaf2baafeAndy Stadler
2548d22e85e459df3d94968389852859dacaf2baafeAndy Stadler    /**
255fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler     * Implements AccountCheckSettingsFragment.Callbacks
256fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler     *
2576e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * Handle OK or error result from check settings.  Save settings (async), and then
2586e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * exit to previous fragment.
25955110ca1ad8ce48a5429f9f351d013691c10b806Andrew Stadler     */
260fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    @Override
2616e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler    public void onCheckSettingsComplete(final int settingsResult) {
2626e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        new AsyncTask<Void, Void, Void>() {
2636e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler            @Override
2646e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler            protected Void doInBackground(Void... params) {
2656e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                if (settingsResult == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
2666e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                    if (SetupData.getFlowMode() == SetupData.FLOW_MODE_EDIT) {
2676e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                        saveSettingsAfterEdit();
2686e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                    } else {
2696e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                        saveSettingsAfterSetup();
2706e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                    }
2716e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                }
2726e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                return null;
2732731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler            }
2746e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler
2756e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler            @Override
2766e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler            protected void onPostExecute(Void result) {
2776e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                // Signal to owning activity that a settings check completed
2786e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler                mCallback.onCheckSettingsComplete(settingsResult, SetupData.getFlowMode());
2796e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler            }
2806e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler        }.execute();
2812731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler    }
2822731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler
2832731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler    /**
2842731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler     * Implements AccountCheckSettingsFragment.Callbacks
2852731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler     * This is overridden only by AccountSetupExchange
2862731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler     */
2872731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler    @Override
2882731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler    public void onAutoDiscoverComplete(int result, HostAuth hostAuth) {
2892731aef45c6f2f9792ae698ebf7d65ca6338a02cAndrew Stadler        throw new IllegalStateException();
29055110ca1ad8ce48a5429f9f351d013691c10b806Andrew Stadler    }
29155110ca1ad8ce48a5429f9f351d013691c10b806Andrew Stadler
29255110ca1ad8ce48a5429f9f351d013691c10b806Andrew Stadler    /**
293c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy     * Returns whether or not any settings have changed.
294c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy     */
295c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    public boolean haveSettingsChanged() {
296c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        URI newUri = null;
297c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
298c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        try {
299c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            newUri = getUri();
300c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        } catch (URISyntaxException ignore) {
301c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy            // ignore
302c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        }
303c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
304c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy        return (mLoadedUri == null) || !mLoadedUri.equals(newUri);
305c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    }
306c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
307c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    /**
3081a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Save settings after "OK" result from checker.  Concrete classes must implement.
3096e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * This is called from a worker thread and is allowed to perform DB operations.
3101a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
3111a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    public abstract void saveSettingsAfterEdit();
3121a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler
3131a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    /**
314fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler     * Save settings after "OK" result from checker.  Concrete classes must implement.
3156e71978ec38add2edf3ac5f3dd1f9abeea9c1ab6Andy Stadler     * This is called from a worker thread and is allowed to perform DB operations.
316fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler     */
317fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    public abstract void saveSettingsAfterSetup();
318fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler
319fd14496c494a0d38c35c3788c9cc55f1984592e4Andrew Stadler    /**
3201a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     * Respond to a click of the "Next" button.  Concrete classes must implement.
3211a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler     */
3221a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler    public abstract void onNext();
323c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
324c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy    protected abstract URI getUri() throws URISyntaxException;
325c890a4e4a2cbb489aea4847cf25368a723586530Todd Kennedy
3261a5e1e159352f6e21bde878eebca3e3a1896045cAndrew Stadler}
327