OLD | NEW |
---|---|
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.infobar; | 5 package org.chromium.chrome.browser.infobar; |
6 | 6 |
7 import android.support.design.widget.TabLayout; | 7 import android.support.design.widget.TabLayout; |
8 import android.view.LayoutInflater; | 8 import android.view.LayoutInflater; |
9 import android.view.View; | 9 import android.view.View; |
10 import android.view.View.OnClickListener; | 10 import android.view.View.OnClickListener; |
11 import android.widget.LinearLayout; | 11 import android.widget.LinearLayout; |
12 | 12 |
13 import org.chromium.base.annotations.CalledByNative; | 13 import org.chromium.base.annotations.CalledByNative; |
14 import org.chromium.base.metrics.RecordHistogram; | |
14 import org.chromium.chrome.R; | 15 import org.chromium.chrome.R; |
15 import org.chromium.chrome.browser.infobar.translate.TranslateMenu; | 16 import org.chromium.chrome.browser.infobar.translate.TranslateMenu; |
16 import org.chromium.chrome.browser.infobar.translate.TranslateMenuHelper; | 17 import org.chromium.chrome.browser.infobar.translate.TranslateMenuHelper; |
17 import org.chromium.chrome.browser.infobar.translate.TranslateTabLayout; | 18 import org.chromium.chrome.browser.infobar.translate.TranslateTabLayout; |
18 import org.chromium.chrome.browser.snackbar.Snackbar; | 19 import org.chromium.chrome.browser.snackbar.Snackbar; |
19 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController; | 20 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController; |
20 import org.chromium.chrome.browser.widget.TintedImageButton; | 21 import org.chromium.chrome.browser.widget.TintedImageButton; |
21 import org.chromium.ui.widget.Toast; | 22 import org.chromium.ui.widget.Toast; |
22 | 23 |
23 /** | 24 /** |
24 * Java version of the compcat translate infobar | 25 * Java version of the compcat translate infobar |
25 */ | 26 */ |
26 class TranslateCompactInfoBar extends InfoBar | 27 class TranslateCompactInfoBar extends InfoBar |
27 implements TabLayout.OnTabSelectedListener, TranslateMenuHelper.Translat eMenuListener { | 28 implements TabLayout.OnTabSelectedListener, TranslateMenuHelper.Translat eMenuListener { |
28 public static final int TRANSLATING_INFOBAR = 1; | 29 public static final int TRANSLATING_INFOBAR = 1; |
29 | 30 |
30 private static final int SOURCE_TAB_INDEX = 0; | 31 private static final int SOURCE_TAB_INDEX = 0; |
31 private static final int TARGET_TAB_INDEX = 1; | 32 private static final int TARGET_TAB_INDEX = 1; |
32 | 33 |
33 private final int mInitialStep; | 34 private final int mInitialStep; |
34 private final TranslateOptions mOptions; | 35 private final TranslateOptions mOptions; |
35 | 36 |
36 private long mNativeTranslateInfoBarPtr; | 37 private long mNativeTranslateInfoBarPtr; |
37 private TranslateTabLayout mTabLayout; | 38 private TranslateTabLayout mTabLayout; |
38 | 39 |
40 private static final String INFOBAR_HISTOGRAM_TRANSLATE_LANGUAGE = | |
41 "Translate.Compact.Infobar.TranslateLanguage"; | |
42 private static final String INFOBAR_HISTOGRAM_MORE_LANGUAGES_LANGUAGE = | |
43 "Translate.Compact.Infobar.MoreLanguagesTranslateLang"; | |
44 private static final String INFOBAR_HISTOGRAM_PAGE_NOT_IN_LANGUAGE = | |
45 "Translate.Compact.Infobar.PageNotInLang"; | |
46 private static final String INFOBAR_HISTOGRAM_ALWAYS_TRANSLATE_LANGUAGE = | |
47 "Translate.Compact.Infobar.AlwaysTranslateLang"; | |
48 private static final String INFOBAR_HISTOGRAM_NEVER_TRANSLATE_LANGUAGE = | |
49 "Translate.Compact.Infobar.NeverTranslateLang"; | |
50 private static final String INFOBAR_HISTOGRAM = "Translate.Compact.Infobar.E vent"; | |
51 | |
52 /** | |
53 * This is used to back a UMA histogram, so it should be treated as | |
54 * append-only. The values should not be changed or reused, and | |
55 * INFOBAR_HISTOGRAM_BOUNDARY should be the last. | |
56 */ | |
57 private static final Integer INFOBAR_IMPRESSION = 0; | |
58 private static final Integer INFOBAR_TRANSLATE = 1; | |
59 private static final Integer INFOBAR_DECLINE = 2; | |
60 private static final Integer INFOBAR_OPTIONS = 3; | |
61 private static final Integer INFOBAR_MORE_LANGUAGES = 4; | |
62 private static final Integer INFOBAR_MORE_LANGUAGES_TRANSLATE = 5; | |
63 private static final Integer INFOBAR_PAGE_NOT_IN = 6; | |
64 private static final Integer INFOBAR_ALWAYS_TRANSLATE = 7; | |
65 private static final Integer INFOBAR_NEVER_TRANSLATE = 8; | |
66 private static final Integer INFOBAR_NEVER_TRANSLATE_SITE = 9; | |
67 private static final Integer INFOBAR_SCROLL_HIDE = 10; | |
68 private static final Integer INFOBAR_SCROLL_SHOW = 11; | |
69 private static final Integer INFOBAR_REVERT = 12; | |
70 private static final Integer INFOBAR_SNACKBAR_CANCEL_ALWAYS = 13; | |
71 private static final Integer INFOBAR_SNACKBAR_CANCEL_NEVER_SITE = 14; | |
72 private static final Integer INFOBAR_SNACKBAR_CANCEL_NEVER = 15; | |
73 private static final Integer INFOBAR_HISTOGRAM_BOUNDARY = 16; | |
74 | |
39 // Need 2 instances of TranslateMenuHelper to prevent a race condition bug w hich happens when | 75 // Need 2 instances of TranslateMenuHelper to prevent a race condition bug w hich happens when |
40 // showing language menu after dismissing overflow menu. | 76 // showing language menu after dismissing overflow menu. |
41 private TranslateMenuHelper mOverflowMenuHelper; | 77 private TranslateMenuHelper mOverflowMenuHelper; |
42 private TranslateMenuHelper mLanguageMenuHelper; | 78 private TranslateMenuHelper mLanguageMenuHelper; |
43 | 79 |
44 private TintedImageButton mMenuButton; | 80 private TintedImageButton mMenuButton; |
45 | 81 |
46 /** The controller for translate UI snackbars. */ | 82 /** The controller for translate UI snackbars. */ |
47 class TranslateSnackbarController implements SnackbarController { | 83 class TranslateSnackbarController implements SnackbarController { |
48 private final int mMenuItemId; | 84 private final int mMenuItemId; |
49 | 85 |
50 public TranslateSnackbarController(int menuItemId) { | 86 public TranslateSnackbarController(int menuItemId) { |
51 mMenuItemId = menuItemId; | 87 mMenuItemId = menuItemId; |
52 } | 88 } |
53 | 89 |
54 @Override | 90 @Override |
55 public void onDismissNoAction(Object actionData) { | 91 public void onDismissNoAction(Object actionData) { |
56 handleTranslateOptionPostSnackbar(mMenuItemId); | 92 handleTranslateOptionPostSnackbar(mMenuItemId); |
57 } | 93 } |
58 | 94 |
59 @Override | 95 @Override |
60 public void onAction(Object actionData) { | 96 public void onAction(Object actionData) { |
61 // TODO(ramyasharma): Add logging metric to track cancel actions. | 97 switch (mMenuItemId) { |
62 // Do nothing. | 98 case TranslateMenu.ID_OVERFLOW_ALWAYS_TRANSLATE: |
99 recordInfobarAction(INFOBAR_SNACKBAR_CANCEL_ALWAYS); | |
100 return; | |
101 case TranslateMenu.ID_OVERFLOW_NEVER_LANGUAGE: | |
102 recordInfobarAction(INFOBAR_SNACKBAR_CANCEL_NEVER); | |
103 return; | |
104 case TranslateMenu.ID_OVERFLOW_NEVER_SITE: | |
105 recordInfobarAction(INFOBAR_SNACKBAR_CANCEL_NEVER_SITE); | |
106 return; | |
107 } | |
63 } | 108 } |
64 }; | 109 }; |
65 | 110 |
66 @CalledByNative | 111 @CalledByNative |
67 private static InfoBar create(int initialStep, String sourceLanguageCode, | 112 private static InfoBar create(int initialStep, String sourceLanguageCode, |
68 String targetLanguageCode, boolean alwaysTranslate, boolean triggere dFromMenu, | 113 String targetLanguageCode, boolean alwaysTranslate, boolean triggere dFromMenu, |
69 String[] languages, String[] codes) { | 114 String[] languages, String[] codes) { |
115 recordInfobarAction(INFOBAR_IMPRESSION); | |
70 return new TranslateCompactInfoBar(initialStep, sourceLanguageCode, targ etLanguageCode, | 116 return new TranslateCompactInfoBar(initialStep, sourceLanguageCode, targ etLanguageCode, |
71 alwaysTranslate, triggeredFromMenu, languages, codes); | 117 alwaysTranslate, triggeredFromMenu, languages, codes); |
72 } | 118 } |
73 | 119 |
74 TranslateCompactInfoBar(int initialStep, String sourceLanguageCode, String t argetLanguageCode, | 120 TranslateCompactInfoBar(int initialStep, String sourceLanguageCode, String t argetLanguageCode, |
75 boolean alwaysTranslate, boolean triggeredFromMenu, String[] languag es, | 121 boolean alwaysTranslate, boolean triggeredFromMenu, String[] languag es, |
76 String[] codes) { | 122 String[] codes) { |
77 super(R.drawable.infobar_translate_compact, null, null); | 123 super(R.drawable.infobar_translate_compact, null, null); |
78 mInitialStep = initialStep; | 124 mInitialStep = initialStep; |
79 mOptions = TranslateOptions.create(sourceLanguageCode, targetLanguageCod e, languages, codes, | 125 mOptions = TranslateOptions.create(sourceLanguageCode, targetLanguageCod e, languages, codes, |
(...skipping 19 matching lines...) Expand all Loading... | |
99 mTabLayout.getTabAt(TARGET_TAB_INDEX).select(); | 145 mTabLayout.getTabAt(TARGET_TAB_INDEX).select(); |
100 mTabLayout.showProgressBarOnTab(TARGET_TAB_INDEX); | 146 mTabLayout.showProgressBarOnTab(TARGET_TAB_INDEX); |
101 } | 147 } |
102 | 148 |
103 mTabLayout.addOnTabSelectedListener(this); | 149 mTabLayout.addOnTabSelectedListener(this); |
104 | 150 |
105 mMenuButton = (TintedImageButton) content.findViewById(R.id.translate_in fobar_menu_button); | 151 mMenuButton = (TintedImageButton) content.findViewById(R.id.translate_in fobar_menu_button); |
106 mMenuButton.setOnClickListener(new OnClickListener() { | 152 mMenuButton.setOnClickListener(new OnClickListener() { |
107 @Override | 153 @Override |
108 public void onClick(View v) { | 154 public void onClick(View v) { |
155 recordInfobarAction(INFOBAR_OPTIONS); | |
109 initMenuHelper(TranslateMenu.MENU_OVERFLOW); | 156 initMenuHelper(TranslateMenu.MENU_OVERFLOW); |
110 mOverflowMenuHelper.show(TranslateMenu.MENU_OVERFLOW); | 157 mOverflowMenuHelper.show(TranslateMenu.MENU_OVERFLOW); |
111 } | 158 } |
112 }); | 159 }); |
113 | 160 |
114 parent.addContent(content, 1.0f); | 161 parent.addContent(content, 1.0f); |
115 } | 162 } |
116 | 163 |
117 private void initMenuHelper(int menuType) { | 164 private void initMenuHelper(int menuType) { |
118 switch (menuType) { | 165 switch (menuType) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
168 @Override | 215 @Override |
169 protected void onNativeDestroyed() { | 216 protected void onNativeDestroyed() { |
170 mNativeTranslateInfoBarPtr = 0; | 217 mNativeTranslateInfoBarPtr = 0; |
171 super.onNativeDestroyed(); | 218 super.onNativeDestroyed(); |
172 } | 219 } |
173 | 220 |
174 @Override | 221 @Override |
175 public void onTabSelected(TabLayout.Tab tab) { | 222 public void onTabSelected(TabLayout.Tab tab) { |
176 switch (tab.getPosition()) { | 223 switch (tab.getPosition()) { |
177 case SOURCE_TAB_INDEX: | 224 case SOURCE_TAB_INDEX: |
225 recordInfobarAction(INFOBAR_REVERT); | |
178 onButtonClicked(ActionType.TRANSLATE_SHOW_ORIGINAL); | 226 onButtonClicked(ActionType.TRANSLATE_SHOW_ORIGINAL); |
179 return; | 227 return; |
180 case TARGET_TAB_INDEX: | 228 case TARGET_TAB_INDEX: |
229 recordInfobarAction(INFOBAR_TRANSLATE); | |
230 RecordHistogram.recordSparseSlowlyHistogram( | |
231 INFOBAR_HISTOGRAM_TRANSLATE_LANGUAGE, mOptions.targetLan guage.hashCode()); | |
181 startTranslating(TARGET_TAB_INDEX); | 232 startTranslating(TARGET_TAB_INDEX); |
182 return; | 233 return; |
183 default: | 234 default: |
184 assert false : "Unexpected Tab Index"; | 235 assert false : "Unexpected Tab Index"; |
185 } | 236 } |
186 } | 237 } |
187 | 238 |
188 @Override | 239 @Override |
189 public void onTabUnselected(TabLayout.Tab tab) {} | 240 public void onTabUnselected(TabLayout.Tab tab) {} |
190 | 241 |
191 @Override | 242 @Override |
192 public void onTabReselected(TabLayout.Tab tab) {} | 243 public void onTabReselected(TabLayout.Tab tab) {} |
193 | 244 |
194 @Override | 245 @Override |
195 public void onOverflowMenuItemClicked(int itemId) { | 246 public void onOverflowMenuItemClicked(int itemId) { |
196 switch (itemId) { | 247 switch (itemId) { |
197 case TranslateMenu.ID_OVERFLOW_MORE_LANGUAGE: | 248 case TranslateMenu.ID_OVERFLOW_MORE_LANGUAGE: |
249 recordInfobarAction(INFOBAR_MORE_LANGUAGES); | |
198 initMenuHelper(TranslateMenu.MENU_TARGET_LANGUAGE); | 250 initMenuHelper(TranslateMenu.MENU_TARGET_LANGUAGE); |
199 mLanguageMenuHelper.show(TranslateMenu.MENU_TARGET_LANGUAGE); | 251 mLanguageMenuHelper.show(TranslateMenu.MENU_TARGET_LANGUAGE); |
200 return; | 252 return; |
201 case TranslateMenu.ID_OVERFLOW_ALWAYS_TRANSLATE: | 253 case TranslateMenu.ID_OVERFLOW_ALWAYS_TRANSLATE: |
254 recordInfobarAction(INFOBAR_ALWAYS_TRANSLATE); | |
255 RecordHistogram.recordSparseSlowlyHistogram( | |
256 INFOBAR_HISTOGRAM_ALWAYS_TRANSLATE_LANGUAGE, | |
257 mOptions.sourceLanguageCode().hashCode()); | |
202 // Only show snackbar when "Always Translate" is enabled. | 258 // Only show snackbar when "Always Translate" is enabled. |
203 if (!mOptions.alwaysTranslateLanguageState()) { | 259 if (!mOptions.alwaysTranslateLanguageState()) { |
204 createAndShowSnackbar( | 260 createAndShowSnackbar( |
205 getContext().getString(R.string.translate_snackbar_a lways_translate, | 261 getContext().getString(R.string.translate_snackbar_a lways_translate, |
206 mOptions.sourceLanguageName(), mOptions.targ etLanguageName()), | 262 mOptions.sourceLanguageName(), mOptions.targ etLanguageName()), |
207 Snackbar.UMA_TRANSLATE_ALWAYS, itemId); | 263 Snackbar.UMA_TRANSLATE_ALWAYS, itemId); |
208 } else { | 264 } else { |
209 handleTranslateOptionPostSnackbar(itemId); | 265 handleTranslateOptionPostSnackbar(itemId); |
210 } | 266 } |
211 return; | 267 return; |
212 case TranslateMenu.ID_OVERFLOW_NEVER_LANGUAGE: | 268 case TranslateMenu.ID_OVERFLOW_NEVER_LANGUAGE: |
269 recordInfobarAction(INFOBAR_NEVER_TRANSLATE); | |
270 RecordHistogram.recordSparseSlowlyHistogram( | |
271 INFOBAR_HISTOGRAM_NEVER_TRANSLATE_LANGUAGE, | |
272 mOptions.sourceLanguageCode().hashCode()); | |
213 createAndShowSnackbar( | 273 createAndShowSnackbar( |
214 getContext().getString(R.string.translate_snackbar_langu age_never, | 274 getContext().getString(R.string.translate_snackbar_langu age_never, |
215 mOptions.sourceLanguageName()), | 275 mOptions.sourceLanguageName()), |
216 Snackbar.UMA_TRANSLATE_NEVER, itemId); | 276 Snackbar.UMA_TRANSLATE_NEVER, itemId); |
217 return; | 277 return; |
218 case TranslateMenu.ID_OVERFLOW_NEVER_SITE: | 278 case TranslateMenu.ID_OVERFLOW_NEVER_SITE: |
279 recordInfobarAction(INFOBAR_NEVER_TRANSLATE_SITE); | |
219 createAndShowSnackbar( | 280 createAndShowSnackbar( |
220 getContext().getString(R.string.translate_snackbar_site_ never), | 281 getContext().getString(R.string.translate_snackbar_site_ never), |
221 Snackbar.UMA_TRANSLATE_NEVER_SITE, itemId); | 282 Snackbar.UMA_TRANSLATE_NEVER_SITE, itemId); |
222 return; | 283 return; |
223 case TranslateMenu.ID_OVERFLOW_NOT_THIS_LANGUAGE: | 284 case TranslateMenu.ID_OVERFLOW_NOT_THIS_LANGUAGE: |
285 recordInfobarAction(INFOBAR_PAGE_NOT_IN); | |
224 initMenuHelper(TranslateMenu.MENU_SOURCE_LANGUAGE); | 286 initMenuHelper(TranslateMenu.MENU_SOURCE_LANGUAGE); |
225 mLanguageMenuHelper.show(TranslateMenu.MENU_SOURCE_LANGUAGE); | 287 mLanguageMenuHelper.show(TranslateMenu.MENU_SOURCE_LANGUAGE); |
226 return; | 288 return; |
227 default: | 289 default: |
228 assert false : "Unexpected overflow menu code"; | 290 assert false : "Unexpected overflow menu code"; |
229 } | 291 } |
230 } | 292 } |
231 | 293 |
232 @Override | 294 @Override |
233 public void onTargetMenuItemClicked(String code) { | 295 public void onTargetMenuItemClicked(String code) { |
234 // Reset target code in both UI and native. | 296 // Reset target code in both UI and native. |
235 if (mOptions.setTargetLanguage(code)) { | 297 if (mOptions.setTargetLanguage(code)) { |
298 RecordHistogram.recordSparseSlowlyHistogram(INFOBAR_HISTOGRAM_MORE_L ANGUAGES_LANGUAGE, | |
299 mOptions.targetLanguageCode().hashCode()); | |
236 nativeApplyStringTranslateOption( | 300 nativeApplyStringTranslateOption( |
237 mNativeTranslateInfoBarPtr, TranslateOption.TARGET_CODE, cod e); | 301 mNativeTranslateInfoBarPtr, TranslateOption.TARGET_CODE, cod e); |
238 // Adjust UI. | 302 // Adjust UI. |
239 mTabLayout.replaceTabTitle(TARGET_TAB_INDEX, mOptions.getRepresentat ionFromCode(code)); | 303 mTabLayout.replaceTabTitle(TARGET_TAB_INDEX, mOptions.getRepresentat ionFromCode(code)); |
240 startTranslating(mTabLayout.getSelectedTabPosition()); | 304 startTranslating(mTabLayout.getSelectedTabPosition()); |
241 } | 305 } |
242 } | 306 } |
243 | 307 |
244 @Override | 308 @Override |
245 public void onSourceMenuItemClicked(String code) { | 309 public void onSourceMenuItemClicked(String code) { |
246 // Reset source code in both UI and native. | 310 // Reset source code in both UI and native. |
247 if (mOptions.setSourceLanguage(code)) { | 311 if (mOptions.setSourceLanguage(code)) { |
312 RecordHistogram.recordSparseSlowlyHistogram(INFOBAR_HISTOGRAM_PAGE_N OT_IN_LANGUAGE, | |
313 mOptions.sourceLanguageCode().hashCode()); | |
248 nativeApplyStringTranslateOption( | 314 nativeApplyStringTranslateOption( |
249 mNativeTranslateInfoBarPtr, TranslateOption.SOURCE_CODE, cod e); | 315 mNativeTranslateInfoBarPtr, TranslateOption.SOURCE_CODE, cod e); |
250 // Adjust UI. | 316 // Adjust UI. |
251 mTabLayout.replaceTabTitle(SOURCE_TAB_INDEX, mOptions.getRepresentat ionFromCode(code)); | 317 mTabLayout.replaceTabTitle(SOURCE_TAB_INDEX, mOptions.getRepresentat ionFromCode(code)); |
252 startTranslating(mTabLayout.getSelectedTabPosition()); | 318 startTranslating(mTabLayout.getSelectedTabPosition()); |
253 } | 319 } |
254 } | 320 } |
255 | 321 |
256 private void createAndShowSnackbar(String title, int umaType, int itemId) { | 322 private void createAndShowSnackbar(String title, int umaType, int itemId) { |
257 if (getSnackbarManager() == null) { | 323 if (getSnackbarManager() == null) { |
(...skipping 21 matching lines...) Expand all Loading... | |
279 nativeApplyBoolTranslateOption( | 345 nativeApplyBoolTranslateOption( |
280 mNativeTranslateInfoBarPtr, TranslateOption.NEVER_TRANSL ATE, true); | 346 mNativeTranslateInfoBarPtr, TranslateOption.NEVER_TRANSL ATE, true); |
281 return; | 347 return; |
282 case TranslateMenu.ID_OVERFLOW_NEVER_SITE: | 348 case TranslateMenu.ID_OVERFLOW_NEVER_SITE: |
283 nativeApplyBoolTranslateOption( | 349 nativeApplyBoolTranslateOption( |
284 mNativeTranslateInfoBarPtr, TranslateOption.NEVER_TRANSL ATE_SITE, true); | 350 mNativeTranslateInfoBarPtr, TranslateOption.NEVER_TRANSL ATE_SITE, true); |
285 return; | 351 return; |
286 } | 352 } |
287 } | 353 } |
288 | 354 |
355 private void recordInfobarAction(int action) { | |
Leo
2017/05/11 00:58:50
static
ramyasharma
2017/05/11 09:27:42
Done.
| |
356 RecordHistogram.recordEnumeratedHistogram( | |
357 INFOBAR_HISTOGRAM, action, INFOBAR_HISTOGRAM_BOUNDARY); | |
358 } | |
359 | |
289 private native void nativeApplyStringTranslateOption( | 360 private native void nativeApplyStringTranslateOption( |
290 long nativeTranslateCompactInfoBar, int option, String value); | 361 long nativeTranslateCompactInfoBar, int option, String value); |
291 private native void nativeApplyBoolTranslateOption( | 362 private native void nativeApplyBoolTranslateOption( |
292 long nativeTranslateCompactInfoBar, int option, boolean value); | 363 long nativeTranslateCompactInfoBar, int option, boolean value); |
293 } | 364 } |
OLD | NEW |