Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(321)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java

Issue 2873103003: Implements logging in the new compact translate UI. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | tools/metrics/histograms/enums.xml » ('j') | tools/metrics/histograms/histograms.xml » ('J')

Powered by Google App Engine
This is Rietveld 408576698