Commit ca80f582 authored by Jenna Himawan's avatar Jenna Himawan Committed by Commit Bot

Refactoring language list to use drag-reordering classes

Change-Id: I281bb273a2052743beae656fbb357e46613f8e52
Bug: 993066
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1716959
Commit-Queue: Jenna Himawan <jhimawan@google.com>
Reviewed-by: default avataranthonyvd <anthonyvd@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#686225}
parent 1cf00362
...@@ -928,6 +928,15 @@ public class PrefServiceBridge { ...@@ -928,6 +928,15 @@ public class PrefServiceBridge {
nativeMoveAcceptLanguage(languageCode, offset); nativeMoveAcceptLanguage(languageCode, offset);
} }
/**
* Given an array of language codes, sets the order of the user's accepted languages to match.
*
* @param codes The new order for the user's accepted languages.
*/
public void setLanguageOrder(String[] codes) {
nativeSetLanguageOrder(codes);
}
/** /**
* @param languageCode A valid language code to check. * @param languageCode A valid language code to check.
* @return Whether the given language is blocked by the user. * @return Whether the given language is blocked by the user.
...@@ -1171,6 +1180,7 @@ public class PrefServiceBridge { ...@@ -1171,6 +1180,7 @@ public class PrefServiceBridge {
private native void nativeGetUserAcceptLanguages(List<String> list); private native void nativeGetUserAcceptLanguages(List<String> list);
private native void nativeUpdateUserAcceptLanguages(String language, boolean add); private native void nativeUpdateUserAcceptLanguages(String language, boolean add);
private native void nativeMoveAcceptLanguage(String language, int offset); private native void nativeMoveAcceptLanguage(String language, int offset);
private native void nativeSetLanguageOrder(String[] codes);
private native boolean nativeIsBlockedLanguage(String language); private native boolean nativeIsBlockedLanguage(String language);
private native void nativeSetLanguageBlockedState(String language, boolean blocked); private native void nativeSetLanguageBlockedState(String language, boolean blocked);
private native String nativeGetDownloadDefaultDirectory(); private native String nativeGetDownloadDefaultDirectory();
......
...@@ -12,6 +12,7 @@ import android.support.v4.app.Fragment; ...@@ -12,6 +12,7 @@ import android.support.v4.app.Fragment;
import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.support.v7.widget.SearchView; import android.support.v7.widget.SearchView;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
...@@ -51,9 +52,10 @@ public class AddLanguageFragment extends Fragment { ...@@ -51,9 +52,10 @@ public class AddLanguageFragment extends Fragment {
} }
@Override @Override
public void onBindViewHolder(LanguageRowViewHolder holder, int position) { public void onBindViewHolder(ViewHolder holder, int position) {
super.onBindViewHolder(holder, position); super.onBindViewHolder(holder, position);
holder.setItemClickListener(getItemByPosition(position), mItemClickListener); ((LanguageRowViewHolder) holder)
.setItemClickListener(getItemByPosition(position), mItemClickListener);
} }
/** /**
...@@ -62,7 +64,7 @@ public class AddLanguageFragment extends Fragment { ...@@ -62,7 +64,7 @@ public class AddLanguageFragment extends Fragment {
*/ */
private void search(String query) { private void search(String query) {
if (TextUtils.isEmpty(query)) { if (TextUtils.isEmpty(query)) {
reload(mFullLanguageList); setDisplayedLanguages(mFullLanguageList);
return; return;
} }
...@@ -76,7 +78,7 @@ public class AddLanguageFragment extends Fragment { ...@@ -76,7 +78,7 @@ public class AddLanguageFragment extends Fragment {
results.add(item); results.add(item);
} }
} }
reload(results); setDisplayedLanguages(results);
} }
} }
...@@ -124,7 +126,7 @@ public class AddLanguageFragment extends Fragment { ...@@ -124,7 +126,7 @@ public class AddLanguageFragment extends Fragment {
mAdapter = new LanguageSearchListAdapter(activity); mAdapter = new LanguageSearchListAdapter(activity);
mRecyclerView.setAdapter(mAdapter); mRecyclerView.setAdapter(mAdapter);
mAdapter.reload(mFullLanguageList); mAdapter.setDisplayedLanguages(mFullLanguageList);
mRecyclerView.getViewTreeObserver().addOnScrollChangedListener( mRecyclerView.getViewTreeObserver().addOnScrollChangedListener(
PreferenceUtils.getShowShadowOnScrollListener( PreferenceUtils.getShowShadowOnScrollListener(
mRecyclerView, view.findViewById(R.id.shadow))); mRecyclerView, view.findViewById(R.id.shadow)));
...@@ -141,7 +143,7 @@ public class AddLanguageFragment extends Fragment { ...@@ -141,7 +143,7 @@ public class AddLanguageFragment extends Fragment {
mSearchView.setOnCloseListener(() -> { mSearchView.setOnCloseListener(() -> {
mSearch = ""; mSearch = "";
mAdapter.reload(mFullLanguageList); mAdapter.setDisplayedLanguages(mFullLanguageList);
return false; return false;
}); });
......
...@@ -10,13 +10,12 @@ import android.support.v7.preference.PreferenceViewHolder; ...@@ -10,13 +10,12 @@ import android.support.v7.preference.PreferenceViewHolder;
import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.accessibility.AccessibilityManager;
import android.widget.TextView; import android.widget.TextView;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.util.AccessibilityUtil;
import org.chromium.chrome.browser.widget.ListMenuButton; import org.chromium.chrome.browser.widget.ListMenuButton;
import org.chromium.chrome.browser.widget.ListMenuButton.Item; import org.chromium.chrome.browser.widget.ListMenuButton.Item;
import org.chromium.chrome.browser.widget.TintedDrawable; import org.chromium.chrome.browser.widget.TintedDrawable;
...@@ -35,14 +34,13 @@ public class LanguageListPreference extends Preference { ...@@ -35,14 +34,13 @@ public class LanguageListPreference extends Preference {
} }
@Override @Override
public void onBindViewHolder( public void onBindViewHolder(ViewHolder holder, int position) {
LanguageListBaseAdapter.LanguageRowViewHolder holder, int position) {
super.onBindViewHolder(holder, position); super.onBindViewHolder(holder, position);
showDragIndicatorInRow(holder, R.drawable.ic_drag_handle_grey600_24dp);
final LanguageItem info = getItemByPosition(position); final LanguageItem info = getItemByPosition(position);
holder.setMenuButtonDelegate(new ListMenuButton.Delegate() {
showDragIndicatorInRow((LanguageRowViewHolder) holder);
((LanguageRowViewHolder) holder).setMenuButtonDelegate(new ListMenuButton.Delegate() {
@Override @Override
public Item[] getItems() { public Item[] getItems() {
ArrayList<Item> menuItems = new ArrayList<>(); ArrayList<Item> menuItems = new ArrayList<>();
...@@ -66,7 +64,7 @@ public class LanguageListPreference extends Preference { ...@@ -66,7 +64,7 @@ public class LanguageListPreference extends Preference {
// Add some appropriate options for moving the language when the list is not // Add some appropriate options for moving the language when the list is not
// draggable. E.g. in the accessibility mode. // draggable. E.g. in the accessibility mode.
if (!isDragEnabled()) { if (!mDragStateDelegate.getDragEnabled()) {
// Add "Move to top" and "Move up" menu when it's not the first one. // Add "Move to top" and "Move up" menu when it's not the first one.
if (position > 0) { if (position > 0) {
menuItems.add(new Item(mContext, R.string.menu_item_move_to_top, true)); menuItems.add(new Item(mContext, R.string.menu_item_move_to_top, true));
...@@ -114,14 +112,18 @@ public class LanguageListPreference extends Preference { ...@@ -114,14 +112,18 @@ public class LanguageListPreference extends Preference {
@Override @Override
public void onDataUpdated() { public void onDataUpdated() {
reload(LanguagesManager.getInstance().getUserAcceptLanguageItems()); if (mDragStateDelegate.getDragActive()) {
enableDrag();
} else {
disableDrag();
}
setDisplayedLanguages(LanguagesManager.getInstance().getUserAcceptLanguageItems());
} }
} }
private TextView mAddLanguageButton; private TextView mAddLanguageButton;
private RecyclerView mRecyclerView; private RecyclerView mRecyclerView;
private LanguageListAdapter mAdapter; private LanguageListAdapter mAdapter;
private AddLanguageFragment.Launcher mLauncher; private AddLanguageFragment.Launcher mLauncher;
public LanguageListPreference(Context context, AttributeSet attrs) { public LanguageListPreference(Context context, AttributeSet attrs) {
...@@ -152,27 +154,13 @@ public class LanguageListPreference extends Preference { ...@@ -152,27 +154,13 @@ public class LanguageListPreference extends Preference {
mRecyclerView.addItemDecoration( mRecyclerView.addItemDecoration(
new DividerItemDecoration(getContext(), layoutMangager.getOrientation())); new DividerItemDecoration(getContext(), layoutMangager.getOrientation()));
// Due to a known native bug (crbug/640763), the list order written into Preference Service
// might be different from the order shown after it's adjusted by dragging.
if (!AccessibilityUtil.isAccessibilityEnabled()) mAdapter.enableDrag(mRecyclerView);
AccessibilityManager manager =
(AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
manager.addAccessibilityStateChangeListener(enabled -> {
if (enabled) {
mAdapter.disableDrag();
} else {
mAdapter.enableDrag(mRecyclerView);
}
mAdapter.notifyDataSetChanged();
});
// We do not want the RecyclerView to be announced by screen readers every time // We do not want the RecyclerView to be announced by screen readers every time
// the view is bound. // the view is bound.
if (mRecyclerView.getAdapter() != mAdapter) { if (mRecyclerView.getAdapter() != mAdapter) {
mRecyclerView.setAdapter(mAdapter); mRecyclerView.setAdapter(mAdapter);
LanguagesManager.getInstance().setAcceptLanguageObserver(mAdapter); LanguagesManager.getInstance().setAcceptLanguageObserver(mAdapter);
// Initialize accept language list. // Initialize accept language list.
mAdapter.reload(LanguagesManager.getInstance().getUserAcceptLanguageItems()); mAdapter.onDataUpdated();
} }
} }
......
...@@ -159,6 +159,18 @@ class LanguagesManager { ...@@ -159,6 +159,18 @@ class LanguagesManager {
if (reload) notifyAcceptLanguageObserver(); if (reload) notifyAcceptLanguageObserver();
} }
/**
* Sets the preference order of the user's accepted languages to the provided order.
*
* @param codes The new order for the user's languages.
* @param reload True iff the language list should be reloaded.
*/
public void setOrder(String[] codes, boolean reload) {
PrefServiceBridge.getInstance().setLanguageOrder(codes);
recordAction(LanguageSettingsActionType.LANGUAGE_LIST_REORDERED);
if (reload) notifyAcceptLanguageObserver();
}
/** /**
* Get the static instance of ChromePreferenceManager if it exists else create it. * Get the static instance of ChromePreferenceManager if it exists else create it.
* @return the LanguagesManager singleton. * @return the LanguagesManager singleton.
......
...@@ -1229,6 +1229,21 @@ static void JNI_PrefServiceBridge_GetUserAcceptLanguages( ...@@ -1229,6 +1229,21 @@ static void JNI_PrefServiceBridge_GetUserAcceptLanguages(
env, list, ToJavaArrayOfStrings(env, languages)); env, list, ToJavaArrayOfStrings(env, languages));
} }
static void JNI_PrefServiceBridge_SetLanguageOrder(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jobjectArray>& j_order) {
std::unique_ptr<translate::TranslatePrefs> translate_prefs =
ChromeTranslateClient::CreateTranslatePrefs(GetPrefService());
std::vector<std::string> order;
const int num_langs = (*env).GetArrayLength(j_order);
for (int i = 0; i < num_langs; i++) {
jstring string = (jstring)(*env).GetObjectArrayElement(j_order, i);
order.push_back((*env).GetStringUTFChars(string, nullptr));
}
translate_prefs->SetLanguageOrder(order);
}
static void JNI_PrefServiceBridge_UpdateUserAcceptLanguages( static void JNI_PrefServiceBridge_UpdateUserAcceptLanguages(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& obj,
......
...@@ -368,6 +368,11 @@ void TranslatePrefs::RearrangeLanguage( ...@@ -368,6 +368,11 @@ void TranslatePrefs::RearrangeLanguage(
} }
} }
void TranslatePrefs::SetLanguageOrder(
const std::vector<std::string>& new_order) {
UpdateLanguageList(new_order);
}
// static // static
void TranslatePrefs::GetLanguageInfoList( void TranslatePrefs::GetLanguageInfoList(
const std::string& app_locale, const std::string& app_locale,
......
...@@ -206,6 +206,11 @@ class TranslatePrefs { ...@@ -206,6 +206,11 @@ class TranslatePrefs {
const int offset, const int offset,
const std::vector<std::string>& enabled_languages); const std::vector<std::string>& enabled_languages);
// Sets the language order to the provided order.
// This function is called from the language preference manager in Chrome for
// Android.
void SetLanguageOrder(const std::vector<std::string>& new_order);
// Returns the list of TranslateLanguageInfo for all languages that are // Returns the list of TranslateLanguageInfo for all languages that are
// available in the given locale. // available in the given locale.
// The list returned in |languages| is sorted alphabetically based on the // The list returned in |languages| is sorted alphabetically based on the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment