Merge "Logs the activated session duration for magnification. (2/2)" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
1c5d9e0c4c
@@ -167,6 +167,17 @@ public final class AccessibilityStatsLogUtils {
|
|||||||
convertToLoggingMagnificationMode(mode));
|
convertToLoggingMagnificationMode(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs the duration for the window magnifier's following typing focus session.
|
||||||
|
*
|
||||||
|
* @param duration The duration of a triple-tap-and-hold activation session.
|
||||||
|
*/
|
||||||
|
public static void logMagnificationFollowTypingFocusSession(long duration) {
|
||||||
|
FrameworkStatsLog.write(
|
||||||
|
FrameworkStatsLog.MAGNIFICATION_FOLLOW_TYPING_FOCUS_ACTIVATED_SESSION_REPORTED,
|
||||||
|
duration);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs the duration for the magnification session which is activated by the triple tap and
|
* Logs the duration for the magnification session which is activated by the triple tap and
|
||||||
* hold gesture.
|
* hold gesture.
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ import android.view.accessibility.IWindowMagnificationConnection;
|
|||||||
import android.view.accessibility.IWindowMagnificationConnectionCallback;
|
import android.view.accessibility.IWindowMagnificationConnectionCallback;
|
||||||
import android.view.accessibility.MagnificationAnimationCallback;
|
import android.view.accessibility.MagnificationAnimationCallback;
|
||||||
|
|
||||||
|
import com.android.internal.accessibility.util.AccessibilityStatsLogUtils;
|
||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.server.LocalServices;
|
import com.android.server.LocalServices;
|
||||||
@@ -54,6 +55,7 @@ import com.android.server.wm.WindowManagerInternal;
|
|||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class to manipulate window magnification through {@link WindowMagnificationConnectionWrapper}
|
* A class to manipulate window magnification through {@link WindowMagnificationConnectionWrapper}
|
||||||
@@ -136,6 +138,7 @@ public class WindowMagnificationManager implements
|
|||||||
private SparseArray<WindowMagnifier> mWindowMagnifiers = new SparseArray<>();
|
private SparseArray<WindowMagnifier> mWindowMagnifiers = new SparseArray<>();
|
||||||
// Whether the following typing focus feature for magnification is enabled.
|
// Whether the following typing focus feature for magnification is enabled.
|
||||||
private boolean mMagnificationFollowTypingEnabled = true;
|
private boolean mMagnificationFollowTypingEnabled = true;
|
||||||
|
@GuardedBy("mLock")
|
||||||
private final SparseBooleanArray mIsImeVisibleArray = new SparseBooleanArray();
|
private final SparseBooleanArray mIsImeVisibleArray = new SparseBooleanArray();
|
||||||
|
|
||||||
private boolean mReceiverRegistered = false;
|
private boolean mReceiverRegistered = false;
|
||||||
@@ -465,18 +468,43 @@ public class WindowMagnificationManager implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void pauseTrackingTypingFocusRecord(int displayId) {
|
||||||
|
WindowMagnifier magnifier;
|
||||||
|
synchronized (mLock) {
|
||||||
|
magnifier = mWindowMagnifiers.get(displayId);
|
||||||
|
if (magnifier == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
magnifier.pauseTrackingTypingFocusRecord();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the IME window visibility changed.
|
* Called when the IME window visibility changed.
|
||||||
*
|
*
|
||||||
* @param shown {@code true} means the IME window shows on the screen. Otherwise, it's hidden.
|
* @param shown {@code true} means the IME window shows on the screen. Otherwise, it's hidden.
|
||||||
*/
|
*/
|
||||||
void onImeWindowVisibilityChanged(int displayId, boolean shown) {
|
void onImeWindowVisibilityChanged(int displayId, boolean shown) {
|
||||||
mIsImeVisibleArray.put(displayId, shown);
|
synchronized (mLock) {
|
||||||
|
mIsImeVisibleArray.put(displayId, shown);
|
||||||
|
}
|
||||||
if (shown) {
|
if (shown) {
|
||||||
enableAllTrackingTypingFocus();
|
enableAllTrackingTypingFocus();
|
||||||
|
} else {
|
||||||
|
pauseTrackingTypingFocusRecord(displayId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isImeVisible(int displayId) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
return mIsImeVisibleArray.get(displayId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void logTrackingTypingFocus(long duration) {
|
||||||
|
AccessibilityStatsLogUtils.logMagnificationFollowTypingFocusSession(duration);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean processScroll(int displayId, float distanceX, float distanceY) {
|
public boolean processScroll(int displayId, float distanceX, float distanceY) {
|
||||||
moveWindowMagnification(displayId, -distanceX, -distanceY);
|
moveWindowMagnification(displayId, -distanceX, -distanceY);
|
||||||
@@ -969,6 +997,12 @@ public class WindowMagnificationManager implements
|
|||||||
|
|
||||||
private boolean mTrackingTypingFocusEnabled = true;
|
private boolean mTrackingTypingFocusEnabled = true;
|
||||||
|
|
||||||
|
private volatile long mTrackingTypingFocusStartTime = 0;
|
||||||
|
private static final AtomicLongFieldUpdater<WindowMagnifier> SUM_TIME_UPDATER =
|
||||||
|
AtomicLongFieldUpdater.newUpdater(WindowMagnifier.class,
|
||||||
|
"mTrackingTypingFocusSumTime");
|
||||||
|
private volatile long mTrackingTypingFocusSumTime = 0;
|
||||||
|
|
||||||
WindowMagnifier(int displayId, WindowMagnificationManager windowMagnificationManager) {
|
WindowMagnifier(int displayId, WindowMagnificationManager windowMagnificationManager) {
|
||||||
mDisplayId = displayId;
|
mDisplayId = displayId;
|
||||||
mWindowMagnificationManager = windowMagnificationManager;
|
mWindowMagnificationManager = windowMagnificationManager;
|
||||||
@@ -1017,6 +1051,7 @@ public class WindowMagnificationManager implements
|
|||||||
mEnabled = false;
|
mEnabled = false;
|
||||||
mIdOfLastServiceToControl = INVALID_SERVICE_ID;
|
mIdOfLastServiceToControl = INVALID_SERVICE_ID;
|
||||||
mTrackingTypingFocusEnabled = false;
|
mTrackingTypingFocusEnabled = false;
|
||||||
|
pauseTrackingTypingFocusRecord();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -1069,6 +1104,14 @@ public class WindowMagnificationManager implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setTrackingTypingFocusEnabled(boolean trackingTypingFocusEnabled) {
|
void setTrackingTypingFocusEnabled(boolean trackingTypingFocusEnabled) {
|
||||||
|
if (mWindowMagnificationManager.isWindowMagnifierEnabled(mDisplayId)
|
||||||
|
&& mWindowMagnificationManager.isImeVisible(mDisplayId)
|
||||||
|
&& trackingTypingFocusEnabled) {
|
||||||
|
startTrackingTypingFocusRecord();
|
||||||
|
}
|
||||||
|
if (mTrackingTypingFocusEnabled && !trackingTypingFocusEnabled) {
|
||||||
|
stopAndLogTrackingTypingFocusRecordIfNeeded();
|
||||||
|
}
|
||||||
mTrackingTypingFocusEnabled = trackingTypingFocusEnabled;
|
mTrackingTypingFocusEnabled = trackingTypingFocusEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1076,6 +1119,44 @@ public class WindowMagnificationManager implements
|
|||||||
return mTrackingTypingFocusEnabled;
|
return mTrackingTypingFocusEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void startTrackingTypingFocusRecord() {
|
||||||
|
if (mTrackingTypingFocusStartTime == 0) {
|
||||||
|
mTrackingTypingFocusStartTime = SystemClock.uptimeMillis();
|
||||||
|
if (DBG) {
|
||||||
|
Slog.d(TAG, "start: mTrackingTypingFocusStartTime = "
|
||||||
|
+ mTrackingTypingFocusStartTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pauseTrackingTypingFocusRecord() {
|
||||||
|
if (mTrackingTypingFocusStartTime != 0) {
|
||||||
|
final long elapsed = (SystemClock.uptimeMillis() - mTrackingTypingFocusStartTime);
|
||||||
|
// update mTrackingTypingFocusSumTime value in an atomic operation
|
||||||
|
SUM_TIME_UPDATER.addAndGet(this, elapsed);
|
||||||
|
mTrackingTypingFocusStartTime = 0;
|
||||||
|
if (DBG) {
|
||||||
|
Slog.d(TAG, "pause: mTrackingTypingFocusSumTime = "
|
||||||
|
+ mTrackingTypingFocusSumTime + ", elapsed = " + elapsed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void stopAndLogTrackingTypingFocusRecordIfNeeded() {
|
||||||
|
if (mTrackingTypingFocusStartTime != 0 || mTrackingTypingFocusSumTime != 0) {
|
||||||
|
final long elapsed = mTrackingTypingFocusStartTime != 0
|
||||||
|
? (SystemClock.uptimeMillis() - mTrackingTypingFocusStartTime) : 0;
|
||||||
|
final long duration = mTrackingTypingFocusSumTime + elapsed;
|
||||||
|
if (DBG) {
|
||||||
|
Slog.d(TAG, "stop and log: session duration = " + duration
|
||||||
|
+ ", elapsed = " + elapsed);
|
||||||
|
}
|
||||||
|
mWindowMagnificationManager.logTrackingTypingFocus(duration);
|
||||||
|
mTrackingTypingFocusStartTime = 0;
|
||||||
|
mTrackingTypingFocusSumTime = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
boolean isEnabled() {
|
boolean isEnabled() {
|
||||||
return mEnabled;
|
return mEnabled;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,10 +23,12 @@ import static org.mockito.ArgumentMatchers.any;
|
|||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
import static org.mockito.ArgumentMatchers.anyFloat;
|
import static org.mockito.ArgumentMatchers.anyFloat;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyLong;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.ArgumentMatchers.notNull;
|
import static org.mockito.ArgumentMatchers.notNull;
|
||||||
import static org.mockito.Mockito.doAnswer;
|
import static org.mockito.Mockito.doAnswer;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
@@ -292,6 +294,17 @@ public class WindowMagnificationManagerTest {
|
|||||||
MagnificationScaleProvider.MAX_SCALE);
|
MagnificationScaleProvider.MAX_SCALE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void logTrackingTypingFocus_processScroll_logDuration() {
|
||||||
|
WindowMagnificationManager spyWindowMagnificationManager = spy(mWindowMagnificationManager);
|
||||||
|
spyWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
|
||||||
|
spyWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, /* shown */ true);
|
||||||
|
|
||||||
|
spyWindowMagnificationManager.processScroll(TEST_DISPLAY, 10f, 10f);
|
||||||
|
|
||||||
|
verify(spyWindowMagnificationManager).logTrackingTypingFocus(anyLong());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onRectangleOnScreenRequested_trackingDisabledByOnDrag_withoutMovingMagnifier()
|
public void onRectangleOnScreenRequested_trackingDisabledByOnDrag_withoutMovingMagnifier()
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
|
|||||||
Reference in New Issue
Block a user