/* * Copyright (C) 2012 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.settings.inputmethod; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.InstrumentedFragment; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.inputmethod.UserDictionaryAddWordContents.LocaleRenderer; import java.util.ArrayList; import java.util.Locale; /** * Fragment to add a word/shortcut to the user dictionary. * * As opposed to the UserDictionaryActivity, this is only invoked within Settings * from the UserDictionarySettings. */ public class UserDictionaryAddWordFragment extends InstrumentedFragment implements AdapterView.OnItemSelectedListener, com.android.internal.app.LocalePicker.LocaleSelectionListener { private static final int OPTIONS_MENU_DELETE = Menu.FIRST; private UserDictionaryAddWordContents mContents; private View mRootView; private boolean mIsDeleting = false; @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); getActivity().getActionBar().setTitle(R.string.user_dict_settings_title); // Keep the instance so that we remember mContents when configuration changes (eg rotation) setRetainInstance(true); } @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedState) { mRootView = inflater.inflate(R.layout.user_dictionary_add_word_fullscreen, null); mIsDeleting = false; // If we have a non-null mContents object, it's the old value before a configuration // change (eg rotation) so we need to use its values. Otherwise, read from the arguments. if (null == mContents) { mContents = new UserDictionaryAddWordContents(mRootView, getArguments()); } else { // We create a new mContents object to account for the new situation : a word has // been added to the user dictionary when we started rotating, and we are now editing // it. That means in particular if the word undergoes any change, the old version should // be updated, so the mContents object needs to switch to EDIT mode if it was in // INSERT mode. mContents = new UserDictionaryAddWordContents(mRootView, mContents /* oldInstanceToBeEdited */); } getActivity().getActionBar().setSubtitle(UserDictionarySettingsUtils.getLocaleDisplayName( getActivity(), mContents.getCurrentUserDictionaryLocale())); return mRootView; } @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { MenuItem actionItem = menu.add(0, OPTIONS_MENU_DELETE, 0, R.string.delete) .setIcon(android.R.drawable.ic_menu_delete); actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); } /** * Callback for the framework when a menu option is pressed. * * This class only supports the delete menu item. * @param MenuItem the item that was pressed * @return false to allow normal menu processing to proceed, true to consume it here */ @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == OPTIONS_MENU_DELETE) { mContents.delete(getActivity()); mIsDeleting = true; getActivity().onBackPressed(); return true; } return false; } @Override protected int getMetricsCategory() { return MetricsEvent.INPUTMETHOD_USER_DICTIONARY_ADD_WORD; } @Override public void onResume() { super.onResume(); // We are being shown: display the word updateSpinner(); } private void updateSpinner() { final ArrayList<LocaleRenderer> localesList = mContents.getLocalesList(getActivity()); final ArrayAdapter<LocaleRenderer> adapter = new ArrayAdapter<LocaleRenderer>(getActivity(), android.R.layout.simple_spinner_item, localesList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); } @Override public void onPause() { super.onPause(); // We are being hidden: commit changes to the user dictionary, unless we were deleting it if (!mIsDeleting) { mContents.apply(getActivity(), null); } } @Override public void onItemSelected(final AdapterView<?> parent, final View view, final int pos, final long id) { final LocaleRenderer locale = (LocaleRenderer)parent.getItemAtPosition(pos); if (locale.isMoreLanguages()) { SettingsActivity sa = (SettingsActivity)getActivity(); sa.startPreferenceFragment(new UserDictionaryLocalePicker(this), true); } else { mContents.updateLocale(locale.getLocaleString()); } } @Override public void onNothingSelected(final AdapterView<?> parent) { // I'm not sure we can come here, but if we do, that's the right thing to do. final Bundle args = getArguments(); mContents.updateLocale(args.getString(UserDictionaryAddWordContents.EXTRA_LOCALE)); } // Called by the locale picker @Override public void onLocaleSelected(final Locale locale) { mContents.updateLocale(locale.toString()); getActivity().onBackPressed(); } }