Fix the over-calling of VoiceSearch Logging
bug: 3035228 This change will reduce the number of times VoiceSearch app is called to log IME events. This is because it 1) only flushes the logs when there is relevant logging information available and 2) sets a flag in UserHappinessSignals so that other apps (eg: gmail/sms) can know if there is relevant logging information before sending the logging intent to voice search. Change-Id: I708fea5a38f854091f1101e4f6a3db46296f3e92main
parent
c2d7ac79bd
commit
a5a5ffc0dc
|
@ -17,6 +17,7 @@
|
||||||
package com.android.inputmethod.voice;
|
package com.android.inputmethod.voice;
|
||||||
|
|
||||||
import com.android.common.speech.LoggingEvents;
|
import com.android.common.speech.LoggingEvents;
|
||||||
|
import com.android.common.userhappiness.UserHappinessSignals;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
@ -33,13 +34,17 @@ public class VoiceInputLogger {
|
||||||
private static final String TAG = VoiceInputLogger.class.getSimpleName();
|
private static final String TAG = VoiceInputLogger.class.getSimpleName();
|
||||||
|
|
||||||
private static VoiceInputLogger sVoiceInputLogger;
|
private static VoiceInputLogger sVoiceInputLogger;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
|
|
||||||
// The base intent used to form all broadcast intents to the logger
|
// The base intent used to form all broadcast intents to the logger
|
||||||
// in VoiceSearch.
|
// in VoiceSearch.
|
||||||
private final Intent mBaseIntent;
|
private final Intent mBaseIntent;
|
||||||
|
|
||||||
|
// This flag is used to indicate when there are voice events that
|
||||||
|
// need to be flushed.
|
||||||
|
private boolean mHasLoggingInfo = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the singleton of the logger.
|
* Returns the singleton of the logger.
|
||||||
*
|
*
|
||||||
|
@ -67,79 +72,97 @@ public class VoiceInputLogger {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void flush() {
|
public void flush() {
|
||||||
Intent i = new Intent(mBaseIntent);
|
if (hasLoggingInfo()) {
|
||||||
i.putExtra(LoggingEvents.EXTRA_FLUSH, true);
|
Intent i = new Intent(mBaseIntent);
|
||||||
mContext.sendBroadcast(i);
|
i.putExtra(LoggingEvents.EXTRA_FLUSH, true);
|
||||||
|
mContext.sendBroadcast(i);
|
||||||
|
setHasLoggingInfo(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void keyboardWarningDialogShown() {
|
public void keyboardWarningDialogShown() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_SHOWN));
|
LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_SHOWN));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void keyboardWarningDialogDismissed() {
|
public void keyboardWarningDialogDismissed() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_DISMISSED));
|
LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_DISMISSED));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void keyboardWarningDialogOk() {
|
public void keyboardWarningDialogOk() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_OK));
|
LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_OK));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void keyboardWarningDialogCancel() {
|
public void keyboardWarningDialogCancel() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_CANCEL));
|
LoggingEvents.VoiceIme.KEYBOARD_WARNING_DIALOG_CANCEL));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void settingsWarningDialogShown() {
|
public void settingsWarningDialogShown() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_SHOWN));
|
LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_SHOWN));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void settingsWarningDialogDismissed() {
|
public void settingsWarningDialogDismissed() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_DISMISSED));
|
LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_DISMISSED));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void settingsWarningDialogOk() {
|
public void settingsWarningDialogOk() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_OK));
|
LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_OK));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void settingsWarningDialogCancel() {
|
public void settingsWarningDialogCancel() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_CANCEL));
|
LoggingEvents.VoiceIme.SETTINGS_WARNING_DIALOG_CANCEL));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void swipeHintDisplayed() {
|
public void swipeHintDisplayed() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.SWIPE_HINT_DISPLAYED));
|
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.SWIPE_HINT_DISPLAYED));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancelDuringListening() {
|
public void cancelDuringListening() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.CANCEL_DURING_LISTENING));
|
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.CANCEL_DURING_LISTENING));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancelDuringWorking() {
|
public void cancelDuringWorking() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.CANCEL_DURING_WORKING));
|
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.CANCEL_DURING_WORKING));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancelDuringError() {
|
public void cancelDuringError() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.CANCEL_DURING_ERROR));
|
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.CANCEL_DURING_ERROR));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void punctuationHintDisplayed() {
|
public void punctuationHintDisplayed() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.PUNCTUATION_HINT_DISPLAYED));
|
LoggingEvents.VoiceIme.PUNCTUATION_HINT_DISPLAYED));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void error(int code) {
|
public void error(int code) {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.ERROR);
|
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.ERROR);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_ERROR_CODE, code);
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_ERROR_CODE, code);
|
||||||
mContext.sendBroadcast(i);
|
mContext.sendBroadcast(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start(String locale, boolean swipe) {
|
public void start(String locale, boolean swipe) {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.START);
|
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.START);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_START_LOCALE, locale);
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_START_LOCALE, locale);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_START_SWIPE, swipe);
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_START_SWIPE, swipe);
|
||||||
|
@ -148,12 +171,14 @@ public class VoiceInputLogger {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void voiceInputDelivered(int length) {
|
public void voiceInputDelivered(int length) {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.VOICE_INPUT_DELIVERED);
|
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.VOICE_INPUT_DELIVERED);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
||||||
mContext.sendBroadcast(i);
|
mContext.sendBroadcast(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void textModifiedByTypingInsertion(int length) {
|
public void textModifiedByTypingInsertion(int length) {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
|
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
|
||||||
|
@ -162,6 +187,7 @@ public class VoiceInputLogger {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void textModifiedByTypingInsertionPunctuation(int length) {
|
public void textModifiedByTypingInsertionPunctuation(int length) {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
|
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
|
||||||
|
@ -170,6 +196,7 @@ public class VoiceInputLogger {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void textModifiedByTypingDeletion(int length) {
|
public void textModifiedByTypingDeletion(int length) {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
|
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
|
||||||
|
@ -179,6 +206,7 @@ public class VoiceInputLogger {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void textModifiedByChooseSuggestion(int length) {
|
public void textModifiedByChooseSuggestion(int length) {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
|
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.TEXT_MODIFIED);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_LENGTH, length);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_TEXT_MODIFIED_TYPE,
|
||||||
|
@ -187,22 +215,52 @@ public class VoiceInputLogger {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void nBestChoose(int index) {
|
public void nBestChoose(int index) {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.N_BEST_CHOOSE);
|
Intent i = newLoggingBroadcast(LoggingEvents.VoiceIme.N_BEST_CHOOSE);
|
||||||
i.putExtra(LoggingEvents.VoiceIme.EXTRA_N_BEST_CHOOSE_INDEX, index);
|
i.putExtra(LoggingEvents.VoiceIme.EXTRA_N_BEST_CHOOSE_INDEX, index);
|
||||||
mContext.sendBroadcast(i);
|
mContext.sendBroadcast(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void inputEnded() {
|
public void inputEnded() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.INPUT_ENDED));
|
mContext.sendBroadcast(newLoggingBroadcast(LoggingEvents.VoiceIme.INPUT_ENDED));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void voiceInputSettingEnabled() {
|
public void voiceInputSettingEnabled() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.VOICE_INPUT_SETTING_ENABLED));
|
LoggingEvents.VoiceIme.VOICE_INPUT_SETTING_ENABLED));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void voiceInputSettingDisabled() {
|
public void voiceInputSettingDisabled() {
|
||||||
|
setHasLoggingInfo(true);
|
||||||
mContext.sendBroadcast(newLoggingBroadcast(
|
mContext.sendBroadcast(newLoggingBroadcast(
|
||||||
LoggingEvents.VoiceIme.VOICE_INPUT_SETTING_DISABLED));
|
LoggingEvents.VoiceIme.VOICE_INPUT_SETTING_DISABLED));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setHasLoggingInfo(boolean hasLoggingInfo) {
|
||||||
|
mHasLoggingInfo = hasLoggingInfo;
|
||||||
|
// If applications that call UserHappinessSignals.userAcceptedImeText
|
||||||
|
// make that call after VoiceInputLogger.flush() calls this method with false, we
|
||||||
|
// will lose those happiness signals. For example, consider the gmail sequence:
|
||||||
|
// 1. compose message
|
||||||
|
// 2. speak message into message field
|
||||||
|
// 3. type subject into subject field
|
||||||
|
// 4. press send
|
||||||
|
// We will NOT get the signal that the user accepted the voice inputted message text
|
||||||
|
// because when the user tapped on the subject field, the ime's flush will be triggered
|
||||||
|
// and the hasLoggingInfo will be then set to false. So by the time the user hits send
|
||||||
|
// we have essentially forgotten about any voice input.
|
||||||
|
// However the following (more common) use case is properly logged
|
||||||
|
// 1. compose message
|
||||||
|
// 2. type subject in subject field
|
||||||
|
// 3. speak message in message field
|
||||||
|
// 4. press send
|
||||||
|
UserHappinessSignals.setHasVoiceLoggingInfo(hasLoggingInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasLoggingInfo(){
|
||||||
|
return mHasLoggingInfo;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue