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