Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
P
platform_frameworks_base
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Dhina17
platform_frameworks_base
Commits
05508e57
Commit
05508e57
authored
1 year ago
by
Antonio Kantek
Committed by
Android (Google) Code Review
1 year ago
Browse files
Options
Downloads
Plain Diff
Merge "Avoid synchronization at method level in ImeTrackerService" into main
parents
b08d95b7
5cacb673
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
services/core/java/com/android/server/inputmethod/ImeTrackerService.java
+64
-44
64 additions, 44 deletions
...ava/com/android/server/inputmethod/ImeTrackerService.java
with
64 additions
and
44 deletions
services/core/java/com/android/server/inputmethod/ImeTrackerService.java
+
64
−
44
View file @
05508e57
...
...
@@ -60,84 +60,99 @@ public final class ImeTrackerService extends IImeTracker.Stub {
private
static
final
long
TIMEOUT_MS
=
10_000
;
/** Handler for registering timeouts for live entries. */
@GuardedBy
(
"mLock"
)
private
final
Handler
mHandler
;
/** Singleton instance of the History. */
@GuardedBy
(
"
ImeTrackerService.this
"
)
@GuardedBy
(
"
mLock
"
)
private
final
History
mHistory
=
new
History
();
private
final
Object
mLock
=
new
Object
();
ImeTrackerService
(
@NonNull
Looper
looper
)
{
mHandler
=
new
Handler
(
looper
,
null
/* callback */
,
true
/* async */
);
}
@NonNull
@Override
public
synchronized
ImeTracker
.
Token
onRequestShow
(
@NonNull
String
tag
,
int
uid
,
public
ImeTracker
.
Token
onRequestShow
(
@NonNull
String
tag
,
int
uid
,
@ImeTracker
.
Origin
int
origin
,
@SoftInputShowHideReason
int
reason
)
{
final
var
binder
=
new
Binder
();
final
var
token
=
new
ImeTracker
.
Token
(
binder
,
tag
);
final
var
entry
=
new
History
.
Entry
(
tag
,
uid
,
ImeTracker
.
TYPE_SHOW
,
ImeTracker
.
STATUS_RUN
,
origin
,
reason
);
mHistory
.
addEntry
(
binder
,
entry
);
// Register a delayed task to handle the case where the new entry times out.
mHandler
.
postDelayed
(()
->
{
synchronized
(
ImeTrackerService
.
this
)
{
mHistory
.
setFinished
(
token
,
ImeTracker
.
STATUS_TIMEOUT
,
ImeTracker
.
PHASE_NOT_SET
);
}
},
TIMEOUT_MS
);
synchronized
(
mLock
)
{
mHistory
.
addEntry
(
binder
,
entry
);
// Register a delayed task to handle the case where the new entry times out.
mHandler
.
postDelayed
(()
->
{
synchronized
(
mLock
)
{
mHistory
.
setFinished
(
token
,
ImeTracker
.
STATUS_TIMEOUT
,
ImeTracker
.
PHASE_NOT_SET
);
}
},
TIMEOUT_MS
);
}
return
token
;
}
@NonNull
@Override
public
synchronized
ImeTracker
.
Token
onRequestHide
(
@NonNull
String
tag
,
int
uid
,
public
ImeTracker
.
Token
onRequestHide
(
@NonNull
String
tag
,
int
uid
,
@ImeTracker
.
Origin
int
origin
,
@SoftInputShowHideReason
int
reason
)
{
final
var
binder
=
new
Binder
();
final
var
token
=
new
ImeTracker
.
Token
(
binder
,
tag
);
final
var
entry
=
new
History
.
Entry
(
tag
,
uid
,
ImeTracker
.
TYPE_HIDE
,
ImeTracker
.
STATUS_RUN
,
origin
,
reason
);
mHistory
.
addEntry
(
binder
,
entry
);
// Register a delayed task to handle the case where the new entry times out.
mHandler
.
postDelayed
(()
->
{
synchronized
(
ImeTrackerService
.
this
)
{
mHistory
.
setFinished
(
token
,
ImeTracker
.
STATUS_TIMEOUT
,
ImeTracker
.
PHASE_NOT_SET
);
}
},
TIMEOUT_MS
);
synchronized
(
mLock
)
{
mHistory
.
addEntry
(
binder
,
entry
);
// Register a delayed task to handle the case where the new entry times out.
mHandler
.
postDelayed
(()
->
{
synchronized
(
mLock
)
{
mHistory
.
setFinished
(
token
,
ImeTracker
.
STATUS_TIMEOUT
,
ImeTracker
.
PHASE_NOT_SET
);
}
},
TIMEOUT_MS
);
}
return
token
;
}
@Override
public
synchronized
void
onProgress
(
@NonNull
IBinder
binder
,
@ImeTracker
.
Phase
int
phase
)
{
final
var
entry
=
mHistory
.
getEntry
(
binder
);
if
(
entry
==
null
)
return
;
public
void
onProgress
(
@NonNull
IBinder
binder
,
@ImeTracker
.
Phase
int
phase
)
{
synchronized
(
mLock
)
{
final
var
entry
=
mHistory
.
getEntry
(
binder
);
if
(
entry
==
null
)
return
;
entry
.
mPhase
=
phase
;
entry
.
mPhase
=
phase
;
}
}
@Override
public
synchronized
void
onFailed
(
@NonNull
ImeTracker
.
Token
statsToken
,
@ImeTracker
.
Phase
int
phase
)
{
mHistory
.
setFinished
(
statsToken
,
ImeTracker
.
STATUS_FAIL
,
phase
);
public
void
onFailed
(
@NonNull
ImeTracker
.
Token
statsToken
,
@ImeTracker
.
Phase
int
phase
)
{
synchronized
(
mLock
)
{
mHistory
.
setFinished
(
statsToken
,
ImeTracker
.
STATUS_FAIL
,
phase
);
}
}
@Override
public
synchronized
void
onCancelled
(
@NonNull
ImeTracker
.
Token
statsToken
,
@ImeTracker
.
Phase
int
phase
)
{
mHistory
.
setFinished
(
statsToken
,
ImeTracker
.
STATUS_CANCEL
,
phase
);
public
void
onCancelled
(
@NonNull
ImeTracker
.
Token
statsToken
,
@ImeTracker
.
Phase
int
phase
)
{
synchronized
(
mLock
)
{
mHistory
.
setFinished
(
statsToken
,
ImeTracker
.
STATUS_CANCEL
,
phase
);
}
}
@Override
public
synchronized
void
onShown
(
@NonNull
ImeTracker
.
Token
statsToken
)
{
mHistory
.
setFinished
(
statsToken
,
ImeTracker
.
STATUS_SUCCESS
,
ImeTracker
.
PHASE_NOT_SET
);
public
void
onShown
(
@NonNull
ImeTracker
.
Token
statsToken
)
{
synchronized
(
mLock
)
{
mHistory
.
setFinished
(
statsToken
,
ImeTracker
.
STATUS_SUCCESS
,
ImeTracker
.
PHASE_NOT_SET
);
}
}
@Override
public
synchronized
void
onHidden
(
@NonNull
ImeTracker
.
Token
statsToken
)
{
mHistory
.
setFinished
(
statsToken
,
ImeTracker
.
STATUS_SUCCESS
,
ImeTracker
.
PHASE_NOT_SET
);
public
void
onHidden
(
@NonNull
ImeTracker
.
Token
statsToken
)
{
synchronized
(
mLock
)
{
mHistory
.
setFinished
(
statsToken
,
ImeTracker
.
STATUS_SUCCESS
,
ImeTracker
.
PHASE_NOT_SET
);
}
}
/**
...
...
@@ -146,25 +161,30 @@ public final class ImeTrackerService extends IImeTracker.Stub {
* @param statsToken the token corresponding to the current IME request.
* @param requestWindowName the name of the window that created the IME request.
*/
public
synchronized
void
onImmsUpdate
(
@NonNull
ImeTracker
.
Token
statsToken
,
public
void
onImmsUpdate
(
@NonNull
ImeTracker
.
Token
statsToken
,
@NonNull
String
requestWindowName
)
{
final
var
entry
=
mHistory
.
getEntry
(
statsToken
.
getBinder
());
if
(
entry
==
null
)
return
;
synchronized
(
mLock
)
{
final
var
entry
=
mHistory
.
getEntry
(
statsToken
.
getBinder
());
if
(
entry
==
null
)
return
;
entry
.
mRequestWindowName
=
requestWindowName
;
entry
.
mRequestWindowName
=
requestWindowName
;
}
}
/** Dumps the contents of the history. */
public
synchronized
void
dump
(
@NonNull
PrintWriter
pw
,
@NonNull
String
prefix
)
{
mHistory
.
dump
(
pw
,
prefix
);
public
void
dump
(
@NonNull
PrintWriter
pw
,
@NonNull
String
prefix
)
{
synchronized
(
mLock
)
{
mHistory
.
dump
(
pw
,
prefix
);
}
}
@EnforcePermission
(
Manifest
.
permission
.
TEST_INPUT_METHOD
)
@Override
public
synchronized
boolean
hasPendingImeVisibilityRequests
()
{
public
boolean
hasPendingImeVisibilityRequests
()
{
super
.
hasPendingImeVisibilityRequests_enforcePermission
();
return
!
mHistory
.
mLiveEntries
.
isEmpty
();
synchronized
(
mLock
)
{
return
!
mHistory
.
mLiveEntries
.
isEmpty
();
}
}
/**
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment