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 {
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.
* @return Whether the given language is blocked by the user.
......@@ -1171,6 +1180,7 @@ public class PrefServiceBridge {
private native void nativeGetUserAcceptLanguages(List<String> list);
private native void nativeUpdateUserAcceptLanguages(String language, boolean add);
private native void nativeMoveAcceptLanguage(String language, int offset);
private native void nativeSetLanguageOrder(String[] codes);
private native boolean nativeIsBlockedLanguage(String language);
private native void nativeSetLanguageBlockedState(String language, boolean blocked);
private native String nativeGetDownloadDefaultDirectory();
......
......@@ -12,6 +12,7 @@ import android.support.v4.app.Fragment;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.support.v7.widget.SearchView;
import android.text.TextUtils;
import android.view.LayoutInflater;
......@@ -51,9 +52,10 @@ public class AddLanguageFragment extends Fragment {
}
@Override
public void onBindViewHolder(LanguageRowViewHolder holder, int position) {
public void onBindViewHolder(ViewHolder holder, int 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 {
*/
private void search(String query) {
if (TextUtils.isEmpty(query)) {
reload(mFullLanguageList);
setDisplayedLanguages(mFullLanguageList);
return;
}
......@@ -76,7 +78,7 @@ public class AddLanguageFragment extends Fragment {
results.add(item);
}
}
reload(results);
setDisplayedLanguages(results);
}
}
......@@ -124,7 +126,7 @@ public class AddLanguageFragment extends Fragment {
mAdapter = new LanguageSearchListAdapter(activity);
mRecyclerView.setAdapter(mAdapter);
mAdapter.reload(mFullLanguageList);
mAdapter.setDisplayedLanguages(mFullLanguageList);
mRecyclerView.getViewTreeObserver().addOnScrollChangedListener(
PreferenceUtils.getShowShadowOnScrollListener(
mRecyclerView, view.findViewById(R.id.shadow)));
......@@ -141,7 +143,7 @@ public class AddLanguageFragment extends Fragment {
mSearchView.setOnCloseListener(() -> {
mSearch = "";
mAdapter.reload(mFullLanguageList);
mAdapter.setDisplayedLanguages(mFullLanguageList);
return false;
});
......
......@@ -10,13 +10,12 @@ import android.support.v7.preference.PreferenceViewHolder;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.util.AttributeSet;
import android.view.accessibility.AccessibilityManager;
import android.widget.TextView;
import org.chromium.chrome.R;
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.Item;
import org.chromium.chrome.browser.widget.TintedDrawable;
......@@ -35,14 +34,13 @@ public class LanguageListPreference extends Preference {
}
@Override
public void onBindViewHolder(
LanguageListBaseAdapter.LanguageRowViewHolder holder, int position) {
public void onBindViewHolder(ViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
showDragIndicatorInRow(holder, R.drawable.ic_drag_handle_grey600_24dp);
final LanguageItem info = getItemByPosition(position);
holder.setMenuButtonDelegate(new ListMenuButton.Delegate() {
showDragIndicatorInRow((LanguageRowViewHolder) holder);
((LanguageRowViewHolder) holder).setMenuButtonDelegate(new ListMenuButton.Delegate() {
@Override
public Item[] getItems() {
ArrayList<Item> menuItems = new ArrayList<>();
......@@ -66,7 +64,7 @@ public class LanguageListPreference extends Preference {
// Add some appropriate options for moving the language when the list is not
// 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.
if (position > 0) {
menuItems.add(new Item(mContext, R.string.menu_item_move_to_top, true));
......@@ -114,14 +112,18 @@ public class LanguageListPreference extends Preference {
@Override
public void onDataUpdated() {
reload(LanguagesManager.getInstance().getUserAcceptLanguageItems());
if (mDragStateDelegate.getDragActive()) {
enableDrag();
} else {
disableDrag();
}
setDisplayedLanguages(LanguagesManager.getInstance().getUserAcceptLanguageItems());
}
}
private TextView mAddLanguageButton;
private RecyclerView mRecyclerView;
private LanguageListAdapter mAdapter;
private AddLanguageFragment.Launcher mLauncher;
public LanguageListPreference(Context context, AttributeSet attrs) {
......@@ -152,27 +154,13 @@ public class LanguageListPreference extends Preference {
mRecyclerView.addItemDecoration(
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
// the view is bound.
if (mRecyclerView.getAdapter() != mAdapter) {
mRecyclerView.setAdapter(mAdapter);
LanguagesManager.getInstance().setAcceptLanguageObserver(mAdapter);
// Initialize accept language list.
mAdapter.reload(LanguagesManager.getInstance().getUserAcceptLanguageItems());
mAdapter.onDataUpdated();
}
}
......
......@@ -159,6 +159,18 @@ class LanguagesManager {
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.
* @return the LanguagesManager singleton.
......
......@@ -1229,6 +1229,21 @@ static void JNI_PrefServiceBridge_GetUserAcceptLanguages(
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(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
......
......@@ -368,6 +368,11 @@ void TranslatePrefs::RearrangeLanguage(
}
}
void TranslatePrefs::SetLanguageOrder(
const std::vector<std::string>& new_order) {
UpdateLanguageList(new_order);
}
// static
void TranslatePrefs::GetLanguageInfoList(
const std::string& app_locale,
......
......@@ -206,6 +206,11 @@ class TranslatePrefs {
const int offset,
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
// available in the given locale.
// 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