make internal user dictionary fragment work (mostly)

This commit is contained in:
Helium314 2023-11-28 11:04:55 +01:00
parent bd3e73ea10
commit c43e3efbc1
3 changed files with 91 additions and 57 deletions

View file

@ -6,9 +6,7 @@
package org.dslul.openboard.inputmethod.latin.userdictionary; package org.dslul.openboard.inputmethod.latin.userdictionary;
import android.app.Fragment;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -19,6 +17,12 @@ import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Spinner; import android.widget.Spinner;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.userdictionary.UserDictionaryAddWordContents.LocaleRenderer; import org.dslul.openboard.inputmethod.latin.userdictionary.UserDictionaryAddWordContents.LocaleRenderer;
import org.dslul.openboard.inputmethod.latin.userdictionary.UserDictionaryLocalePicker.LocationChangedListener; import org.dslul.openboard.inputmethod.latin.userdictionary.UserDictionaryLocalePicker.LocationChangedListener;
@ -47,12 +51,12 @@ public class UserDictionaryAddWordFragment extends Fragment
private boolean mIsDeleting = false; private boolean mIsDeleting = false;
@Override @Override
public void onActivityCreated(final Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onViewCreated(view, savedInstanceState);
setHasOptionsMenu(true); setHasOptionsMenu(true);
getActivity().getActionBar().setTitle(R.string.edit_personal_dictionary); final ActionBar actionBar = ((AppCompatActivity) requireActivity()).getSupportActionBar();
// Keep the instance so that we remember mContents when configuration changes (eg rotation) if (actionBar == null) return;
setRetainInstance(true); actionBar.setTitle(R.string.edit_personal_dictionary);
} }
@Override @Override
@ -70,11 +74,8 @@ public class UserDictionaryAddWordFragment extends Fragment
// it. That means in particular if the word undergoes any change, the old version should // 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 // be updated, so the mContents object needs to switch to EDIT mode if it was in
// INSERT mode. // INSERT mode.
mContents = new UserDictionaryAddWordContents(mRootView, mContents = new UserDictionaryAddWordContents(mRootView, mContents);
mContents /* oldInstanceToBeEdited */);
} }
getActivity().getActionBar().setSubtitle(UserDictionarySettingsUtils.getLocaleDisplayName(
getActivity(), mContents.getCurrentUserDictionaryLocale()));
return mRootView; return mRootView;
} }
@ -100,13 +101,13 @@ public class UserDictionaryAddWordFragment extends Fragment
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == OPTIONS_MENU_ADD) { if (item.getItemId() == OPTIONS_MENU_ADD) {
// added the entry in "onPause" // added the entry in "onPause"
getActivity().onBackPressed(); requireActivity().onBackPressed();
return true; return true;
} }
if (item.getItemId() == OPTIONS_MENU_DELETE) { if (item.getItemId() == OPTIONS_MENU_DELETE) {
mContents.delete(getActivity()); mContents.delete(getActivity());
mIsDeleting = true; mIsDeleting = true;
getActivity().onBackPressed(); requireActivity().onBackPressed();
return true; return true;
} }
return false; return false;
@ -119,13 +120,29 @@ public class UserDictionaryAddWordFragment extends Fragment
updateSpinner(); updateSpinner();
} }
@Override
public void onStart() {
super.onStart();
final ActionBar actionBar = ((AppCompatActivity) requireActivity()).getSupportActionBar();
if (actionBar == null) return;
actionBar.setTitle(R.string.user_dict_settings_add_dialog_title);
actionBar.setSubtitle(UserDictionarySettingsUtils.getLocaleDisplayName(getActivity(), mContents.getCurrentUserDictionaryLocale()));
}
@Override
public void onStop() {
super.onStop();
final ActionBar actionBar = ((AppCompatActivity) requireActivity()).getSupportActionBar();
if (actionBar == null) return;
actionBar.setSubtitle(null);
}
private void updateSpinner() { private void updateSpinner() {
final ArrayList<LocaleRenderer> localesList = mContents.getLocalesList(getActivity()); final ArrayList<LocaleRenderer> localesList = mContents.getLocalesList(getActivity());
final Spinner localeSpinner = final Spinner localeSpinner = mRootView.findViewById(R.id.user_dictionary_add_locale);
mRootView.findViewById(R.id.user_dictionary_add_locale);
final ArrayAdapter<LocaleRenderer> adapter = new ArrayAdapter<>( final ArrayAdapter<LocaleRenderer> adapter = new ArrayAdapter<>(
getActivity(), android.R.layout.simple_spinner_item, localesList); requireActivity(), android.R.layout.simple_spinner_item, localesList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
localeSpinner.setAdapter(adapter); localeSpinner.setAdapter(adapter);
localeSpinner.setOnItemSelectedListener(this); localeSpinner.setOnItemSelectedListener(this);
@ -145,8 +162,11 @@ public class UserDictionaryAddWordFragment extends Fragment
final long id) { final long id) {
final LocaleRenderer locale = (LocaleRenderer)parent.getItemAtPosition(pos); final LocaleRenderer locale = (LocaleRenderer)parent.getItemAtPosition(pos);
if (locale.isMoreLanguages()) { if (locale.isMoreLanguages()) {
PreferenceActivity preferenceActivity = (PreferenceActivity)getActivity(); AppCompatActivity activity = (AppCompatActivity) requireActivity();
preferenceActivity.startPreferenceFragment(new UserDictionaryLocalePicker(), true); activity.getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, new UserDictionaryLocalePicker())
.addToBackStack(null)
.commit();
} else { } else {
mContents.updateLocale(locale.getLocaleString()); mContents.updateLocale(locale.getLocaleString());
} }
@ -156,6 +176,7 @@ public class UserDictionaryAddWordFragment extends Fragment
public void onNothingSelected(final AdapterView<?> parent) { 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. // I'm not sure we can come here, but if we do, that's the right thing to do.
final Bundle args = getArguments(); final Bundle args = getArguments();
if (args == null) return;
mContents.updateLocale(args.getString(UserDictionaryAddWordContents.EXTRA_LOCALE)); mContents.updateLocale(args.getString(UserDictionaryAddWordContents.EXTRA_LOCALE));
} }
@ -163,7 +184,7 @@ public class UserDictionaryAddWordFragment extends Fragment
@Override @Override
public void onLocaleSelected(final Locale locale) { public void onLocaleSelected(final Locale locale) {
mContents.updateLocale(locale.toString()); mContents.updateLocale(locale.toString());
getActivity().onBackPressed(); requireActivity().onBackPressed();
} }
} }

