diff --git a/res/menu/account_settings_next_option.xml b/res/menu/account_settings_next_option.xml new file mode 100644 index 000000000..59e094beb --- /dev/null +++ b/res/menu/account_settings_next_option.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 0c6f3411a..7f120d708 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -587,6 +587,11 @@ Edit details + + + Discard unsaved changes? + General settings diff --git a/src/com/android/email/activity/setup/AccountServerBaseFragment.java b/src/com/android/email/activity/setup/AccountServerBaseFragment.java new file mode 100644 index 000000000..aaf1633dd --- /dev/null +++ b/src/com/android/email/activity/setup/AccountServerBaseFragment.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.email.activity.setup; + +import com.android.email.R; + +import android.app.Activity; +import android.app.Fragment; +import android.content.Context; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; + +/** + * Common base class for server settings fragments, so they can be more easily manipulated by + * AccountSettingsXL. Provides the following common functionality: + * + * Activity-provided callbacks + * Activity callback during onAttach + * Present "Next" button and respond to its clicks + */ +public abstract class AccountServerBaseFragment extends Fragment { + + protected Context mContext; + protected Callback mCallback = EmptyCallback.INSTANCE; + protected boolean mNextButtonEnabled; + + /** + * Callback interface that owning activities must provide + */ + public interface Callback { + /** + * Called each time the user-entered input transitions between valid and invalid + * @param enable true to enable proceed/next button, false to disable + */ + public void onEnableProceedButtons(boolean enable); + /** + * Called when user clicks "next" + * @param checkMode values from {@link SetupData} + */ + public void onProceedNext(int checkMode); + } + + private static class EmptyCallback implements Callback { + public static final Callback INSTANCE = new EmptyCallback(); + @Override public void onEnableProceedButtons(boolean enable) { } + @Override public void onProceedNext(int checkMode) { } + } + + /** + * Called when a fragment is first attached to its activity. + * {@link #onCreate(Bundle)} will be called after this. + */ + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + mContext = activity; + + // Notify the activity that we're here. + if (activity instanceof AccountSettingsXL) { + ((AccountSettingsXL)activity).onAttach(this); + } + } + + /** + * Called to do initial creation of a fragment. This is called after + * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}. + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setHasOptionsMenu(true); + mNextButtonEnabled = false; + } + + // Add a "Next" button when this fragment is displayed + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.account_settings_next_option, menu); + } + + /** + * Enable/disable "next" button + */ + @Override + public void onPrepareOptionsMenu(Menu menu) { + MenuItem item = menu.findItem(R.id.next); + item.setEnabled(mNextButtonEnabled); + } + + /** + * Respond to clicks in the "Next" button + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.next: + onNext(); + return true; + } + return super.onOptionsItemSelected(item); + } + + /** + * Activity provides callbacks here. + */ + public void setCallback(Callback callback) { + mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback; + mContext = getActivity(); + } + + /** + * Enable/disable the "next" button + */ + public void enableNextButton(boolean enable) { + // We have to set mNextButtonEnabled first, because invalidateOptionsMenu calls + // onPrepareOptionsMenu immediately + boolean wasEnabled = mNextButtonEnabled; + mNextButtonEnabled = enable; + + if (enable != wasEnabled) { + getActivity().invalidateOptionsMenu(); + } + + // TODO: This supports the legacy activities and will be removed + mCallback.onEnableProceedButtons(enable); + } + + /** + * Save settings after "OK" result from checker. Concrete classes must implement. + */ + public abstract void saveSettingsAfterEdit(); + + /** + * Respond to a click of the "Next" button. Concrete classes must implement. + */ + public abstract void onNext(); +} diff --git a/src/com/android/email/activity/setup/AccountSettingsFragment.java b/src/com/android/email/activity/setup/AccountSettingsFragment.java index 94008a54c..5db29f146 100644 --- a/src/com/android/email/activity/setup/AccountSettingsFragment.java +++ b/src/com/android/email/activity/setup/AccountSettingsFragment.java @@ -16,26 +16,20 @@ package com.android.email.activity.setup; -import com.android.email.Controller; import com.android.email.Email; import com.android.email.R; import com.android.email.Utility; -import com.android.email.activity.AccountFolderList; -import com.android.email.activity.setup.AccountSetupBasicsFragment.NoteDialogFragment; import com.android.email.mail.MessagingException; import com.android.email.mail.Sender; import com.android.email.mail.Store; -import com.android.email.provider.EmailContent; import com.android.email.provider.EmailContent.Account; import com.android.email.provider.EmailContent.HostAuth; -import com.android.email.service.MailService; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; -import android.app.NotificationManager; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; @@ -133,13 +127,6 @@ public class AccountSettingsFragment extends PreferenceFragment { @Override public void deleteAccount(Account account) { }; } - /** - * Callback interface that owning activities must implement - */ - public interface OnAttachListener { - public void onAttach(Fragment f); - } - /** * If launching with an arguments bundle, use this method to build the arguments. * @param accountId The account being modified @@ -159,9 +146,10 @@ public class AccountSettingsFragment extends PreferenceFragment { mContext = activity; - // Notify the activity that we're here. Single-pane preference activities ignore this; - // multi-pane settings uses this as a trigger to attach the account info - ((OnAttachListener)activity).onAttach(this); + // Notify the activity that we're here. + if (activity instanceof AccountSettingsXL) { + ((AccountSettingsXL)activity).onAttach(this); + } } /** diff --git a/src/com/android/email/activity/setup/AccountSettingsXL.java b/src/com/android/email/activity/setup/AccountSettingsXL.java index ab3c510b5..e8bffd0a8 100644 --- a/src/com/android/email/activity/setup/AccountSettingsXL.java +++ b/src/com/android/email/activity/setup/AccountSettingsXL.java @@ -28,8 +28,12 @@ import com.android.email.provider.EmailContent.AccountColumns; import com.android.email.service.MailService; import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; import android.app.Fragment; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.os.AsyncTask; @@ -54,8 +58,7 @@ import java.util.List; * sense to use a loader for the accounts list, because it would provide better support for * dealing with accounts being added/deleted and triggering the header reload. */ -public class AccountSettingsXL extends PreferenceActivity - implements AccountSettingsFragment.OnAttachListener, OnClickListener { +public class AccountSettingsXL extends PreferenceActivity implements OnClickListener { // Intent extras for our internal activity launch /* package */ static final String EXTRA_ACCOUNT_ID = "AccountSettingsXL.account_id"; @@ -91,14 +94,17 @@ public class AccountSettingsXL extends PreferenceActivity private long mDeletingAccountId = -1; private boolean mShowDebugMenu; private Button mAddAccountButton; + private List
mGeneratedHeaders; // Async Tasks private LoadAccountListTask mLoadAccountListTask; private GetAccountIdFromAccountTask mGetAccountIdFromAccountTask; // Specific callbacks used by settings fragments - private AccountSettingsFragmentCallback mAccountSettingsFragmentCallback + private final AccountSettingsFragmentCallback mAccountSettingsFragmentCallback = new AccountSettingsFragmentCallback(); + private final AccountServerSettingsFragmentCallback mAccountServerSettingsFragmentCallback + = new AccountServerSettingsFragmentCallback(); /** * Display (and edit) settings for a specific account, or -1 for any/all accounts @@ -150,6 +156,11 @@ public class AccountSettingsXL extends PreferenceActivity public void onResume() { super.onResume(); updateAccounts(); + + // When we're resuming, enable/disable the add account button + if (mAddAccountButton != null && hasHeaders()) { + mAddAccountButton.setEnabled(shouldShowNewAccount()); + } } @Override @@ -196,6 +207,23 @@ public class AccountSettingsXL extends PreferenceActivity return result; } + /** + * After verifying a new server configuration, we return here and continue. If editing + * succeeded, we do "back" to exit the settings screen. + * + * TODO: This goes away when we move checksettings into a fragment as well + */ + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == RESULT_OK) { + if (mCurrentFragment instanceof AccountServerBaseFragment) { + AccountServerBaseFragment f = (AccountServerBaseFragment) mCurrentFragment; + f.saveSettingsAfterEdit(); + } + onBackPressed(); + } + } + private void enableDebugMenu() { mShowDebugMenu = true; invalidateHeaders(); @@ -258,6 +286,7 @@ public class AccountSettingsXL extends PreferenceActivity target.add(header); if (header.accountId == mRequestedAccountId) { mRequestedAccountHeader = header; + mRequestedAccountId = -1; } } } @@ -275,6 +304,9 @@ public class AccountSettingsXL extends PreferenceActivity debugHeader.fragmentArguments = null; target.add(debugHeader); } + + // Save for later use (see forceSwitch) + mGeneratedHeaders = target; } /** @@ -377,6 +409,17 @@ public class AccountSettingsXL extends PreferenceActivity */ @Override public void onHeaderClick(Header header, int position) { + // special case when exiting the server settings fragments + if (mCurrentFragment instanceof AccountServerBaseFragment) { + if (position != mCurrentHeaderPosition) { + UnsavedChangesDialogFragment dialogFragment = + UnsavedChangesDialogFragment.newInstance(position); + dialogFragment.show(getFragmentManager(), UnsavedChangesDialogFragment.TAG); + } + return; + } + + // Secret keys: Click 10x to enable debug settings if (position == 0) { mNumGeneralHeaderClicked++; if (mNumGeneralHeaderClicked == 10) { @@ -385,31 +428,41 @@ public class AccountSettingsXL extends PreferenceActivity } else { mNumGeneralHeaderClicked = 0; } - if (position != mCurrentHeaderPosition) { - // if showing a sub-panel (e.g. server settings) we need to trap & post a dialog - } + + // Process header click normally + mCurrentHeaderPosition = position; super.onHeaderClick(header, position); } /** - * Implements AccountSettingsFragment.OnAttachListener + * Switch to a specific header without checking for server settings fragments as done + * in {@link #onHeaderClick(Header, int)}. Called after we interrupted a header switch + * with a dialog, and the user OK'd it. + */ + private void forceSwitchHeader(int newPosition) { + mCurrentHeaderPosition = newPosition; + Header header = mGeneratedHeaders.get(newPosition); + switchToHeader(header.fragment, header.fragmentArguments); + } + + /** + * Called by fragments at onAttach time */ - @Override public void onAttach(Fragment f) { mCurrentFragment = f; // dispatch per-fragment setup if (f instanceof AccountSettingsFragment) { AccountSettingsFragment asf = (AccountSettingsFragment) f; asf.setCallback(mAccountSettingsFragmentCallback); - } else if (f instanceof AccountSetupIncomingFragment) { - // TODO - } else if (f instanceof AccountSetupOutgoingFragment) { - // TODO - } else if (f instanceof AccountSetupExchangeFragment) { - // TODO + } else if (mCurrentFragment instanceof AccountServerBaseFragment) { + AccountServerBaseFragment asbf = (AccountServerBaseFragment) mCurrentFragment; + asbf.setCallback(mAccountServerSettingsFragmentCallback); + } + + // When we're changing fragments, enable/disable the add account button + if (mAddAccountButton != null && hasHeaders()) { + mAddAccountButton.setEnabled(shouldShowNewAccount()); } - // Since we're changing fragments, enable/disable the add account button - mAddAccountButton.setEnabled(shouldShowNewAccount()); } /** @@ -431,7 +484,26 @@ public class AccountSettingsXL extends PreferenceActivity } /** - * STOPSHIP: non-fragmented dispatch to edit incoming settings. Replace with fragment flip. + * Callbacks for AccountServerSettingsFragmentCallback + */ + private class AccountServerSettingsFragmentCallback + implements AccountServerBaseFragment.Callback { + @Override + public void onEnableProceedButtons(boolean enable) { + // This is not used - it's a callback for the legacy activities + } + @Override + public void onProceedNext(int setupMode) { + // TODO - this will be a fragment launch, with a fragment target result + AccountSetupCheckSettings.actionCheckSettings(AccountSettingsXL.this, setupMode); + } + } + + /** + * Dispatch to edit incoming settings. + * + * TODO: Cache the store lookup earlier, in an AsyncTask, to avoid this DB access + * TODO: Make things less hardwired */ public void onIncomingSettings(Account account) { try { @@ -439,9 +511,17 @@ public class AccountSettingsXL extends PreferenceActivity if (store != null) { Class setting = store.getSettingActivityClass(); if (setting != null) { - java.lang.reflect.Method m = setting.getMethod("actionEditIncomingSettings", - Activity.class, int.class, Account.class); - m.invoke(null, this, SetupData.FLOW_MODE_EDIT, account); +// java.lang.reflect.Method m = setting.getMethod("actionEditIncomingSettings", +// Activity.class, int.class, Account.class); +// m.invoke(null, this, SetupData.FLOW_MODE_EDIT, account); + SetupData.init(SetupData.FLOW_MODE_EDIT, account); + Fragment f = null; + if (setting.equals(AccountSetupIncoming.class)) { + f = new AccountSetupIncomingFragment(); + } else if (setting.equals(AccountSetupExchange.class)) { + f = new AccountSetupExchangeFragment(); + } + startPreferenceFragment(f, true); } } } catch (Exception e) { @@ -450,7 +530,10 @@ public class AccountSettingsXL extends PreferenceActivity } /** - * STOPSHIP: non-fragmented dispatch to edit outgoing settings. Replace with fragment flip. + * Dispatch to edit outgoing settings. + * + * TODO: Cache the store lookup earlier, in an AsyncTask, to avoid this DB access + * TODO: Make things less hardwired */ public void onOutgoingSettings(Account account) { try { @@ -458,9 +541,15 @@ public class AccountSettingsXL extends PreferenceActivity if (sender != null) { Class setting = sender.getSettingActivityClass(); if (setting != null) { - java.lang.reflect.Method m = setting.getMethod("actionEditOutgoingSettings", - Activity.class, int.class, Account.class); - m.invoke(null, this, SetupData.FLOW_MODE_EDIT, account); +// java.lang.reflect.Method m = setting.getMethod("actionEditOutgoingSettings", +// Activity.class, int.class, Account.class); +// m.invoke(null, this, SetupData.FLOW_MODE_EDIT, account); + SetupData.init(SetupData.FLOW_MODE_EDIT, account); + Fragment f = null; + if (setting.equals(AccountSetupOutgoing.class)) { + f = new AccountSetupOutgoingFragment(); + } + startPreferenceFragment(f, true); } } } catch (Exception e) { @@ -539,4 +628,49 @@ public class AccountSettingsXL extends PreferenceActivity addPreferencesFromResource(R.xml.general_preferences); } } + + /** + * Dialog fragment to show "exit with unsaved changes?" dialog + */ + public static class UnsavedChangesDialogFragment extends DialogFragment { + private final static String TAG = "UnsavedChangesDialogFragment"; + + // Argument bundle keys + private final static String BUNDLE_KEY_NEW_HEADER = "UnsavedChangesDialogFragment.Header"; + + /** + * Create the dialog with parameters + */ + public static UnsavedChangesDialogFragment newInstance(int newPosition) { + UnsavedChangesDialogFragment f = new UnsavedChangesDialogFragment(); + Bundle b = new Bundle(); + b.putInt(BUNDLE_KEY_NEW_HEADER, newPosition); + f.setArguments(b); + return f; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final AccountSettingsXL activity = (AccountSettingsXL) getActivity(); + final int newPosition = getArguments().getInt(BUNDLE_KEY_NEW_HEADER); + + return new AlertDialog.Builder(activity) + .setIcon(android.R.drawable.ic_dialog_alert) + .setTitle(android.R.string.dialog_alert_title) + .setMessage(R.string.account_settings_exit_server_settings) + .setPositiveButton( + R.string.okay_action, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + activity.forceSwitchHeader(newPosition); + dismiss(); + } + }) + .setNegativeButton( + activity.getString(R.string.cancel_action), + null) + .create(); + } + } + } diff --git a/src/com/android/email/activity/setup/AccountSetupExchange.java b/src/com/android/email/activity/setup/AccountSetupExchange.java index b8a03194c..2edb82702 100644 --- a/src/com/android/email/activity/setup/AccountSetupExchange.java +++ b/src/com/android/email/activity/setup/AccountSetupExchange.java @@ -217,14 +217,14 @@ public class AccountSetupExchange extends AccountSetupActivity } /** - * Implements AccountSetupIncomingFragment.Listener + * Implements AccountServerBaseFragment.Callback */ - public void onProceedNext() { - AccountSetupCheckSettings.actionCheckSettings(this, SetupData.CHECK_INCOMING); + public void onProceedNext(int checkMode) { + AccountSetupCheckSettings.actionCheckSettings(this, checkMode); } /** - * Implements AccountSetupIncomingFragment.Listener + * Implements AccountServerBaseFragment.Callback */ public void onEnableProceedButtons(boolean enabled) { mNextButton.setEnabled(enabled); diff --git a/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java b/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java index 02a4b749f..627ced12b 100644 --- a/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupExchangeFragment.java @@ -26,7 +26,6 @@ import com.android.email.provider.EmailContent.HostAuth; import com.android.exchange.ExchangeService; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.os.RemoteException; @@ -38,9 +37,9 @@ import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.TextView; -import android.widget.CompoundButton.OnCheckedChangeListener; import java.io.IOException; import java.net.URI; @@ -54,7 +53,8 @@ import java.net.URISyntaxException; * Do not attempt to define orientation-specific resources, they won't be loaded. * What we really need here is a more "sticky" way to prevent that problem. */ -public class AccountSetupExchangeFragment extends Fragment implements OnCheckedChangeListener { +public class AccountSetupExchangeFragment extends AccountServerBaseFragment + implements OnCheckedChangeListener { private final static String STATE_KEY_CREDENTIAL = "AccountSetupExchangeFragment.loginCredential"; @@ -66,26 +66,10 @@ public class AccountSetupExchangeFragment extends Fragment implements OnCheckedC private CheckBox mTrustCertificatesView; // Support for lifecycle - private Context mContext; - private Callback mCallback = EmptyCallback.INSTANCE; private boolean mStarted; private boolean mLoaded; private String mCacheLoginCredential; - /** - * Callback interface that owning activities must implement - */ - public interface Callback { - public void onEnableProceedButtons(boolean enable); - public void onProceedNext(); - } - - private static class EmptyCallback implements Callback { - public static final Callback INSTANCE = new EmptyCallback(); - @Override public void onProceedNext() { } - @Override public void onEnableProceedButtons(boolean enable) { } - } - /** * Called to do initial creation of a fragment. This is called after * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}. @@ -224,9 +208,9 @@ public class AccountSetupExchangeFragment extends Fragment implements OnCheckedC /** * Activity provides callbacks here. This also triggers loading and setting up the UX */ + @Override public void setCallback(Callback callback) { - mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback; - mContext = getActivity(); + super.setCallback(callback); if (mStarted && !mLoaded) { loadSettings(SetupData.getAccount()); } @@ -292,7 +276,7 @@ public class AccountSetupExchangeFragment extends Fragment implements OnCheckedC enabled = false; } } - mCallback.onEnableProceedButtons(enabled); + enableNextButton(enabled); return enabled; } @@ -306,6 +290,7 @@ public class AccountSetupExchangeFragment extends Fragment implements OnCheckedC * * TODO: Was the !isSaved() logic ever actually used? */ + @Override public void saveSettingsAfterEdit() { Account account = SetupData.getAccount(); if (account.isSaved()) { @@ -376,6 +361,7 @@ public class AccountSetupExchangeFragment extends Fragment implements OnCheckedC /** * Entry point from Activity, when "next" button is clicked */ + @Override public void onNext() { try { URI uri = getUri(); @@ -401,6 +387,6 @@ public class AccountSetupExchangeFragment extends Fragment implements OnCheckedC throw new Error(use); } - mCallback.onProceedNext(); + mCallback.onProceedNext(SetupData.CHECK_INCOMING); } } diff --git a/src/com/android/email/activity/setup/AccountSetupIncoming.java b/src/com/android/email/activity/setup/AccountSetupIncoming.java index 3517d2774..a3d14470b 100644 --- a/src/com/android/email/activity/setup/AccountSetupIncoming.java +++ b/src/com/android/email/activity/setup/AccountSetupIncoming.java @@ -88,14 +88,14 @@ public class AccountSetupIncoming extends AccountSetupActivity } /** - * Implements AccountSetupIncomingFragment.Listener + * Implements AccountServerBaseFragment.Callback */ - public void onProceedNext() { - AccountSetupCheckSettings.actionCheckSettings(this, SetupData.CHECK_INCOMING); + public void onProceedNext(int checkMode) { + AccountSetupCheckSettings.actionCheckSettings(this, checkMode); } /** - * Implements AccountSetupIncomingFragment.Listener + * Implements AccountServerBaseFragment.Callback */ public void onEnableProceedButtons(boolean enabled) { mNextButton.setEnabled(enabled); diff --git a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java index be544140d..77957994f 100644 --- a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java @@ -24,7 +24,6 @@ import com.android.email.provider.EmailContent; import com.android.email.provider.EmailContent.Account; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.text.Editable; @@ -43,7 +42,7 @@ import android.widget.TextView; import java.net.URI; import java.net.URISyntaxException; -public class AccountSetupIncomingFragment extends Fragment { +public class AccountSetupIncomingFragment extends AccountServerBaseFragment { private final static String STATE_KEY_CREDENTIAL = "AccountSetupIncomingFragment.loginCredential"; @@ -75,26 +74,10 @@ public class AccountSetupIncomingFragment extends Fragment { private EditText mImapPathPrefixView; // Support for lifecycle - private Context mContext; - private Callback mCallback = EmptyCallback.INSTANCE; private boolean mStarted; private boolean mLoaded; private String mCacheLoginCredential; - /** - * Callback interface that owning activities must implement - */ - public interface Callback { - public void onEnableProceedButtons(boolean enable); - public void onProceedNext(); - } - - private static class EmptyCallback implements Callback { - public static final Callback INSTANCE = new EmptyCallback(); - @Override public void onProceedNext() { } - @Override public void onEnableProceedButtons(boolean enable) { } - } - /** * Called to do initial creation of a fragment. This is called after * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}. @@ -274,9 +257,9 @@ public class AccountSetupIncomingFragment extends Fragment { /** * Activity provides callbacks here. This also triggers loading and setting up the UX */ + @Override public void setCallback(Callback callback) { - mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback; - mContext = getActivity(); + super.setCallback(callback); if (mStarted && !mLoaded) { loadSettings(); } @@ -370,7 +353,7 @@ public class AccountSetupIncomingFragment extends Fragment { enabled = false; } } - mCallback.onEnableProceedButtons(enabled); + enableNextButton(enabled); } private void updatePortFromSecurityType() { @@ -381,6 +364,7 @@ public class AccountSetupIncomingFragment extends Fragment { /** * Entry point from Activity after editing settings and verifying them. Must be FLOW_MODE_EDIT. */ + @Override public void saveSettingsAfterEdit() { EmailContent.Account account = SetupData.getAccount(); if (account.isSaved()) { @@ -446,6 +430,7 @@ public class AccountSetupIncomingFragment extends Fragment { /** * Entry point from Activity, when "next" button is clicked */ + @Override public void onNext() { EmailContent.Account setupAccount = SetupData.getAccount(); try { @@ -473,6 +458,6 @@ public class AccountSetupIncomingFragment extends Fragment { setupAccount.setDeletePolicy( (Integer)((SpinnerOption)mDeletePolicyView.getSelectedItem()).value); - mCallback.onProceedNext(); + mCallback.onProceedNext(SetupData.CHECK_INCOMING); } } diff --git a/src/com/android/email/activity/setup/AccountSetupOutgoing.java b/src/com/android/email/activity/setup/AccountSetupOutgoing.java index 668a6c598..05b1742c6 100644 --- a/src/com/android/email/activity/setup/AccountSetupOutgoing.java +++ b/src/com/android/email/activity/setup/AccountSetupOutgoing.java @@ -86,14 +86,14 @@ public class AccountSetupOutgoing extends Activity } /** - * Implements AccountSetupIncomingFragment.Listener + * Implements AccountServerBaseFragment.Callback */ - public void onProceedNext() { - AccountSetupCheckSettings.actionCheckSettings(this, SetupData.CHECK_OUTGOING); + public void onProceedNext(int checkMode) { + AccountSetupCheckSettings.actionCheckSettings(this, checkMode); } /** - * Implements AccountSetupIncomingFragment.Listener + * Implements AccountServerBaseFragment.Callback */ public void onEnableProceedButtons(boolean enabled) { mNextButton.setEnabled(enabled); diff --git a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java index e5a540040..e201742de 100644 --- a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java +++ b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java @@ -23,7 +23,6 @@ import com.android.email.Utility; import com.android.email.provider.EmailContent; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.text.Editable; @@ -44,7 +43,8 @@ import android.widget.Spinner; import java.net.URI; import java.net.URISyntaxException; -public class AccountSetupOutgoingFragment extends Fragment implements OnCheckedChangeListener { +public class AccountSetupOutgoingFragment extends AccountServerBaseFragment + implements OnCheckedChangeListener { private static final int SMTP_PORTS[] = { 587, 465, 465, 587, 587 }; @@ -62,25 +62,9 @@ public class AccountSetupOutgoingFragment extends Fragment implements OnCheckedC private Spinner mSecurityTypeView; // Support for lifecycle - private Context mContext; - private Callback mCallback = EmptyCallback.INSTANCE; private boolean mStarted; private boolean mLoaded; - /** - * Callback interface that owning activities must implement - */ - public interface Callback { - public void onEnableProceedButtons(boolean enable); - public void onProceedNext(); - } - - private static class EmptyCallback implements Callback { - public static final Callback INSTANCE = new EmptyCallback(); - @Override public void onProceedNext() { } - @Override public void onEnableProceedButtons(boolean enable) { } - } - /** * Called to do initial creation of a fragment. This is called after * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}. @@ -239,9 +223,9 @@ public class AccountSetupOutgoingFragment extends Fragment implements OnCheckedC /** * Activity provides callbacks here. This also triggers loading and setting up the UX */ + @Override public void setCallback(Callback callback) { - mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback; - mContext = getActivity(); + super.setCallback(callback); if (mStarted && !mLoaded) { loadSettings(); } @@ -317,7 +301,7 @@ public class AccountSetupOutgoingFragment extends Fragment implements OnCheckedC enabled = false; } } - mCallback.onEnableProceedButtons(enabled); + enableNextButton(enabled); } /** @@ -337,6 +321,7 @@ public class AccountSetupOutgoingFragment extends Fragment implements OnCheckedC /** * Entry point from Activity after editing settings and verifying them. Must be FLOW_MODE_EDIT. */ + @Override public void saveSettingsAfterEdit() { EmailContent.Account account = SetupData.getAccount(); if (account.isSaved()) { @@ -373,6 +358,7 @@ public class AccountSetupOutgoingFragment extends Fragment implements OnCheckedC /** * Entry point from Activity, when "next" button is clicked */ + @Override public void onNext() { EmailContent.Account account = SetupData.getAccount(); try { @@ -386,6 +372,6 @@ public class AccountSetupOutgoingFragment extends Fragment implements OnCheckedC */ throw new Error(use); } - mCallback.onProceedNext(); + mCallback.onProceedNext(SetupData.CHECK_OUTGOING); } }