Let the absence of subtype.xml mean there is no additional subtype
Historically, we have always created a stub subtype.xml for each user
even when there is no additional subtype. Instead of having such a
stub XML files, no subtype will be represented by the absence of
subtype.xml with this CL.
If there has already been such a stub XML, it will be deleted
automatically when
InputMethodFileManager#writeAdditionalInputMethodSubtypes() gets
called next time. Note that this method is called from
InputMethodManagerService#onFinishPackageChangesInternal(), which is
called when some IME package is updated.
This is completely about how internal data is persisted. There should
be no developer-visible behavior change.
Fix: 121223050
Test: Manually verified as follows
1. Build and flash aosp_taimen-userdebug into taimen
2. Wait until the device fully boots up
3. adb reboot # to avoid Bug 121259290
4. adb root
5. adb shell cat /data/system/inputmethod/subtypes.xml
-> make sure the content looks as follows:
<subtypes>
<imi id="com.android.inputmethod.latin/.LatinIME">
<subtype ....>
<subtype ....>
</imi/>
</subtypes>
6. Open AOSP Keyboard settings
7. Go to "Appearance & Layouts" -> "Custom input styles"
8. Remove all layouts
9. adb shell cat /data/system/inputmethod/subtypes.xml
-> make sure the file no longer exists
Change-Id: If06e1b5967443157d1a7606190d721ae8983be08
This commit is contained in:
@@ -4304,14 +4304,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|
||||
}
|
||||
final File subtypeFile = new File(inputMethodDir, ADDITIONAL_SUBTYPES_FILE_NAME);
|
||||
mAdditionalInputMethodSubtypeFile = new AtomicFile(subtypeFile, "input-subtypes");
|
||||
if (!subtypeFile.exists()) {
|
||||
// If "subtypes.xml" doesn't exist, create a blank file.
|
||||
writeAdditionalInputMethodSubtypes(
|
||||
mAdditionalSubtypesMap, mAdditionalInputMethodSubtypeFile, methodMap);
|
||||
} else {
|
||||
readAdditionalInputMethodSubtypes(
|
||||
mAdditionalSubtypesMap, mAdditionalInputMethodSubtypeFile);
|
||||
}
|
||||
readAdditionalInputMethodSubtypes(mAdditionalSubtypesMap,
|
||||
mAdditionalInputMethodSubtypeFile);
|
||||
}
|
||||
|
||||
private void deleteAllInputMethodSubtypes(String imiId) {
|
||||
@@ -4351,6 +4345,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|
||||
private static void writeAdditionalInputMethodSubtypes(
|
||||
ArrayMap<String, List<InputMethodSubtype>> allSubtypes, AtomicFile subtypesFile,
|
||||
ArrayMap<String, InputMethodInfo> methodMap) {
|
||||
if (allSubtypes.isEmpty()) {
|
||||
if (subtypesFile.exists()) {
|
||||
subtypesFile.delete();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Safety net for the case that this function is called before methodMap is set.
|
||||
final boolean isSetMethodMap = methodMap != null && methodMap.size() > 0;
|
||||
FileOutputStream fos = null;
|
||||
@@ -4407,6 +4408,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
|
||||
ArrayMap<String, List<InputMethodSubtype>> allSubtypes, AtomicFile subtypesFile) {
|
||||
if (allSubtypes == null || subtypesFile == null) return;
|
||||
allSubtypes.clear();
|
||||
if (!subtypesFile.exists()) {
|
||||
// Not having the file means there is no additional subtype.
|
||||
return;
|
||||
}
|
||||
try (final FileInputStream fis = subtypesFile.openRead()) {
|
||||
final XmlPullParser parser = Xml.newPullParser();
|
||||
parser.setInput(fis, StandardCharsets.UTF_8.name());
|
||||
|
||||
Reference in New Issue
Block a user