1499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler/* 2499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * Copyright (C) 2014 The Android Open Source Project 3499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * 4499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 5499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * you may not use this file except in compliance with the License. 6499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * You may obtain a copy of the License at 7499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * 8499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * http://www.apache.org/licenses/LICENSE-2.0 9499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * 10499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * Unless required by applicable law or agreed to in writing, software 11499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 12499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * See the License for the specific language governing permissions and 14499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * limitations under the License. 15499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler */ 16499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 17499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerpackage com.android.email.activity.setup; 18499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 19499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport android.os.Bundle; 20499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport android.view.LayoutInflater; 21499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport android.view.View; 22499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport android.view.ViewGroup; 23499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport android.widget.ArrayAdapter; 24499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport android.widget.CheckBox; 25499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport android.widget.Spinner; 26499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 27499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport com.android.email.R; 28499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport com.android.email.activity.UiUtilities; 29499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport com.android.email.service.EmailServiceUtils; 30499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport com.android.emailcommon.provider.Account; 31499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport com.android.emailcommon.provider.Policy; 32499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantlerimport com.android.emailcommon.service.SyncWindow; 33499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 3476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantlerpublic class AccountSetupOptionsFragment extends AccountSetupFragment { 35499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler private Spinner mCheckFrequencyView; 36499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler private Spinner mSyncWindowView; 37e5ac64a1037d62d5cf8815f835fbcd38ad199e8dTony Mantler private View mSyncwindowLabel; 38499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler private CheckBox mNotifyView; 39499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler private CheckBox mSyncContactsView; 40499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler private CheckBox mSyncCalendarView; 41499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler private CheckBox mSyncEmailView; 42499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler private CheckBox mBackgroundAttachmentsView; 43499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 44499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler /** Default sync window for new EAS accounts */ 45499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler private static final int SYNC_WINDOW_EAS_DEFAULT = SyncWindow.SYNC_WINDOW_1_WEEK; 46499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 4776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler public interface Callback extends AccountSetupFragment.Callback { 4876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler 4976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler } 5076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler 5176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler public static AccountSetupOptionsFragment newInstance() { 5276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler return new AccountSetupOptionsFragment(); 5376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler } 5476472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler 55499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler @Override 56499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler public View onCreateView(LayoutInflater inflater, ViewGroup container, 57499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler Bundle savedInstanceState) { 58ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler final View view = inflateTemplatedView(inflater, container, 59ae980cd685a867b3fecfd38c876fd18d98b7c86bTony Mantler R.layout.account_setup_options_fragment, R.string.account_setup_options_headline); 60499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 61499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mCheckFrequencyView = UiUtilities.getView(view, R.id.account_check_frequency); 62499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncWindowView = UiUtilities.getView(view, R.id.account_sync_window); 63499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mNotifyView = UiUtilities.getView(view, R.id.account_notify); 64499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mNotifyView.setChecked(true); 65499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncContactsView = UiUtilities.getView(view, R.id.account_sync_contacts); 66499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncCalendarView = UiUtilities.getView(view, R.id.account_sync_calendar); 67499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncEmailView = UiUtilities.getView(view, R.id.account_sync_email); 68499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncEmailView.setChecked(true); 69499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mBackgroundAttachmentsView = UiUtilities.getView(view, R.id.account_background_attachments); 70499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mBackgroundAttachmentsView.setChecked(true); 71e5ac64a1037d62d5cf8815f835fbcd38ad199e8dTony Mantler mSyncwindowLabel = UiUtilities.getView(view, R.id.account_sync_window_label); 72499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 73499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler return view; 74499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 75499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 76499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler @Override 77499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler public void onActivityCreated(Bundle savedInstanceState) { 78499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler super.onActivityCreated(savedInstanceState); 79499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 80499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final View view = getView(); 81499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 82064726d9f9fb7c38a252fc9c4fe2b7cf645eade0Tony Mantler final SetupDataFragment setupData = 83064726d9f9fb7c38a252fc9c4fe2b7cf645eade0Tony Mantler ((SetupDataFragment.SetupDataContainer) getActivity()).getSetupData(); 84064726d9f9fb7c38a252fc9c4fe2b7cf645eade0Tony Mantler final Account account = setupData.getAccount(); 85499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 86499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final EmailServiceUtils.EmailServiceInfo serviceInfo = 87064726d9f9fb7c38a252fc9c4fe2b7cf645eade0Tony Mantler setupData.getIncomingServiceInfo(getActivity()); 88499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 89499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final CharSequence[] frequencyValues = serviceInfo.syncIntervals; 90499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final CharSequence[] frequencyEntries = serviceInfo.syncIntervalStrings; 91499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 92499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler // Now create the array used by the sync interval Spinner 93499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final SpinnerOption[] checkFrequencies = new SpinnerOption[frequencyEntries.length]; 94499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler for (int i = 0; i < frequencyEntries.length; i++) { 95499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler checkFrequencies[i] = new SpinnerOption( 96499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler Integer.valueOf(frequencyValues[i].toString()), frequencyEntries[i].toString()); 97499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 98499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final ArrayAdapter<SpinnerOption> checkFrequenciesAdapter = 99e5ac64a1037d62d5cf8815f835fbcd38ad199e8dTony Mantler new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, 100499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler checkFrequencies); 101499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler checkFrequenciesAdapter 102499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 103499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mCheckFrequencyView.setAdapter(checkFrequenciesAdapter); 104499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler SpinnerOption.setSpinnerOptionValue(mCheckFrequencyView, account.getSyncInterval()); 105499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 106499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler if (serviceInfo.offerLookback) { 107499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler enableLookbackSpinner(account); 108499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 109499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 110499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler if (serviceInfo.syncContacts) { 111499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncContactsView.setVisibility(View.VISIBLE); 112499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncContactsView.setChecked(true); 113499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler UiUtilities.setVisibilitySafe(view, R.id.account_sync_contacts_divider, View.VISIBLE); 114499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 115499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler if (serviceInfo.syncCalendar) { 116499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncCalendarView.setVisibility(View.VISIBLE); 117499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncCalendarView.setChecked(true); 118499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler UiUtilities.setVisibilitySafe(view, R.id.account_sync_calendar_divider, View.VISIBLE); 119499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 120499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 121499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler if (!serviceInfo.offerAttachmentPreload) { 122499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mBackgroundAttachmentsView.setVisibility(View.GONE); 123499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler UiUtilities.setVisibilitySafe(view, R.id.account_background_attachments_divider, 124499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler View.GONE); 125499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 126499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 127499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 128499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler /** 129499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * Enable an additional spinner using the arrays normally handled by preferences 130499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler */ 131499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler private void enableLookbackSpinner(Account account) { 132499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler // Show everything 133e5ac64a1037d62d5cf8815f835fbcd38ad199e8dTony Mantler mSyncWindowView.setVisibility(View.VISIBLE); 134e5ac64a1037d62d5cf8815f835fbcd38ad199e8dTony Mantler mSyncwindowLabel.setVisibility(View.VISIBLE); 135499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 136499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler // Generate spinner entries using XML arrays used by the preferences 137499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final CharSequence[] windowValues = getResources().getTextArray( 138499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler R.array.account_settings_mail_window_values); 139499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final CharSequence[] windowEntries = getResources().getTextArray( 140499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler R.array.account_settings_mail_window_entries); 141499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 142499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler // Find a proper maximum for email lookback, based on policy (if we have one) 143499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler int maxEntry = windowEntries.length; 144499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final Policy policy = account.mPolicy; 145499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler if (policy != null) { 146499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final int maxLookback = policy.mMaxEmailLookback; 147499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler if (maxLookback != 0) { 148499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler // Offset/Code 0 1 2 3 4 5 149499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler // Entries auto, 1 day, 3 day, 1 week, 2 week, 1 month 150499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler // Lookback N/A 1 day, 3 day, 1 week, 2 week, 1 month 151499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler // Since our test below is i < maxEntry, we must set maxEntry to maxLookback + 1 152499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler maxEntry = maxLookback + 1; 153499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 154499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 155499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 156499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler // Now create the array used by the Spinner 157499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final SpinnerOption[] windowOptions = new SpinnerOption[maxEntry]; 158499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler int defaultIndex = -1; 159499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler for (int i = 0; i < maxEntry; i++) { 160499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final int value = Integer.valueOf(windowValues[i].toString()); 161499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler windowOptions[i] = new SpinnerOption(value, windowEntries[i].toString()); 162499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler if (value == SYNC_WINDOW_EAS_DEFAULT) { 163499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler defaultIndex = i; 164499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 165499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 166499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 167499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler final ArrayAdapter<SpinnerOption> windowOptionsAdapter = 168e5ac64a1037d62d5cf8815f835fbcd38ad199e8dTony Mantler new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, 169499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler windowOptions); 170499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler windowOptionsAdapter 171499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 172499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncWindowView.setAdapter(windowOptionsAdapter); 173499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 174499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler SpinnerOption.setSpinnerOptionValue(mSyncWindowView, account.getSyncLookback()); 175499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler if (defaultIndex >= 0) { 176499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler mSyncWindowView.setSelection(defaultIndex); 177499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 178499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 179499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 180499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler public boolean getBackgroundAttachmentsValue() { 181499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler return mBackgroundAttachmentsView.isChecked(); 182499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 183499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 184499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler public Integer getCheckFrequencyValue() { 185499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler return (Integer)((SpinnerOption)mCheckFrequencyView.getSelectedItem()).value; 186499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 187499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 188499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler /** 189499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler * @return Sync window value or null if view is hidden 190499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler */ 191499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler public Integer getAccountSyncWindowValue() { 192e5ac64a1037d62d5cf8815f835fbcd38ad199e8dTony Mantler if (mSyncWindowView.getVisibility() != View.VISIBLE) { 193499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler return null; 194499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 195499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler return (Integer)((SpinnerOption)mSyncWindowView.getSelectedItem()).value; 196499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 197499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 198499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler public boolean getSyncEmailValue() { 199499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler return mSyncEmailView.isChecked(); 200499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 201499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 202499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler public boolean getSyncCalendarValue() { 203499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler return mSyncCalendarView.isChecked(); 204499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 205499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 206499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler public boolean getSyncContactsValue() { 207499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler return mSyncContactsView.isChecked(); 208499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 209499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler 210499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler public boolean getNotifyValue() { 211499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler return mNotifyView.isChecked(); 212499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler } 213499ac7b063248efb3b4815d16f4063d68f558d3aTony Mantler} 214