View file

@ -6,7 +6,7 @@
package org.dslul.openboard.inputmethod.latin.userdictionary; package org.dslul.openboard.inputmethod.latin.userdictionary;
import android.app.Fragment; import androidx.fragment.app.Fragment;
import java.util.Locale; import java.util.Locale;

View file

@ -6,7 +6,6 @@
package org.dslul.openboard.inputmethod.latin.userdictionary; package org.dslul.openboard.inputmethod.latin.userdictionary;
import android.app.ListFragment;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -27,6 +26,12 @@ import android.widget.SectionIndexer;
import android.widget.SimpleCursorAdapter; import android.widget.SimpleCursorAdapter;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.ListFragment;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import java.util.Locale; import java.util.Locale;
@ -37,16 +42,15 @@ import java.util.Locale;
public class UserDictionarySettings extends ListFragment { public class UserDictionarySettings extends ListFragment {
public static final boolean IS_SHORTCUT_API_SUPPORTED = public static final boolean IS_SHORTCUT_API_SUPPORTED = true;
true;
private static final String[] QUERY_PROJECTION_SHORTCUT_UNSUPPORTED = private static final String[] QUERY_PROJECTION_SHORTCUT_UNSUPPORTED =
{ UserDictionary.Words._ID, UserDictionary.Words.WORD}; { UserDictionary.Words._ID, UserDictionary.Words.WORD};
private static final String[] QUERY_PROJECTION_SHORTCUT_SUPPORTED = private static final String[] QUERY_PROJECTION_SHORTCUT_SUPPORTED =
{ UserDictionary.Words._ID, UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT}; { UserDictionary.Words._ID, UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT};
private static final String[] QUERY_PROJECTION = private static final String[] QUERY_PROJECTION = IS_SHORTCUT_API_SUPPORTED
IS_SHORTCUT_API_SUPPORTED ? ? QUERY_PROJECTION_SHORTCUT_SUPPORTED
QUERY_PROJECTION_SHORTCUT_SUPPORTED : QUERY_PROJECTION_SHORTCUT_UNSUPPORTED; : QUERY_PROJECTION_SHORTCUT_UNSUPPORTED;
// The index of the shortcut in the above array. // The index of the shortcut in the above array.
private static final int INDEX_SHORTCUT = 2; private static final int INDEX_SHORTCUT = 2;
@ -75,10 +79,8 @@ public class UserDictionarySettings extends ListFragment {
// Either the locale is empty (means the word is applicable to all locales) // Either the locale is empty (means the word is applicable to all locales)
// or the word equals our current locale // or the word equals our current locale
private static final String QUERY_SELECTION = private static final String QUERY_SELECTION = UserDictionary.Words.LOCALE + "=?";
UserDictionary.Words.LOCALE + "=?"; private static final String QUERY_SELECTION_ALL_LOCALES = UserDictionary.Words.LOCALE + " is null";
private static final String QUERY_SELECTION_ALL_LOCALES =
UserDictionary.Words.LOCALE + " is null";
private static final String DELETE_SELECTION_WITH_SHORTCUT = UserDictionary.Words.WORD private static final String DELETE_SELECTION_WITH_SHORTCUT = UserDictionary.Words.WORD
+ "=? AND " + UserDictionary.Words.SHORTCUT + "=?"; + "=? AND " + UserDictionary.Words.SHORTCUT + "=?";
@ -97,27 +99,25 @@ public class UserDictionarySettings extends ListFragment {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
getActivity().getActionBar().setTitle(R.string.edit_personal_dictionary); final ActionBar actionBar = ((AppCompatActivity) requireActivity()).getSupportActionBar();
if (actionBar == null) return;
actionBar.setTitle(R.string.edit_personal_dictionary);
} }
@Override @Override
public View onCreateView( public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.user_dictionary_preference_list_fragment, container, false);
return inflater.inflate(
R.layout.user_dictionary_preference_list_fragment, container, false);
} }
@Override @Override
public void onActivityCreated(Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onViewCreated(view, savedInstanceState);
final Intent intent = getActivity().getIntent(); final Intent intent = requireActivity().getIntent();
final String localeFromIntent = final String localeFromIntent = null == intent ? null : intent.getStringExtra("locale");
null == intent ? null : intent.getStringExtra("locale");
final Bundle arguments = getArguments(); final Bundle arguments = getArguments();
final String localeFromArguments = final String localeFromArguments = null == arguments ? null : arguments.getString("locale");
null == arguments ? null : arguments.getString("locale");
final String locale; final String locale;
if (null != localeFromArguments) { if (null != localeFromArguments) {
@ -131,7 +131,7 @@ public class UserDictionarySettings extends ListFragment {
// closing the cursor, so take care when resolving this TODO). We should either use a // closing the cursor, so take care when resolving this TODO). We should either use a
// regular query and close the cursor, or switch to a LoaderManager and a CursorLoader. // regular query and close the cursor, or switch to a LoaderManager and a CursorLoader.
mCursor = createCursor(locale); mCursor = createCursor(locale);
TextView emptyView = getView().findViewById(android.R.id.empty); TextView emptyView = view.findViewById(android.R.id.empty);
emptyView.setText(R.string.user_dict_settings_empty_text); emptyView.setText(R.string.user_dict_settings_empty_text);
final ListView listView = getListView(); final ListView listView = getListView();
@ -140,20 +140,34 @@ public class UserDictionarySettings extends ListFragment {
listView.setEmptyView(emptyView); listView.setEmptyView(emptyView);
setHasOptionsMenu(true); setHasOptionsMenu(true);
}
@Override
public void onStart() {
super.onStart();
// Show the language as a subtitle of the action bar // Show the language as a subtitle of the action bar
getActivity().getActionBar().setSubtitle( final ActionBar actionBar = ((AppCompatActivity) requireActivity()).getSupportActionBar();
UserDictionarySettingsUtils.getLocaleDisplayName(getActivity(), mLocale)); if (actionBar == null) return;
actionBar.setSubtitle(UserDictionarySettingsUtils.getLocaleDisplayName(getActivity(), mLocale));
}
@Override
public void onStop() {
super.onStop();
// clear the subtitle
final ActionBar actionBar = ((AppCompatActivity) requireActivity()).getSupportActionBar();
if (actionBar == null) return;
actionBar.setSubtitle(null);
} }
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
ListAdapter adapter = getListView().getAdapter(); ListAdapter adapter = getListView().getAdapter();
if (adapter instanceof MyAdapter) { if (adapter instanceof MyAdapter listAdapter) {
// The list view is forced refreshed here. This allows the changes done // The list view is forced refreshed here. This allows the changes done
// in UserDictionaryAddWordFragment (update/delete/insert) to be seen when // in UserDictionaryAddWordFragment (update/delete/insert) to be seen when
// user goes back to this view. // user goes back to this view.
MyAdapter listAdapter = (MyAdapter) adapter;
listAdapter.notifyDataSetChanged(); listAdapter.notifyDataSetChanged();
} }
} }
@ -172,12 +186,12 @@ public class UserDictionarySettings extends ListFragment {
// can be guaranteed not to match locales that may exist. // can be guaranteed not to match locales that may exist.
if ("".equals(locale)) { if ("".equals(locale)) {
// Case-insensitive sort // Case-insensitive sort
return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION, return requireActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION,
QUERY_SELECTION_ALL_LOCALES, null, QUERY_SELECTION_ALL_LOCALES, null,
"UPPER(" + UserDictionary.Words.WORD + ")"); "UPPER(" + UserDictionary.Words.WORD + ")");
} }
final String queryLocale = null != locale ? locale : Locale.getDefault().toString(); final String queryLocale = null != locale ? locale : Locale.getDefault().toString();
return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION, return requireActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION,
QUERY_SELECTION, new String[] { queryLocale }, QUERY_SELECTION, new String[] { queryLocale },
"UPPER(" + UserDictionary.Words.WORD + ")"); "UPPER(" + UserDictionary.Words.WORD + ")");
} }
@ -207,11 +221,9 @@ public class UserDictionarySettings extends ListFragment {
return; return;
} }
} }
MenuItem actionItem = MenuItem actionItem = menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title)
menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title)
.setIcon(R.drawable.ic_plus); .setIcon(R.drawable.ic_plus);
actionItem.setShowAsAction( actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
} }
@Override @Override
@ -236,10 +248,11 @@ public class UserDictionarySettings extends ListFragment {
args.putString(UserDictionaryAddWordContents.EXTRA_WORD, editingWord); args.putString(UserDictionaryAddWordContents.EXTRA_WORD, editingWord);
args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut); args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut);
args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale); args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale);
android.preference.PreferenceActivity pa = AppCompatActivity activity = (AppCompatActivity) requireActivity();
(android.preference.PreferenceActivity)getActivity(); activity.getSupportFragmentManager().beginTransaction()
pa.startPreferencePanel(UserDictionaryAddWordFragment.class.getName(), .replace(android.R.id.content, UserDictionaryAddWordFragment.class, args)
args, R.string.user_dict_settings_add_dialog_title, null, null, 0); .addToBackStack(null)
.commit();
} }
private String getWord(final int position) { private String getWord(final int position) {