am ff80ee20: Merge "Modify isAllowedToLog"

* commit 'ff80ee20b4b7bf703e89660a68f50975a5cec2a5':
  Modify isAllowedToLog
main
Kurt Partridge 2013-05-21 14:24:40 -07:00 committed by Android Git Automerger
commit e3a72c9b4f
3 changed files with 71 additions and 6 deletions

View File

@ -0,0 +1,32 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.inputmethod.research;
import android.content.Context;
import java.io.File;
public class FeedbackLog extends ResearchLog {
public FeedbackLog(final File outputFile, final Context context) {
super(outputFile, context);
}
@Override
public boolean isFeedbackLog() {
return true;
}
}

View File

@ -80,6 +80,17 @@ public class ResearchLog {
mContext = context; mContext = context;
} }
/**
* Returns true if this is a FeedbackLog.
*
* FeedbackLogs record only the data associated with a Feedback dialog. Instead of normal
* logging, they contain a LogStatement with the complete feedback string and optionally a
* recording of the user's supplied demo of the problem.
*/
public boolean isFeedbackLog() {
return false;
}
/** /**
* Waits for any publication requests to finish and closes the {@link JsonWriter} used for * Waits for any publication requests to finish and closes the {@link JsonWriter} used for
* output. * output.

View File

@ -194,6 +194,8 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
// gesture, and when committing the earlier word, split the LogUnit. // gesture, and when committing the earlier word, split the LogUnit.
private long mSavedDownEventTime; private long mSavedDownEventTime;
private Bundle mFeedbackDialogBundle = null; private Bundle mFeedbackDialogBundle = null;
// Whether the feedback dialog is visible, and the user is typing into it. Normal logging is
// not performed on text that the user types into the feedback dialog.
private boolean mInFeedbackDialog = false; private boolean mInFeedbackDialog = false;
private Handler mUserRecordingTimeoutHandler; private Handler mUserRecordingTimeoutHandler;
private static final long USER_RECORDING_TIMEOUT_MS = 30L * DateUtils.SECOND_IN_MILLIS; private static final long USER_RECORDING_TIMEOUT_MS = 30L * DateUtils.SECOND_IN_MILLIS;
@ -655,7 +657,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
feedbackLogUnit.addLogStatement(LOGSTATEMENT_FEEDBACK, SystemClock.uptimeMillis(), feedbackLogUnit.addLogStatement(LOGSTATEMENT_FEEDBACK, SystemClock.uptimeMillis(),
feedbackContents, accountName, recording); feedbackContents, accountName, recording);
final ResearchLog feedbackLog = new ResearchLog(mResearchLogDirectory.getLogFilePath( final ResearchLog feedbackLog = new FeedbackLog(mResearchLogDirectory.getLogFilePath(
System.currentTimeMillis(), System.nanoTime()), mLatinIME); System.currentTimeMillis(), System.nanoTime()), mLatinIME);
final LogBuffer feedbackLogBuffer = new LogBuffer(); final LogBuffer feedbackLogBuffer = new LogBuffer();
feedbackLogBuffer.shiftIn(feedbackLogUnit); feedbackLogBuffer.shiftIn(feedbackLogUnit);
@ -718,8 +720,28 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
mIsPasswordView = isPasswordView; mIsPasswordView = isPasswordView;
} }
private boolean isAllowedToLog() { /**
return !mIsPasswordView && sIsLogging && !mInFeedbackDialog; * Returns true if logging is permitted.
*
* This method is called when adding a LogStatement to a LogUnit, and when adding a LogUnit to a
* ResearchLog. It is checked in both places in case conditions change between these times, and
* as a defensive measure in case refactoring changes the logging pipeline.
*/
private boolean isAllowedToLogTo(final ResearchLog researchLog) {
// Logging is never allowed in these circumstances
if (mIsPasswordView) return false;
if (!sIsLogging) return false;
if (mInFeedbackDialog) {
// The FeedbackDialog is up. Normal logging should not happen (the user might be trying
// out things while the dialog is up, and their reporting of an issue may not be
// representative of what they normally type). However, after the user has finished
// entering their feedback, the logger packs their comments and an encoded version of
// any demonstration of the issue into a special "FeedbackLog". So if the FeedbackLog
// is the destination, we do want to allow logging to it.
return researchLog.isFeedbackLog();
}
// No other exclusions. Logging is permitted.
return true;
} }
public void requestIndicatorRedraw() { public void requestIndicatorRedraw() {
@ -752,7 +774,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
// and remove this method. // and remove this method.
// The check for MainKeyboardView ensures that the indicator only decorates the main // The check for MainKeyboardView ensures that the indicator only decorates the main
// keyboard, not every keyboard. // keyboard, not every keyboard.
if (IS_SHOWING_INDICATOR && (isAllowedToLog() || isReplaying()) if (IS_SHOWING_INDICATOR && (isAllowedToLogTo(mMainResearchLog) || isReplaying())
&& view instanceof MainKeyboardView) { && view instanceof MainKeyboardView) {
final int savedColor = paint.getColor(); final int savedColor = paint.getColor();
paint.setColor(getIndicatorColor()); paint.setColor(getIndicatorColor());
@ -787,7 +809,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
private synchronized void enqueueEvent(final LogUnit logUnit, final LogStatement logStatement, private synchronized void enqueueEvent(final LogUnit logUnit, final LogStatement logStatement,
final Object... values) { final Object... values) {
assert values.length == logStatement.getKeys().length; assert values.length == logStatement.getKeys().length;
if (isAllowedToLog() && logUnit != null) { if (isAllowedToLogTo(mMainResearchLog) && logUnit != null) {
final long time = SystemClock.uptimeMillis(); final long time = SystemClock.uptimeMillis();
logUnit.addLogStatement(logStatement, time, values); logUnit.addLogStatement(logStatement, time, values);
} }
@ -886,7 +908,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
final ResearchLog researchLog, final boolean canIncludePrivateData) { final ResearchLog researchLog, final boolean canIncludePrivateData) {
final LogUnit openingLogUnit = new LogUnit(); final LogUnit openingLogUnit = new LogUnit();
if (logUnits.isEmpty()) return; if (logUnits.isEmpty()) return;
if (!isAllowedToLog()) return; if (!isAllowedToLogTo(researchLog)) return;
// LogUnits not containing private data, such as contextual data for the log, do not require // LogUnits not containing private data, such as contextual data for the log, do not require
// logSegment boundary statements. // logSegment boundary statements.
if (canIncludePrivateData) { if (canIncludePrivateData) {