diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/aapt/Command.cpp | 92 | ||||
| -rwxr-xr-x | tools/fonts/fontchain_lint.py | 121 | ||||
| -rw-r--r-- | tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java | 15 |
3 files changed, 135 insertions, 93 deletions
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp index 59da467a1cc3..ad583a8123d4 100644 --- a/tools/aapt/Command.cpp +++ b/tools/aapt/Command.cpp @@ -540,7 +540,7 @@ static bool hasFeature(const char* name, const FeatureGroup& grp, } static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatures, - const char* name, const char* reason, bool sdk23) { + const char* name, const String8& reason, bool sdk23) { String8 name8(name); ssize_t idx = impliedFeatures->indexOfKey(name8); if (idx < 0) { @@ -553,7 +553,7 @@ static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatu if (feature->impliedBySdk23 && !sdk23) { feature->impliedBySdk23 = false; } - feature->reasons.add(String8(reason)); + feature->reasons.add(reason); } static void printFeatureGroupImpl(const FeatureGroup& grp, @@ -651,50 +651,58 @@ static void addImpliedFeaturesForPermission(const int targetSdk, const String8& bool impliedBySdk23Permission) { if (name == "android.permission.CAMERA") { addImpliedFeature(impliedFeatures, "android.hardware.camera", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); + String8::format("requested %s permission", name.string()), + impliedBySdk23Permission); } else if (name == "android.permission.ACCESS_FINE_LOCATION") { - addImpliedFeature(impliedFeatures, "android.hardware.location.gps", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); - addImpliedFeature(impliedFeatures, "android.hardware.location", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); - } else if (name == "android.permission.ACCESS_MOCK_LOCATION") { + if (targetSdk < SDK_LOLLIPOP) { + addImpliedFeature(impliedFeatures, "android.hardware.location.gps", + String8::format("requested %s permission", name.string()), + impliedBySdk23Permission); + addImpliedFeature(impliedFeatures, "android.hardware.location.gps", + String8::format("targetSdkVersion < %d", SDK_LOLLIPOP), + impliedBySdk23Permission); + } addImpliedFeature(impliedFeatures, "android.hardware.location", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); + String8::format("requested %s permission", name.string()), + impliedBySdk23Permission); } else if (name == "android.permission.ACCESS_COARSE_LOCATION") { - addImpliedFeature(impliedFeatures, "android.hardware.location.network", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); + if (targetSdk < SDK_LOLLIPOP) { + addImpliedFeature(impliedFeatures, "android.hardware.location.network", + String8::format("requested %s permission", name.string()), + impliedBySdk23Permission); + addImpliedFeature(impliedFeatures, "android.hardware.location.network", + String8::format("targetSdkVersion < %d", SDK_LOLLIPOP), + impliedBySdk23Permission); + } addImpliedFeature(impliedFeatures, "android.hardware.location", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); - } else if (name == "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" || + String8::format("requested %s permission", name.string()), + impliedBySdk23Permission); + } else if (name == "android.permission.ACCESS_MOCK_LOCATION" || + name == "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" || name == "android.permission.INSTALL_LOCATION_PROVIDER") { addImpliedFeature(impliedFeatures, "android.hardware.location", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); + String8::format("requested %s permission", name.string()), + impliedBySdk23Permission); } else if (name == "android.permission.BLUETOOTH" || name == "android.permission.BLUETOOTH_ADMIN") { - if (targetSdk > 4) { + if (targetSdk > SDK_DONUT) { addImpliedFeature(impliedFeatures, "android.hardware.bluetooth", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); + String8::format("requested %s permission", name.string()), + impliedBySdk23Permission); addImpliedFeature(impliedFeatures, "android.hardware.bluetooth", - "targetSdkVersion > 4", impliedBySdk23Permission); + String8::format("targetSdkVersion > %d", SDK_DONUT), + impliedBySdk23Permission); } } else if (name == "android.permission.RECORD_AUDIO") { addImpliedFeature(impliedFeatures, "android.hardware.microphone", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); + String8::format("requested %s permission", name.string()), + impliedBySdk23Permission); } else if (name == "android.permission.ACCESS_WIFI_STATE" || name == "android.permission.CHANGE_WIFI_STATE" || name == "android.permission.CHANGE_WIFI_MULTICAST_STATE") { addImpliedFeature(impliedFeatures, "android.hardware.wifi", - String8::format("requested %s permission", name.string()) - .string(), impliedBySdk23Permission); + String8::format("requested %s permission", name.string()), + impliedBySdk23Permission); } else if (name == "android.permission.CALL_PHONE" || name == "android.permission.CALL_PRIVILEGED" || name == "android.permission.MODIFY_PHONE_STATE" || @@ -707,8 +715,8 @@ static void addImpliedFeaturesForPermission(const int targetSdk, const String8& name == "android.permission.WRITE_APN_SETTINGS" || name == "android.permission.WRITE_SMS") { addImpliedFeature(impliedFeatures, "android.hardware.telephony", - String8("requested a telephony permission").string(), - impliedBySdk23Permission); + String8("requested a telephony permission"), + impliedBySdk23Permission); } } @@ -1659,18 +1667,18 @@ int doDump(Bundle* bundle) if (error == "") { if (orien == 0 || orien == 6 || orien == 8) { // Requests landscape, sensorLandscape, or reverseLandscape. - addImpliedFeature(&impliedFeatures, - "android.hardware.screen.landscape", - "one or more activities have specified a " - "landscape orientation", - false); + addImpliedFeature( + &impliedFeatures, "android.hardware.screen.landscape", + String8("one or more activities have specified a " + "landscape orientation"), + false); } else if (orien == 1 || orien == 7 || orien == 9) { // Requests portrait, sensorPortrait, or reversePortrait. - addImpliedFeature(&impliedFeatures, - "android.hardware.screen.portrait", - "one or more activities have specified a " - "portrait orientation", - false); + addImpliedFeature( + &impliedFeatures, "android.hardware.screen.portrait", + String8("one or more activities have specified a " + "portrait orientation"), + false); } } } else if (tag == "uses-library") { @@ -2026,7 +2034,7 @@ int doDump(Bundle* bundle) // directly or implied, required or not), then the faketouch feature is implied. if (!hasFeature("android.hardware.touchscreen", commonFeatures, impliedFeatures)) { addImpliedFeature(&impliedFeatures, "android.hardware.faketouch", - "default feature for all apps", false); + String8("default feature for all apps"), false); } const size_t numFeatureGroups = featureGroups.size(); diff --git a/tools/fonts/fontchain_lint.py b/tools/fonts/fontchain_lint.py index 2956d87f247c..7ec46a3ee86b 100755 --- a/tools/fonts/fontchain_lint.py +++ b/tools/fonts/fontchain_lint.py @@ -256,8 +256,8 @@ def parse_fonts_xml(fonts_xml_path): def check_emoji_coverage(all_emoji, equivalent_emoji): - emoji_font = get_emoji_font() - check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji) + emoji_font = get_emoji_font() + check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji) def get_emoji_font(): @@ -274,15 +274,12 @@ def check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji): assert sequence in coverage, ( '%s is not supported in the emoji font.' % printable(sequence)) - # disable temporarily - we cover more than this - """ for sequence in coverage: if sequence in {0x0000, 0x000D, 0x0020}: # The font needs to support a few extra characters, which is OK continue assert sequence in all_emoji, ( 'Emoji font should not support %s.' % printable(sequence)) - """ for first, second in sorted(equivalent_emoji.items()): assert coverage[first] == coverage[second], ( @@ -290,8 +287,6 @@ def check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji): printable(first), printable(second))) - # disable temporarily - some equivalent sequences we don't even know about - """ for glyph in set(coverage.values()): maps_to_glyph = [seq for seq in coverage if coverage[seq] == glyph] if len(maps_to_glyph) > 1: @@ -307,7 +302,7 @@ def check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji): 'The sequences %s should not result in the same glyph %s' % ( printable(equivalent_seqs), glyph)) - """ + def check_emoji_defaults(default_emoji): missing_text_chars = _emoji_properties['Emoji'] - default_emoji @@ -334,15 +329,9 @@ def check_emoji_defaults(default_emoji): # Noto does not have monochrome glyphs for Unicode 7.0 wingdings and # webdings yet. missing_text_chars -= _chars_by_age['7.0'] - # TODO: Remove these after b/26113320 is fixed - missing_text_chars -= { - 0x263A, # WHITE SMILING FACE - 0x270C, # VICTORY HAND - 0x2744, # SNOWFLAKE - 0x2764, # HEAVY BLACK HEART - } assert missing_text_chars == set(), ( - 'Text style version of some emoji characters are missing: ' + repr(missing_text_chars)) + 'Text style version of some emoji characters are missing: ' + + repr(missing_text_chars)) # Setting reverse to true returns a dictionary that maps the values to sets of @@ -362,7 +351,7 @@ def parse_unicode_datafile(file_path, reverse=False): if not line: continue - chars, prop = line.split(';') + chars, prop = line.split(';')[:2] chars = chars.strip() prop = prop.strip() @@ -423,26 +412,6 @@ def parse_ucd(ucd_path): _emoji_zwj_sequences = parse_unicode_datafile( path.join(ucd_path, 'emoji-zwj-sequences.txt')) - # filter modern pentathlon, as it seems likely to be removed from final spec - # also filter rifle - def is_excluded(n): - return n in [0x1f93b, 0x1f946] - - def contains_excluded(t): - if type(t) == int: - return is_excluded(t) - return any(is_excluded(cp) for cp in t) - - # filter modern pentathlon, as it seems likely to be removed from final spec - _emoji_properties['Emoji'] = set( - t for t in _emoji_properties['Emoji'] if not contains_excluded(t)) - _emoji_sequences = dict( - (t, v) for (t, v) in _emoji_sequences.items() if not contains_excluded(t)) - - # add in UN flag - UN_seq = flag_sequence('UN') - _emoji_sequences[UN_seq] = 'Emoji_Flag_Sequence' - def flag_sequence(territory_code): return tuple(0x1F1E6 + ord(ch) - ord('A') for ch in territory_code) @@ -454,7 +423,8 @@ UNSUPPORTED_FLAGS = frozenset({ flag_sequence('GF'), flag_sequence('GP'), flag_sequence('GS'), flag_sequence('MF'), flag_sequence('MQ'), flag_sequence('NC'), flag_sequence('PM'), flag_sequence('RE'), flag_sequence('TF'), - flag_sequence('WF'), flag_sequence('XK'), flag_sequence('YT'), + flag_sequence('UN'), flag_sequence('WF'), flag_sequence('XK'), + flag_sequence('YT'), }) EQUIVALENT_FLAGS = { @@ -467,6 +437,22 @@ EQUIVALENT_FLAGS = { COMBINING_KEYCAP = 0x20E3 +# Characters that Android defaults to emoji style, different from the recommendations in UTR #51 +ANDROID_DEFAULT_EMOJI = frozenset({ + 0x2600, # BLACK SUN WITH RAYS + 0x2601, # CLOUD + 0x260E, # BLACK TELEPHONE + 0x261D, # WHITE UP POINTING INDEX + 0x263A, # WHITE SMILING FACE + 0x2660, # BLACK SPADE SUIT + 0x2663, # BLACK CLUB SUIT + 0x2665, # BLACK HEART SUIT + 0x2666, # BLACK DIAMOND SUIT + 0x270C, # VICTORY HAND + 0x2744, # SNOWFLAKE + 0x2764, # HEAVY BLACK HEART +}) + LEGACY_ANDROID_EMOJI = { 0xFE4E5: flag_sequence('JP'), 0xFE4E6: flag_sequence('US'), @@ -502,7 +488,17 @@ ZWJ_IDENTICALS = { def is_fitzpatrick_modifier(cp): - return 0x1f3fb <= cp <= 0x1f3ff + return 0x1F3FB <= cp <= 0x1F3FF + + +def reverse_emoji(seq): + rev = list(reversed(seq)) + # if there are fitzpatrick modifiers in the sequence, keep them after + # the emoji they modify + for i in xrange(1, len(rev)): + if is_fitzpatrick_modifier(rev[i-1]): + rev[i], rev[i-1] = rev[i-1], rev[i] + return tuple(rev) def compute_expected_emoji(): @@ -511,26 +507,52 @@ def compute_expected_emoji(): all_sequences = set() all_sequences.update(_emoji_variation_sequences) + # add zwj sequences not in the current emoji-zwj-sequences.txt + adjusted_emoji_zwj_sequences = dict(_emoji_zwj_sequences) + adjusted_emoji_zwj_sequences.update(_emoji_zwj_sequences) + # single parent families + additional_emoji_zwj = ( + (0x1F468, 0x200D, 0x1F466), + (0x1F468, 0x200D, 0x1F467), + (0x1F468, 0x200D, 0x1F466, 0x200D, 0x1F466), + (0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F466), + (0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F467), + (0x1F469, 0x200D, 0x1F466), + (0x1F469, 0x200D, 0x1F467), + (0x1F469, 0x200D, 0x1F466, 0x200D, 0x1F466), + (0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F466), + (0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F467), + ) + # sequences formed from man and woman and optional fitzpatrick modifier + modified_extensions = ( + 0x2696, + 0x2708, + 0x1F3A8, + 0x1F680, + 0x1F692, + ) + for seq in additional_emoji_zwj: + adjusted_emoji_zwj_sequences[seq] = 'Emoji_ZWJ_Sequence' + for ext in modified_extensions: + for base in (0x1F468, 0x1F469): + seq = (base, 0x200D, ext) + adjusted_emoji_zwj_sequences[seq] = 'Emoji_ZWJ_Sequence' + for modifier in range(0x1F3FB, 0x1F400): + seq = (base, modifier, 0x200D, ext) + adjusted_emoji_zwj_sequences[seq] = 'Emoji_ZWJ_Sequence' + for sequence in _emoji_sequences.keys(): sequence = tuple(ch for ch in sequence if ch != EMOJI_VS) all_sequences.add(sequence) sequence_pieces.update(sequence) - for sequence in _emoji_zwj_sequences.keys(): + for sequence in adjusted_emoji_zwj_sequences.keys(): sequence = tuple(ch for ch in sequence if ch != EMOJI_VS) all_sequences.add(sequence) sequence_pieces.update(sequence) # Add reverse of all emoji ZWJ sequences, which are added to the fonts # as a workaround to get the sequences work in RTL text. - reversed_seq = list(reversed(sequence)) - # if there are fitzpatrick modifiers in the sequence, keep them after - # the emoji they modify - for i in xrange(1, len(reversed_seq)): - if is_fitzpatrick_modifier(reversed_seq[i - 1]): - tmp = reversed_seq[i] - reversed_seq[i] = reversed_seq[i-1] - reversed_seq[i-1] = tmp - reversed_seq = tuple(reversed_seq) + reversed_seq = reverse_emoji(sequence) all_sequences.add(reversed_seq) equivalent_emoji[reversed_seq] = sequence @@ -549,6 +571,7 @@ def compute_expected_emoji(): set(LEGACY_ANDROID_EMOJI.keys())) default_emoji = ( _emoji_properties['Emoji_Presentation'] | + ANDROID_DEFAULT_EMOJI | all_sequences | set(LEGACY_ANDROID_EMOJI.keys())) diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index 58df301b1cfc..0c3231bcde60 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -96,7 +96,7 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void clearForcedDisplayDensity(int displayId) throws RemoteException { + public void clearForcedDisplayDensityForUser(int displayId, int userId) throws RemoteException { // TODO Auto-generated method stub } @@ -397,7 +397,8 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void setForcedDisplayDensity(int displayId, int density) throws RemoteException { + public void setForcedDisplayDensityForUser(int displayId, int density, int userId) + throws RemoteException { // TODO Auto-generated method stub } @@ -459,6 +460,16 @@ public class IWindowManagerImpl implements IWindowManager { } @Override + public void setRecentsVisibility(boolean visible) { + // TODO Auto-generated method stub + } + + @Override + public void setTvPipVisibility(boolean visible) { + // TODO Auto-generated method stub + } + + @Override public void stopAppFreezingScreen(IBinder arg0, boolean arg1) throws RemoteException { // TODO Auto-generated method stub } |