diff options
155 files changed, 5028 insertions, 1456 deletions
diff --git a/Android.mk b/Android.mk index eeec94586ffc..e1c15470c648 100644 --- a/Android.mk +++ b/Android.mk @@ -85,6 +85,8 @@ LOCAL_SRC_FILES += \ core/java/android/app/IWallpaperManager.aidl \ core/java/android/app/IWallpaperManagerCallback.aidl \ core/java/android/app/admin/IDevicePolicyManager.aidl \ + core/java/android/app/trust/ITrustManager.aidl \ + core/java/android/app/trust/ITrustListener.aidl \ core/java/android/app/backup/IBackupManager.aidl \ core/java/android/app/backup/IFullBackupRestoreObserver.aidl \ core/java/android/app/backup/IRestoreObserver.aidl \ @@ -190,6 +192,8 @@ LOCAL_SRC_FILES += \ core/java/android/service/dreams/IDozeHardware.aidl \ core/java/android/service/dreams/IDreamManager.aidl \ core/java/android/service/dreams/IDreamService.aidl \ + core/java/android/service/trust/ITrustAgentService.aidl \ + core/java/android/service/trust/ITrustAgentServiceCallback.aidl \ core/java/android/service/wallpaper/IWallpaperConnection.aidl \ core/java/android/service/wallpaper/IWallpaperEngine.aidl \ core/java/android/service/wallpaper/IWallpaperService.aidl \ @@ -289,6 +293,7 @@ LOCAL_SRC_FILES += \ telephony/java/com/android/internal/telephony/ISms.aidl \ telephony/java/com/android/internal/telephony/IWapPushManager.aidl \ wifi/java/android/net/wifi/IWifiManager.aidl \ + wifi/java/android/net/wifi/hotspot/IWifiHotspotManager.aidl \ wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl \ packages/services/PacProcessor/com/android/net/IProxyService.aidl \ packages/services/Proxy/com/android/net/IProxyCallback.aidl \ diff --git a/api/current.txt b/api/current.txt index 190397b5ea12..efadf77d6507 100644 --- a/api/current.txt +++ b/api/current.txt @@ -28,6 +28,7 @@ package android { field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE"; field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS"; field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE"; + field public static final java.lang.String BIND_TRUST_AGENT_SERVICE = "android.permission.BIND_TRUST_AGENT_SERVICE"; field public static final java.lang.String BIND_VPN_SERVICE = "android.permission.BIND_VPN_SERVICE"; field public static final java.lang.String BIND_WALLPAPER = "android.permission.BIND_WALLPAPER"; field public static final java.lang.String BLUETOOTH = "android.permission.BLUETOOTH"; @@ -1759,13 +1760,13 @@ package android { field public static final int TextAppearance_DeviceDefault_Widget = 16974265; // 0x10301b9 field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Menu = 16974286; // 0x10301ce field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle = 16974279; // 0x10301c7 - field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle_Inverse = 16974283; // 0x10301cb + field public static final deprecated int TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle_Inverse = 16974283; // 0x10301cb field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Title = 16974278; // 0x10301c6 - field public static final int TextAppearance_DeviceDefault_Widget_ActionBar_Title_Inverse = 16974282; // 0x10301ca + field public static final deprecated int TextAppearance_DeviceDefault_Widget_ActionBar_Title_Inverse = 16974282; // 0x10301ca field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle = 16974281; // 0x10301c9 - field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle_Inverse = 16974285; // 0x10301cd + field public static final deprecated int TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle_Inverse = 16974285; // 0x10301cd field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Title = 16974280; // 0x10301c8 - field public static final int TextAppearance_DeviceDefault_Widget_ActionMode_Title_Inverse = 16974284; // 0x10301cc + field public static final deprecated int TextAppearance_DeviceDefault_Widget_ActionMode_Title_Inverse = 16974284; // 0x10301cc field public static final int TextAppearance_DeviceDefault_Widget_Button = 16974266; // 0x10301ba field public static final int TextAppearance_DeviceDefault_Widget_DropDownHint = 16974271; // 0x10301bf field public static final int TextAppearance_DeviceDefault_Widget_DropDownItem = 16974272; // 0x10301c0 @@ -2047,18 +2048,18 @@ package android { field public static final int Widget_DeviceDefault_Light = 16974196; // 0x1030174 field public static final int Widget_DeviceDefault_Light_ActionBar = 16974243; // 0x10301a3 field public static final int Widget_DeviceDefault_Light_ActionBar_Solid = 16974247; // 0x10301a7 - field public static final int Widget_DeviceDefault_Light_ActionBar_Solid_Inverse = 16974248; // 0x10301a8 + field public static final deprecated int Widget_DeviceDefault_Light_ActionBar_Solid_Inverse = 16974248; // 0x10301a8 field public static final int Widget_DeviceDefault_Light_ActionBar_TabBar = 16974246; // 0x10301a6 - field public static final int Widget_DeviceDefault_Light_ActionBar_TabBar_Inverse = 16974249; // 0x10301a9 + field public static final deprecated int Widget_DeviceDefault_Light_ActionBar_TabBar_Inverse = 16974249; // 0x10301a9 field public static final int Widget_DeviceDefault_Light_ActionBar_TabText = 16974245; // 0x10301a5 - field public static final int Widget_DeviceDefault_Light_ActionBar_TabText_Inverse = 16974251; // 0x10301ab + field public static final deprecated int Widget_DeviceDefault_Light_ActionBar_TabText_Inverse = 16974251; // 0x10301ab field public static final int Widget_DeviceDefault_Light_ActionBar_TabView = 16974244; // 0x10301a4 - field public static final int Widget_DeviceDefault_Light_ActionBar_TabView_Inverse = 16974250; // 0x10301aa + field public static final deprecated int Widget_DeviceDefault_Light_ActionBar_TabView_Inverse = 16974250; // 0x10301aa field public static final int Widget_DeviceDefault_Light_ActionButton = 16974239; // 0x103019f field public static final int Widget_DeviceDefault_Light_ActionButton_CloseMode = 16974242; // 0x10301a2 field public static final int Widget_DeviceDefault_Light_ActionButton_Overflow = 16974240; // 0x10301a0 field public static final int Widget_DeviceDefault_Light_ActionMode = 16974241; // 0x10301a1 - field public static final int Widget_DeviceDefault_Light_ActionMode_Inverse = 16974252; // 0x10301ac + field public static final deprecated int Widget_DeviceDefault_Light_ActionMode_Inverse = 16974252; // 0x10301ac field public static final int Widget_DeviceDefault_Light_AutoCompleteTextView = 16974203; // 0x103017b field public static final int Widget_DeviceDefault_Light_Button = 16974197; // 0x1030175 field public static final int Widget_DeviceDefault_Light_Button_Borderless_Small = 16974201; // 0x1030179 @@ -2186,6 +2187,7 @@ package android { field public static final int Widget_Holo_Light_ActionMode_Inverse = 16974119; // 0x1030127 field public static final int Widget_Holo_Light_AutoCompleteTextView = 16974011; // 0x10300bb field public static final int Widget_Holo_Light_Button = 16974006; // 0x10300b6 + field public static final int Widget_Holo_Light_Button_Borderless = 16974538; // 0x10302ca field public static final int Widget_Holo_Light_Button_Borderless_Small = 16974107; // 0x103011b field public static final int Widget_Holo_Light_Button_Inset = 16974008; // 0x10300b8 field public static final int Widget_Holo_Light_Button_Small = 16974007; // 0x10300b7 @@ -6489,6 +6491,7 @@ package android.content { field public static final java.lang.String USER_SERVICE = "user"; field public static final java.lang.String VIBRATOR_SERVICE = "vibrator"; field public static final java.lang.String WALLPAPER_SERVICE = "wallpaper"; + field public static final java.lang.String WIFI_HOTSPOT_SERVICE = "wifihotspot"; field public static final java.lang.String WIFI_P2P_SERVICE = "wifip2p"; field public static final java.lang.String WIFI_SERVICE = "wifi"; field public static final java.lang.String WINDOW_SERVICE = "window"; @@ -6920,6 +6923,7 @@ package android.content { field public static final java.lang.String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER"; field public static final java.lang.String CATEGORY_LE_DESK_DOCK = "android.intent.category.LE_DESK_DOCK"; field public static final java.lang.String CATEGORY_MONKEY = "android.intent.category.MONKEY"; + field public static final java.lang.String CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES"; field public static final java.lang.String CATEGORY_OPENABLE = "android.intent.category.OPENABLE"; field public static final java.lang.String CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE"; field public static final java.lang.String CATEGORY_SAMPLE_CODE = "android.intent.category.SAMPLE_CODE"; @@ -16198,6 +16202,19 @@ package android.net.wifi { } +package android.net.wifi.hotspot { + + public abstract interface IWifiHotspotManager implements android.os.IInterface { + method public abstract void test() throws android.os.RemoteException; + } + + public class WifiHotspotManager { + ctor public WifiHotspotManager(android.content.Context, android.net.wifi.hotspot.IWifiHotspotManager); + method public void test(); + } + +} + package android.net.wifi.p2p { public class WifiP2pConfig implements android.os.Parcelable { @@ -24371,6 +24388,20 @@ package android.service.textservice { } +package android.service.trust { + + public class TrustAgentService extends android.app.Service { + ctor public TrustAgentService(); + method protected final void enableTrust(java.lang.String, long, boolean); + method public final android.os.IBinder onBind(android.content.Intent); + method protected void onUnlockAttempt(boolean); + method protected final void revokeTrust(); + field public static final java.lang.String SERVICE_INTERFACE = "android.service.trust.TrustAgentService"; + field public static final java.lang.String TRUST_AGENT_META_DATA = "android.service.trust.trustagent"; + } + +} + package android.service.wallpaper { public abstract class WallpaperService extends android.app.Service { @@ -27823,9 +27854,9 @@ package android.util { field public static final java.lang.String GOOD_IRI_CHAR = "a-zA-Z0-9\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef"; field public static final java.util.regex.Pattern IP_ADDRESS; field public static final java.util.regex.Pattern PHONE; - field public static final java.util.regex.Pattern TOP_LEVEL_DOMAIN; - field public static final java.lang.String TOP_LEVEL_DOMAIN_STR = "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(biz|b[abdefghijmnorstvwyz])|(cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(edu|e[cegrstu])|f[ijkmor]|(gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(info|int|i[delmnoqrst])|(jobs|j[emop])|k[eghimnprwyz]|l[abcikrstuvy]|(mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])|(name|net|n[acefgilopruz])|(org|om)|(pro|p[aefghklmnrstwy])|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|(tel|travel|t[cdfghjklmnoprtvwz])|u[agksyz]|v[aceginu]|w[fs]|(\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)|y[et]|z[amw])"; - field public static final java.lang.String TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL = "(?:(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(?:biz|b[abdefghijmnorstvwyz])|(?:cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(?:edu|e[cegrstu])|f[ijkmor]|(?:gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(?:info|int|i[delmnoqrst])|(?:jobs|j[emop])|k[eghimnprwyz]|l[abcikrstuvy]|(?:mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])|(?:name|net|n[acefgilopruz])|(?:org|om)|(?:pro|p[aefghklmnrstwy])|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|(?:tel|travel|t[cdfghjklmnoprtvwz])|u[agksyz]|v[aceginu]|w[fs]|(?:\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)|y[et]|z[amw]))"; + field public static final deprecated java.util.regex.Pattern TOP_LEVEL_DOMAIN; + field public static final deprecated java.lang.String TOP_LEVEL_DOMAIN_STR = "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(biz|b[abdefghijmnorstvwyz])|(cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(edu|e[cegrstu])|f[ijkmor]|(gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(info|int|i[delmnoqrst])|(jobs|j[emop])|k[eghimnprwyz]|l[abcikrstuvy]|(mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])|(name|net|n[acefgilopruz])|(org|om)|(pro|p[aefghklmnrstwy])|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|(tel|travel|t[cdfghjklmnoprtvwz])|u[agksyz]|v[aceginu]|w[fs]|(\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)|y[et]|z[amw])"; + field public static final deprecated java.lang.String TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL = "(?:(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])|(?:biz|b[abdefghijmnorstvwyz])|(?:cat|com|coop|c[acdfghiklmnoruvxyz])|d[ejkmoz]|(?:edu|e[cegrstu])|f[ijkmor]|(?:gov|g[abdefghilmnpqrstuwy])|h[kmnrtu]|(?:info|int|i[delmnoqrst])|(?:jobs|j[emop])|k[eghimnprwyz]|l[abcikrstuvy]|(?:mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])|(?:name|net|n[acefgilopruz])|(?:org|om)|(?:pro|p[aefghklmnrstwy])|qa|r[eosuw]|s[abcdeghijklmnortuvyz]|(?:tel|travel|t[cdfghjklmnoprtvwz])|u[agksyz]|v[aceginu]|w[fs]|(?:\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)|y[et]|z[amw]))"; field public static final java.util.regex.Pattern WEB_URL; } @@ -28298,6 +28329,7 @@ package android.view { method public android.os.Vibrator getVibrator(); method public boolean[] hasKeys(int...); method public boolean isVirtual(); + method public boolean supportsSource(int); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; field public static final int KEYBOARD_TYPE_ALPHABETIC = 2; // 0x2 @@ -29318,6 +29350,7 @@ package android.view { method protected int computeVerticalScrollRange(); method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(); method public void createContextMenu(android.view.ContextMenu); + method public final android.animation.ValueAnimator createRevealAnimator(int, int, float, float); method public void destroyDrawingCache(); method public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets); method public void dispatchConfigurationChanged(android.content.res.Configuration); diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 589c82f93050..d1f94f072aa6 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -75,6 +75,8 @@ import android.net.nsd.INsdManager; import android.net.nsd.NsdManager; import android.net.wifi.IWifiManager; import android.net.wifi.WifiManager; +import android.net.wifi.hotspot.IWifiHotspotManager; +import android.net.wifi.hotspot.WifiHotspotManager; import android.net.wifi.p2p.IWifiP2pManager; import android.net.wifi.p2p.WifiP2pManager; import android.nfc.NfcManager; @@ -117,6 +119,7 @@ import android.view.textservice.TextServicesManager; import android.accounts.AccountManager; import android.accounts.IAccountManager; import android.app.admin.DevicePolicyManager; +import android.app.trust.TrustManager; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IAppOpsService; @@ -552,6 +555,13 @@ class ContextImpl extends Context { return new WifiManager(ctx.getOuterContext(), service); }}); + registerService(WIFI_HOTSPOT_SERVICE, new ServiceFetcher() { + public Object createService(ContextImpl ctx) { + IBinder b = ServiceManager.getService(WIFI_HOTSPOT_SERVICE); + IWifiHotspotManager service = IWifiHotspotManager.Stub.asInterface(b); + return new WifiHotspotManager(ctx.getOuterContext(), service); + }}); + registerService(WIFI_P2P_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE); @@ -612,6 +622,12 @@ class ContextImpl extends Context { return new MediaSessionManager(ctx); } }); + registerService(TRUST_SERVICE, new ServiceFetcher() { + public Object createService(ContextImpl ctx) { + IBinder b = ServiceManager.getService(TRUST_SERVICE); + return new TrustManager(b); + } + }); } static ContextImpl getImpl(Context context) { diff --git a/core/java/android/app/trust/ITrustListener.aidl b/core/java/android/app/trust/ITrustListener.aidl new file mode 100644 index 000000000000..46800438f490 --- /dev/null +++ b/core/java/android/app/trust/ITrustListener.aidl @@ -0,0 +1,26 @@ +/* +** +** Copyright 2014, 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 android.app.trust; + +/** + * Private API to be notified about trust changes. + * + * {@hide} + */ +oneway interface ITrustListener { + void onTrustChanged(boolean enabled, int userId); +}
\ No newline at end of file diff --git a/core/java/android/app/trust/ITrustManager.aidl b/core/java/android/app/trust/ITrustManager.aidl new file mode 100644 index 000000000000..ad4ccbb398e7 --- /dev/null +++ b/core/java/android/app/trust/ITrustManager.aidl @@ -0,0 +1,31 @@ +/* +** +** Copyright 2014, 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 android.app.trust; + +import android.app.trust.ITrustListener; + +/** + * System private API to comunicate with trust service. + * + * {@hide} + */ +interface ITrustManager { + void reportUnlockAttempt(boolean successful, int userId); + void reportEnabledTrustAgentsChanged(int userId); + void registerTrustListener(in ITrustListener trustListener); + void unregisterTrustListener(in ITrustListener trustListener); +} diff --git a/core/java/android/app/trust/TrustManager.java b/core/java/android/app/trust/TrustManager.java new file mode 100644 index 000000000000..e31c624d1ee8 --- /dev/null +++ b/core/java/android/app/trust/TrustManager.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2014 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 android.app.trust; + +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.os.RemoteException; +import android.util.ArrayMap; +import android.util.Log; + +/** + * See {@link com.android.server.trust.TrustManagerService} + * @hide + */ +public class TrustManager { + + private static final int MSG_TRUST_CHANGED = 1; + + private static final String TAG = "TrustManager"; + + private final ITrustManager mService; + private final ArrayMap<TrustListener, ITrustListener> mTrustListeners; + + public TrustManager(IBinder b) { + mService = ITrustManager.Stub.asInterface(b); + mTrustListeners = new ArrayMap<TrustListener, ITrustListener>(); + } + + /** + * Reports that user {@param userId} has tried to unlock the device. + * + * @param successful if true, the unlock attempt was successful. + * + * Requires the {@link android.Manifest.permission#ACCESS_KEYGUARD_SECURE_STORAGE} permission. + */ + public void reportUnlockAttempt(boolean successful, int userId) { + try { + mService.reportUnlockAttempt(successful, userId); + } catch (RemoteException e) { + onError(e); + } + } + + /** + * Reports that the list of enabled trust agents changed for user {@param userId}. + * + * Requires the {@link android.Manifest.permission#ACCESS_KEYGUARD_SECURE_STORAGE} permission. + */ + public void reportEnabledTrustAgentsChanged(int userId) { + try { + mService.reportEnabledTrustAgentsChanged(userId); + } catch (RemoteException e) { + onError(e); + } + } + + /** + * Registers a listener for trust events. + * + * Requires the {@link android.Manifest.permission#TRUST_LISTENER} permission. + */ + public void registerTrustListener(final TrustListener trustListener) { + try { + ITrustListener.Stub iTrustListener = new ITrustListener.Stub() { + @Override + public void onTrustChanged(boolean enabled, int userId) throws RemoteException { + mHandler.obtainMessage(MSG_TRUST_CHANGED, (enabled ? 1 : 0), userId, + trustListener).sendToTarget(); + } + }; + mService.registerTrustListener(iTrustListener); + mTrustListeners.put(trustListener, iTrustListener); + } catch (RemoteException e) { + onError(e); + } + } + + /** + * Unregisters a listener for trust events. + * + * Requires the {@link android.Manifest.permission#TRUST_LISTENER} permission. + */ + public void unregisterTrustListener(final TrustListener trustListener) { + ITrustListener iTrustListener = mTrustListeners.remove(trustListener); + if (iTrustListener != null) { + try { + mService.unregisterTrustListener(iTrustListener); + } catch (RemoteException e) { + onError(e); + } + } + } + + private void onError(Exception e) { + Log.e(TAG, "Error while calling TrustManagerService", e); + } + + private final Handler mHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(Message msg) { + switch(msg.what) { + case MSG_TRUST_CHANGED: + ((TrustListener)msg.obj).onTrustChanged(msg.arg1 != 0, msg.arg2); + break; + } + } + }; + + public interface TrustListener { + + /** + * Reports that the trust state has changed. + * @param enabled if true, the system believes the environment to be trusted. + * @param userId the user, for which the trust changed. + */ + void onTrustChanged(boolean enabled, int userId); + } +} diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 7b9ced9d319c..e79deeccbdc6 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -1986,7 +1986,13 @@ public final class BluetoothAdapter { public void onAdvertiseStateChange(int advertiseState, int status) { Log.d(TAG, "on advertise call back, state: " + advertiseState + " status: " + status); if (advertiseState == STATE_ADVERTISE_STARTED) { - mAdvertiseCallback.onAdvertiseStart(status); + if (status == ADVERTISE_CALLBACK_SUCCESS) { + mAdvertiseCallback.onAdvertiseStart(status); + } else { + // If status is unsuccessful and advertise state is started, it means stop + // advertising fails. + mAdvertiseCallback.onAdvertiseStop(status); + } } else { synchronized (this) { if (status == ADVERTISE_CALLBACK_SUCCESS) { @@ -2008,8 +2014,22 @@ public final class BluetoothAdapter { } } } - mAdvertiseCallback.onAdvertiseStop(status); + if (status == ADVERTISE_CALLBACK_SUCCESS) { + mAdvertiseCallback.onAdvertiseStop(status); + } else{ + // If status is unsuccesful and advertise state is stopped, it means start + // advertising fails. + mAdvertiseCallback.onAdvertiseStart(status); + } } } + + /** + * Callback reporting LE ATT MTU. + * @hide + */ + public void onConfigureMTU(String address, int mtu, int status) { + // no op + } } } diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index 39305b05c5fc..101b72194c22 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -550,6 +550,23 @@ public final class BluetoothGatt implements BluetoothProfile { public void onAdvertiseStateChange(int state, int status) { if (DBG) Log.d(TAG, "onAdvertiseStateChange() - state = " + state + " status=" + status); + } + + /** + * Callback invoked when the MTU for a given connection changes + * @hide + */ + public void onConfigureMTU(String address, int mtu, int status) { + if (DBG) Log.d(TAG, "onConfigureMTU() - Device=" + address + + " mtu=" + mtu + " status=" + status); + if (!address.equals(mDevice.getAddress())) { + return; + } + try { + mCallback.onConfigureMTU(BluetoothGatt.this, mtu, status); + } catch (Exception ex) { + Log.w(TAG, "Unhandled exception in callback", ex); + } } }; @@ -1137,6 +1154,36 @@ public final class BluetoothGatt implements BluetoothProfile { } /** + * Configure the MTU used for a given connection. + * + * <p>When performing a write request operation (write without response), + * the data sent is truncated to the MTU size. This function may be used + * to request a larget MTU size to be able to send more data at once. + * + * <p>A {@link BluetoothGattCallback#onConfigureMTU} callback will indicate + * whether this operation was successful. + * + * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. + * + * @return true, if the new MTU value has been requested successfully + * @hide + */ + public boolean configureMTU(int mtu) { + if (DBG) Log.d(TAG, "configureMTU() - device: " + mDevice.getAddress() + + " mtu: " + mtu); + if (mService == null || mClientIf == 0) return false; + + try { + mService.configureMTU(mClientIf, mDevice.getAddress(), mtu); + } catch (RemoteException e) { + Log.e(TAG,"",e); + return false; + } + + return true; + } + + /** * Not supported - please use {@link BluetoothManager#getConnectedDevices(int)} * with {@link BluetoothProfile#GATT} as argument * diff --git a/core/java/android/bluetooth/BluetoothGattCallback.java b/core/java/android/bluetooth/BluetoothGattCallback.java index 80ea4a695698..5180259cc120 100644 --- a/core/java/android/bluetooth/BluetoothGattCallback.java +++ b/core/java/android/bluetooth/BluetoothGattCallback.java @@ -138,4 +138,19 @@ public abstract class BluetoothGattCallback { */ public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { } + + /** + * Callback indicating the MTU for a given device connection has changed. + * + * This callback is triggered in response to the + * {@link BluetoothGatt#configureMTU} function, or in response to a connection + * event. + * + * @param gatt GATT client invoked {@link BluetoothGatt#configureMTU} + * @param mtu The new MTU size + * @param status {@link BluetoothGatt#GATT_SUCCESS} if the MTU has been changed successfully + * @hide + */ + public void onConfigureMTU(BluetoothGatt gatt, int mtu, int status) { + } } diff --git a/core/java/android/bluetooth/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl index 784cdcc5318c..c6b5c3d309a5 100644 --- a/core/java/android/bluetooth/IBluetoothGatt.aidl +++ b/core/java/android/bluetooth/IBluetoothGatt.aidl @@ -73,6 +73,7 @@ interface IBluetoothGatt { void beginReliableWrite(in int clientIf, in String address); void endReliableWrite(in int clientIf, in String address, in boolean execute); void readRemoteRssi(in int clientIf, in String address); + void configureMTU(in int clientIf, in String address, in int mtu); void registerServer(in ParcelUuid appId, in IBluetoothGattServerCallback callback); void unregisterServer(in int serverIf); diff --git a/core/java/android/bluetooth/IBluetoothGattCallback.aidl b/core/java/android/bluetooth/IBluetoothGattCallback.aidl index 7c69a066b465..a78c29b00641 100644 --- a/core/java/android/bluetooth/IBluetoothGattCallback.aidl +++ b/core/java/android/bluetooth/IBluetoothGattCallback.aidl @@ -64,4 +64,5 @@ interface IBluetoothGattCallback { in byte[] value); void onReadRemoteRssi(in String address, in int rssi, in int status); oneway void onAdvertiseStateChange(in int advertiseState, in int status); + void onConfigureMTU(in String address, in int mtu, in int status); } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 9f0c384ed5d2..3fdaef2c4d69 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1974,6 +1974,7 @@ public abstract class Context { //@hide: NETWORK_STATS_SERVICE, //@hide: NETWORK_POLICY_SERVICE, WIFI_SERVICE, + WIFI_HOTSPOT_SERVICE, WIFI_P2P_SERVICE, NSD_SERVICE, AUDIO_SERVICE, @@ -2324,6 +2325,16 @@ public abstract class Context { /** * Use with {@link #getSystemService} to retrieve a {@link + * android.net.wifi.hotspot.WifiHotspotManager} for handling management of + * Wi-Fi hotspot access. + * + * @see #getSystemService + * @see android.net.wifi.hotspot.WifiHotspotManager + */ + public static final String WIFI_HOTSPOT_SERVICE = "wifihotspot"; + + /** + * Use with {@link #getSystemService} to retrieve a {@link * android.net.wifi.p2p.WifiP2pManager} for handling management of * Wi-Fi peer-to-peer connections. * @@ -2584,6 +2595,14 @@ public abstract class Context { public static final String CONSUMER_IR_SERVICE = "consumer_ir"; /** + * {@link android.app.trust.TrustManager} for managing trust agents. + * @see #getSystemService + * @see android.app.trust.TrustManager + * @hide + */ + public static final String TRUST_SERVICE = "trust"; + + /** * Determine whether the given permission is allowed for a particular * process and user ID running in the system. * diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 102433bfd812..d189a344fdbd 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2884,6 +2884,14 @@ public class Intent implements Parcelable, Cloneable { @SdkConstant(SdkConstantType.INTENT_CATEGORY) public static final String CATEGORY_CAR_MODE = "android.intent.category.CAR_MODE"; + /** + * An activity that provides a user interface for adjusting notification preferences for its + * containing application. Optional but recommended for apps that post + * {@link android.app.Notification Notifications}. + */ + @SdkConstant(SdkConstantType.INTENT_CATEGORY) + public static final String CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES"; + // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Application launch intent categories (see addCategory()). diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index affc78415a16..1955be353dfb 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -114,7 +114,6 @@ public class Resources { private boolean mPreloading; private TypedArray mCachedStyledAttributes = null; - private RuntimeException mLastRetrievedAttrs = null; private int mLastCachedXmlBlockIndex = -1; private final int[] mCachedXmlBlockIds = { 0, 0, 0, 0 }; @@ -1253,12 +1252,9 @@ public class Resources { public void applyStyle(int resid, boolean force) { AssetManager.applyThemeStyle(mTheme, resid, force); - if (!mHasStyle) { - mHasStyle = true; - mThemeResId = resid; - } else if (resid != mThemeResId) { - mThemeResId = 0; - } + // TODO: In very rare cases, we may end up with a hybrid theme + // that can't map to a single theme ID. + mThemeResId = resid; } /** @@ -1273,7 +1269,6 @@ public class Resources { public void setTo(Theme other) { AssetManager.copyTheme(mTheme, other.mTheme); - mHasStyle = other.mHasStyle; mThemeResId = other.mThemeResId; } @@ -1562,10 +1557,6 @@ public class Resources { mAssets.releaseTheme(mTheme); } - /*package*/ boolean canCacheDrawables() { - return mHasStyle && mThemeResId != 0; - } - /*package*/ Theme() { mAssets = Resources.this.mAssets; mTheme = mAssets.createTheme(); @@ -1575,12 +1566,8 @@ public class Resources { private final AssetManager mAssets; private final long mTheme; - /** - * Resource identifier for the theme. If multiple styles have been - * applied to this theme, this value will be 0 (invalid). - */ + /** Resource identifier for the theme. */ private int mThemeResId = 0; - private boolean mHasStyle = false; } /** @@ -2260,11 +2247,6 @@ public class Resources { return; } - // Abort if the drawable is themed, but the theme cannot be cached. - if (dr.canApplyTheme() && theme != null && !theme.canCacheDrawables()) { - return; - } - if (mPreloading) { // Preloaded drawables never have a theme, but may be themeable. final int changingConfigs = cs.getChangingConfigurations(); @@ -2289,11 +2271,7 @@ public class Resources { } else { synchronized (mAccessLock) { final LongSparseArray<WeakReference<ConstantState>> themedCache; - if (!dr.canApplyTheme()) { - themedCache = caches.getUnthemed(true); - } else { - themedCache = caches.getOrCreate(theme == null ? 0 : theme.mThemeResId); - } + themedCache = caches.getOrCreate(theme == null ? 0 : theme.mThemeResId); themedCache.put(key, new WeakReference<ConstantState>(cs)); } } @@ -2354,21 +2332,6 @@ public class Resources { private Drawable getCachedDrawable(ThemedCaches<ConstantState> caches, long key, Theme theme) { synchronized (mAccessLock) { - // First, check for a matching unthemed drawable. - final LongSparseArray<WeakReference<ConstantState>> unthemed = caches.getUnthemed(false); - if (unthemed != null) { - final Drawable unthemedDrawable = getCachedDrawableLocked(unthemed, key); - if (unthemedDrawable != null) { - return unthemedDrawable; - } - } - - final boolean themeCannotCache = theme != null && !theme.canCacheDrawables(); - if (themeCannotCache) { - return null; - } - - // Next, check for a matching themed drawable. final int themeKey = theme != null ? theme.mThemeResId : 0; final LongSparseArray<WeakReference<ConstantState>> themedCache = caches.get(themeKey); if (themedCache != null) { @@ -2606,18 +2569,6 @@ public class Resources { } static class ThemedCaches<T> extends SparseArray<LongSparseArray<WeakReference<T>>> { - private LongSparseArray<WeakReference<T>> mUnthemed = null; - - /** - * Returns the cache of drawables with no themeable attributes. - */ - public LongSparseArray<WeakReference<T>> getUnthemed(boolean autoCreate) { - if (mUnthemed == null && autoCreate) { - mUnthemed = new LongSparseArray<WeakReference<T>>(1); - } - return mUnthemed; - } - /** * Returns the cache of drawables styled for the specified theme. * <p> diff --git a/core/java/android/net/http/X509TrustManagerExtensions.java b/core/java/android/net/http/X509TrustManagerExtensions.java index a500bcf221bd..830ddce08656 100644 --- a/core/java/android/net/http/X509TrustManagerExtensions.java +++ b/core/java/android/net/http/X509TrustManagerExtensions.java @@ -56,7 +56,8 @@ public class X509TrustManagerExtensions { if (tm instanceof TrustManagerImpl) { mDelegate = (TrustManagerImpl) tm; } else { - throw new IllegalArgumentException("tm is not a supported type of X509TrustManager"); + throw new IllegalArgumentException("tm is an instance of " + tm.getClass().getName() + + " which is not a supported type of X509TrustManager"); } } diff --git a/core/java/android/service/trust/ITrustAgentService.aidl b/core/java/android/service/trust/ITrustAgentService.aidl new file mode 100644 index 000000000000..863a249f8da7 --- /dev/null +++ b/core/java/android/service/trust/ITrustAgentService.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2014 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 android.service.trust; + +import android.os.Bundle; +import android.service.trust.ITrustAgentServiceCallback; + +/** + * Communication channel from TrustManagerService to the TrustAgent. + * @hide + */ +oneway interface ITrustAgentService { + void onUnlockAttempt(boolean successful); + void setCallback(ITrustAgentServiceCallback callback); +} diff --git a/core/java/android/view/DisplayList.java b/core/java/android/service/trust/ITrustAgentServiceCallback.aidl index ed528039e49d..c346771b7551 100644 --- a/core/java/android/view/DisplayList.java +++ b/core/java/android/service/trust/ITrustAgentServiceCallback.aidl @@ -13,13 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package android.service.trust; -package android.view; +import android.os.Bundle; +import android.os.UserHandle; -/** TODO: Remove once frameworks/webview is updated - * @hide +/** + * Communication channel from the TrustAgentService back to TrustManagerService. + * @hide */ -public class DisplayList { - /** @hide */ - public static final int STATUS_DONE = 0x0; +oneway interface ITrustAgentServiceCallback { + void enableTrust(String message, long durationMs, boolean initiatedByUser); + void revokeTrust(); } diff --git a/core/java/android/service/trust/TrustAgentService.java b/core/java/android/service/trust/TrustAgentService.java new file mode 100644 index 000000000000..d5ce429459d3 --- /dev/null +++ b/core/java/android/service/trust/TrustAgentService.java @@ -0,0 +1,148 @@ +/** + * Copyright (C) 2014 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 android.service.trust; + +import android.annotation.SdkConstant; +import android.app.Service; +import android.content.Intent; +import android.os.Handler; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Slog; + +/** + * A service that notifies the system about whether it believes the environment of the device + * to be trusted. + * + * <p>To extend this class, you must declare the service in your manifest file with + * the {@link android.Manifest.permission#BIND_TRUST_AGENT_SERVICE} permission + * and include an intent filter with the {@link #SERVICE_INTERFACE} action. For example:</p> + * <pre> + * <service android:name=".TrustAgent" + * android:label="@string/service_name" + * android:permission="android.permission.BIND_TRUST_AGENT_SERVICE"> + * <intent-filter> + * <action android:name="android.service.trust.TrustAgentService" /> + * </intent-filter> + * <meta-data android:name="android.service.trust.trustagent" + * android:value="@xml/trust_agent" /> + * </service></pre> + * + * <p>The associated meta-data file can specify an activity that is accessible through Settings + * and should allow configuring the trust agent, as defined in + * {@link android.R.styleable#TrustAgent}. For example:</p> + * + * <pre> + * <trust_agent xmlns:android="http://schemas.android.com/apk/res/android" + * android:settingsActivity=".TrustAgentSettings" /></pre> + */ +public class TrustAgentService extends Service { + private final String TAG = TrustAgentService.class.getSimpleName() + + "[" + getClass().getSimpleName() + "]"; + + /** + * The {@link Intent} that must be declared as handled by the service. + */ + @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) + public static final String SERVICE_INTERFACE + = "android.service.trust.TrustAgentService"; + + /** + * The name of the {@code meta-data} tag pointing to additional configuration of the trust + * agent. + */ + public static final String TRUST_AGENT_META_DATA = "android.service.trust.trustagent"; + + private static final int MSG_UNLOCK_ATTEMPT = 1; + + private static final boolean DEBUG = false; + + private ITrustAgentServiceCallback mCallback; + + private Handler mHandler = new Handler() { + public void handleMessage(android.os.Message msg) { + switch (msg.what) { + case MSG_UNLOCK_ATTEMPT: + onUnlockAttempt(msg.arg1 != 0); + break; + } + }; + }; + + /** + * Called when the user attempted to authenticate on the device. + * + * @param successful true if the attempt succeeded + */ + protected void onUnlockAttempt(boolean successful) { + } + + private void onError(String msg) { + Slog.v(TAG, "Remote exception while " + msg); + } + + /** + * Call to enable trust on the device. + * + * @param message describes why the device is trusted, e.g. "Trusted by location". + * @param durationMs amount of time in milliseconds to keep the device in a trusted state. Trust + * for this agent will automatically be revoked when the timeout expires. + * @param initiatedByUser indicates that the user has explicitly initiated an action that proves + * the user is about to use the device. + */ + protected final void enableTrust(String message, long durationMs, boolean initiatedByUser) { + if (mCallback != null) { + try { + mCallback.enableTrust(message, durationMs, initiatedByUser); + } catch (RemoteException e) { + onError("calling enableTrust()"); + } + } + } + + /** + * Call to revoke trust on the device. + */ + protected final void revokeTrust() { + if (mCallback != null) { + try { + mCallback.revokeTrust(); + } catch (RemoteException e) { + onError("calling revokeTrust()"); + } + } + } + + @Override + public final IBinder onBind(Intent intent) { + if (DEBUG) Slog.v(TAG, "onBind() intent = " + intent); + return new TrustAgentServiceWrapper(); + } + + private final class TrustAgentServiceWrapper extends ITrustAgentService.Stub { + @Override + public void onUnlockAttempt(boolean successful) { + mHandler.obtainMessage(MSG_UNLOCK_ATTEMPT, successful ? 1 : 0, 0) + .sendToTarget(); + } + + public void setCallback(ITrustAgentServiceCallback callback) { + mCallback = callback; + } + } + +} diff --git a/core/java/android/util/Patterns.java b/core/java/android/util/Patterns.java index 0f8da444afdf..13cc88be83eb 100644 --- a/core/java/android/util/Patterns.java +++ b/core/java/android/util/Patterns.java @@ -28,7 +28,12 @@ public class Patterns { * List accurate as of 2011/07/18. List taken from: * http://data.iana.org/TLD/tlds-alpha-by-domain.txt * This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py + * + * @deprecated Due to the recent profileration of gTLDs, this API is + * expected to become out-of-date very quickly. Therefore it is now + * deprecated. */ + @Deprecated public static final String TOP_LEVEL_DOMAIN_STR = "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])" + "|(biz|b[abdefghijmnorstvwyz])" @@ -59,7 +64,9 @@ public class Patterns { /** * Regular expression pattern to match all IANA top-level domains. + * @deprecated This API is deprecated. See {@link #TOP_LEVEL_DOMAIN_STR}. */ + @Deprecated public static final Pattern TOP_LEVEL_DOMAIN = Pattern.compile(TOP_LEVEL_DOMAIN_STR); @@ -68,7 +75,10 @@ public class Patterns { * List accurate as of 2011/07/18. List taken from: * http://data.iana.org/TLD/tlds-alpha-by-domain.txt * This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py + * + * @deprecated This API is deprecated. See {@link #TOP_LEVEL_DOMAIN_STR}. */ + @Deprecated public static final String TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL = "(?:" + "(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])" @@ -107,6 +117,24 @@ public class Patterns { public static final String GOOD_IRI_CHAR = "a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF"; + public static final Pattern IP_ADDRESS + = Pattern.compile( + "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]" + + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]" + + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}" + + "|[1-9][0-9]|[0-9]))"); + + /** + * RFC 1035 Section 2.3.4 limits the labels to a maximum 63 octets. + */ + private static final String IRI + = "[" + GOOD_IRI_CHAR + "]([" + GOOD_IRI_CHAR + "\\-]{0,61}[" + GOOD_IRI_CHAR + "]){0,1}"; + + private static final String HOST_NAME = IRI + "(?:\\." + IRI + ")+"; + + public static final Pattern DOMAIN_NAME + = Pattern.compile("(" + HOST_NAME + "|" + IP_ADDRESS + ")"); + /** * Regular expression pattern to match most part of RFC 3987 * Internationalized URLs, aka IRIs. Commonly used Unicode characters are @@ -116,13 +144,7 @@ public class Patterns { "((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)" + "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_" + "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?" - + "((?:(?:[" + GOOD_IRI_CHAR + "][" + GOOD_IRI_CHAR + "\\-]{0,64}\\.)+" // named host - + TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL - + "|(?:(?:25[0-5]|2[0-4]" // or ip address - + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]" - + "|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]" - + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}" - + "|[1-9][0-9]|[0-9])))" + + "(?:" + DOMAIN_NAME + ")" + "(?:\\:\\d{1,5})?)" // plus option port number + "(\\/(?:(?:[" + GOOD_IRI_CHAR + "\\;\\/\\?\\:\\@\\&\\=\\#\\~" // plus option query params + "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?" @@ -130,19 +152,6 @@ public class Patterns { // input. This is to stop foo.sure from // matching as foo.su - public static final Pattern IP_ADDRESS - = Pattern.compile( - "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]" - + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]" - + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}" - + "|[1-9][0-9]|[0-9]))"); - - public static final Pattern DOMAIN_NAME - = Pattern.compile( - "(((([" + GOOD_IRI_CHAR + "][" + GOOD_IRI_CHAR + "\\-]*)*[" + GOOD_IRI_CHAR + "]\\.)+" - + TOP_LEVEL_DOMAIN + ")|" - + IP_ADDRESS + ")"); - public static final Pattern EMAIL_ADDRESS = Pattern.compile( "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + @@ -159,7 +168,7 @@ public class Patterns { * might be phone numbers in arbitrary text, not for validating whether * something is in fact a phone number. It will miss many things that * are legitimate phone numbers. - * + * * <p> The pattern matches the following: * <ul> * <li>Optionally, a + sign followed immediately by one or more digits. Spaces, dots, or dashes diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index abae0687ea56..477c9941825c 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -52,7 +52,7 @@ import java.util.Queue; */ final class AccessibilityInteractionController { - private static final boolean ENFORCE_NODE_TREE_CONSISTENT = Build.IS_DEBUGGABLE; + private static final boolean ENFORCE_NODE_TREE_CONSISTENT = false; private final ArrayList<AccessibilityNodeInfo> mTempAccessibilityNodeInfoList = new ArrayList<AccessibilityNodeInfo>(); diff --git a/core/java/android/view/GLRenderer.java b/core/java/android/view/GLRenderer.java index 90824abebce9..d6e17813a005 100644 --- a/core/java/android/view/GLRenderer.java +++ b/core/java/android/view/GLRenderer.java @@ -555,6 +555,32 @@ public class GLRenderer extends HardwareRenderer { } @Override + public void invokeFunctor(long functor, boolean waitForCompletion) { + boolean needsContext = !isEnabled() || checkRenderContext() == SURFACE_STATE_ERROR; + boolean hasContext = !needsContext; + + if (needsContext) { + GLRendererEglContext managedContext = + (GLRendererEglContext) sEglContextStorage.get(); + if (managedContext != null) { + usePbufferSurface(managedContext.getContext()); + hasContext = true; + } + } + + try { + nInvokeFunctor(functor, hasContext); + } finally { + if (needsContext) { + sEgl.eglMakeCurrent(sEglDisplay, EGL_NO_SURFACE, + EGL_NO_SURFACE, EGL_NO_CONTEXT); + } + } + } + + private static native void nInvokeFunctor(long functor, boolean hasContext); + + @Override void destroyHardwareResources(final View view) { if (view != null) { safelyRun(new Runnable() { @@ -1096,8 +1122,7 @@ public class GLRenderer extends HardwareRenderer { } if (checkRenderContext() != SURFACE_STATE_ERROR) { - int status = mCanvas.invokeFunctors(mRedrawClip); - handleFunctorStatus(attachInfo, status); + mCanvas.invokeFunctors(mRedrawClip); } } } @@ -1203,7 +1228,7 @@ public class GLRenderer extends HardwareRenderer { private RenderNode buildDisplayList(View view, HardwareCanvas canvas) { if (mDrawDelta <= 0) { - return view.mDisplayList; + return view.mRenderNode; } view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED) @@ -1214,12 +1239,12 @@ public class GLRenderer extends HardwareRenderer { canvas.clearLayerUpdates(); Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList"); - RenderNode displayList = view.getDisplayList(); + RenderNode renderNode = view.getDisplayList(); Trace.traceEnd(Trace.TRACE_TAG_VIEW); endBuildDisplayListProfiling(buildDisplayListStartTime); - return displayList; + return renderNode; } private Rect beginFrame(HardwareCanvas canvas, Rect dirty, int surfaceState) { @@ -1301,7 +1326,6 @@ public class GLRenderer extends HardwareRenderer { mProfileData[mProfileCurrentFrame + 1] = total; } - handleFunctorStatus(attachInfo, status); return status; } @@ -1337,26 +1361,6 @@ public class GLRenderer extends HardwareRenderer { } } - private void handleFunctorStatus(View.AttachInfo attachInfo, int status) { - // If the draw flag is set, functors will be invoked while executing - // the tree of display lists - if ((status & RenderNode.STATUS_DRAW) != 0) { - if (mRedrawClip.isEmpty()) { - attachInfo.mViewRootImpl.invalidate(); - } else { - attachInfo.mViewRootImpl.invalidateChildInParent(null, mRedrawClip); - mRedrawClip.setEmpty(); - } - } - - if ((status & RenderNode.STATUS_INVOKE) != 0 || - attachInfo.mHandler.hasCallbacks(mFunctorsRunnable)) { - attachInfo.mHandler.removeCallbacks(mFunctorsRunnable); - mFunctorsRunnable.attachInfo = attachInfo; - attachInfo.mHandler.postDelayed(mFunctorsRunnable, FUNCTOR_PROCESS_DELAY); - } - } - @Override void detachFunctor(long functor) { if (mCanvas != null) { diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java index f695b201a75b..233f846880c4 100644 --- a/core/java/android/view/HardwareCanvas.java +++ b/core/java/android/view/HardwareCanvas.java @@ -23,7 +23,7 @@ import android.graphics.Rect; /** * Hardware accelerated canvas. - * + * * @hide */ public abstract class HardwareCanvas extends Canvas { @@ -40,7 +40,7 @@ public abstract class HardwareCanvas extends Canvas { /** * Invoked before any drawing operation is performed in this canvas. - * + * * @param dirty The dirty rectangle to update, can be null. * @return {@link RenderNode#STATUS_DREW} if anything was drawn (such as a call to clear * the canvas). @@ -70,13 +70,11 @@ public abstract class HardwareCanvas extends Canvas { * Draws the specified display list onto this canvas. * * @param displayList The display list to replay. - * @param dirty The dirty region to redraw in the next pass, matters only - * if this method returns {@link RenderNode#STATUS_DRAW}, can be null. + * @param dirty Ignored, can be null. * @param flags Optional flags about drawing, see {@link RenderNode} for * the possible flags. * - * @return One of {@link RenderNode#STATUS_DONE}, {@link RenderNode#STATUS_DRAW}, or - * {@link RenderNode#STATUS_INVOKE}, or'd with {@link RenderNode#STATUS_DREW} + * @return One of {@link RenderNode#STATUS_DONE} or {@link RenderNode#STATUS_DREW} * if anything was drawn. * * @hide @@ -101,9 +99,8 @@ public abstract class HardwareCanvas extends Canvas { * This function may return true if an invalidation is needed after the call. * * @param drawGLFunction A native function pointer - * - * @return One of {@link RenderNode#STATUS_DONE}, {@link RenderNode#STATUS_DRAW} or - * {@link RenderNode#STATUS_INVOKE} + * + * @return {@link RenderNode#STATUS_DONE} * * @hide */ @@ -114,11 +111,10 @@ public abstract class HardwareCanvas extends Canvas { /** * Invoke all the functors who requested to be invoked during the previous frame. - * - * @param dirty The region to redraw when the functors return {@link RenderNode#STATUS_DRAW} - * - * @return One of {@link RenderNode#STATUS_DONE}, {@link RenderNode#STATUS_DRAW} or - * {@link RenderNode#STATUS_INVOKE} + * + * @param dirty Ignored + * + * @return Ignored * * @hide */ @@ -154,7 +150,7 @@ public abstract class HardwareCanvas extends Canvas { /** * Indicates that the specified layer must be updated as soon as possible. - * + * * @param layer The layer to update * * @see #clearLayerUpdates() @@ -187,7 +183,7 @@ public abstract class HardwareCanvas extends Canvas { /** * Removes all enqueued layer updates. - * + * * @see #pushLayerUpdate(HardwareLayer) * * @hide diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 34efcf5fb5cf..a92f89d9d4ca 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -182,7 +182,7 @@ public abstract class HardwareRenderer { public static boolean sSystemRendererDisabled = false; /** @hide */ - public static boolean sUseRenderThread = false; + public static boolean sUseRenderThread = true; private boolean mEnabled; private boolean mRequested = true; @@ -438,6 +438,17 @@ public abstract class HardwareRenderer { abstract void attachFunctor(View.AttachInfo attachInfo, long functor); /** + * Schedules the functor for execution in either kModeProcess or + * kModeProcessNoContext, depending on whether or not there is an EGLContext. + * + * @param functor The native functor to invoke + * @param waitForCompletion If true, this will not return until the functor + * has invoked. If false, the functor may be invoked + * asynchronously. + */ + public abstract void invokeFunctor(long functor, boolean waitForCompletion); + + /** * Initializes the hardware renderer for the specified surface and setup the * renderer for drawing, if needed. This is invoked when the ViewAncestor has * potentially lost the hardware renderer. The hardware renderer should be diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java index 0b12cbe9c221..ae5f37e2e2a4 100644 --- a/core/java/android/view/InputDevice.java +++ b/core/java/android/view/InputDevice.java @@ -579,6 +579,18 @@ public final class InputDevice implements Parcelable { } /** + * Determines whether the input device supports the given source or sources. + * + * @param source The input source or sources to check against. This can be a generic device + * type such as {@link InputDevice#SOURCE_MOUSE}, a more generic device class, such as + * {@link InputDevice#SOURCE_CLASS_POINTER}, or a combination of sources bitwise ORed together. + * @return Whether the device can produce all of the given sources. + */ + public boolean supportsSource(int source) { + return (mSources & source) == source; + } + + /** * Gets the keyboard type. * @return The keyboard type. */ diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java index c4fac4693933..e19bda9c2de6 100644 --- a/core/java/android/view/LayoutInflater.java +++ b/core/java/android/view/LayoutInflater.java @@ -590,6 +590,7 @@ public abstract class LayoutInflater { Object[] args = mConstructorArgs; args[1] = attrs; + constructor.setAccessible(true); final View view = constructor.newInstance(args); if (view instanceof ViewStub) { // always use ourselves when inflating ViewStub later diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java index 6c8c3c7ecd1e..a27c313fcd40 100644 --- a/core/java/android/view/RenderNode.java +++ b/core/java/android/view/RenderNode.java @@ -269,8 +269,8 @@ public class RenderNode { } /** - * Returns whether the display list is currently usable. If this returns false, - * the display list should be re-recorded prior to replaying it. + * Returns whether the RenderNode's display list content is currently usable. + * If this returns false, the display list should be re-recorded prior to replaying it. * * @return boolean true if the display list is able to be replayed, false otherwise. */ diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 2a488a0a21b6..7b8a1ffb8315 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -186,6 +186,11 @@ public class ThreadedRenderer extends HardwareRenderer { } @Override + public void invokeFunctor(long functor, boolean waitForCompletion) { + nInvokeFunctor(mNativeProxy, functor, waitForCompletion); + } + + @Override HardwareLayer createDisplayListLayer(int width, int height) { long layer = nCreateDisplayListLayer(mNativeProxy, width, height); return HardwareLayer.adoptDisplayListLayer(this, layer); @@ -266,6 +271,7 @@ public class ThreadedRenderer extends HardwareRenderer { private static native void nAttachFunctor(long nativeProxy, long functor); private static native void nDetachFunctor(long nativeProxy, long functor); + private static native void nInvokeFunctor(long nativeProxy, long functor, boolean waitForCompletion); private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height); private static native long nCreateTextureLayer(long nativeProxy); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 22ca41898833..5be469822375 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3551,13 +3551,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private Bitmap mUnscaledDrawingCache; /** - * Display list used for the View content. + * RenderNode holding View properties, potentially holding a DisplayList of View content. * <p> * When non-null and valid, this is expected to contain an up-to-date copy - * of the View content. It is cleared on temporary detach and reset on + * of the View content. Its DisplayList content is cleared on temporary detach and reset on * cleanup. */ - RenderNode mDisplayList; + RenderNode mRenderNode; /** * Set to true when the view is sending hover accessibility events because it @@ -9018,10 +9018,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @return True if the event was handled, false otherwise. */ public boolean onTouchEvent(MotionEvent event) { + final float x = event.getX(); + final float y = event.getY(); final int viewFlags = mViewFlags; if ((viewFlags & ENABLED_MASK) == DISABLED) { if (event.getAction() == MotionEvent.ACTION_UP && (mPrivateFlags & PFLAG_PRESSED) != 0) { + clearHotspot(R.attr.state_pressed); setPressed(false); } // A disabled view that is clickable still consumes the touch @@ -9054,6 +9057,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // showed it as pressed. Make it show the pressed // state now (before scheduling the click) to ensure // the user sees it. + setHotspot(R.attr.state_pressed, x, y); setPressed(true); } @@ -9086,6 +9090,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // If the post failed, unpress right now mUnsetPressedState.run(); } + removeTapCallback(); } break; @@ -9107,23 +9112,26 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (mPendingCheckForTap == null) { mPendingCheckForTap = new CheckForTap(); } + mPendingCheckForTap.x = event.getX(); + mPendingCheckForTap.y = event.getY(); postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout()); } else { // Not inside a scrolling container, so show the feedback right away + setHotspot(R.attr.state_pressed, x, y); setPressed(true); checkForLongClick(0); } break; case MotionEvent.ACTION_CANCEL: + clearHotspot(R.attr.state_pressed); setPressed(false); removeTapCallback(); removeLongPressCallback(); break; case MotionEvent.ACTION_MOVE: - final int x = (int) event.getX(); - final int y = (int) event.getY(); + setHotspot(R.attr.state_pressed, x, y); // Be lenient about moving outside of buttons if (!pointInView(x, y, mTouchSlop)) { @@ -9139,46 +9147,24 @@ public class View implements Drawable.Callback, KeyEvent.Callback, break; } - if (mBackground != null && mBackground.supportsHotspots()) { - manageTouchHotspot(event); - } - return true; } return false; } - private void manageTouchHotspot(MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_POINTER_DOWN: { - final int index = event.getActionIndex(); - setPointerHotspot(event, index); - } break; - case MotionEvent.ACTION_MOVE: { - final int count = event.getPointerCount(); - for (int index = 0; index < count; index++) { - setPointerHotspot(event, index); - } - } break; - case MotionEvent.ACTION_POINTER_UP: { - final int actionIndex = event.getActionIndex(); - final int pointerId = event.getPointerId(actionIndex); - mBackground.removeHotspot(pointerId); - } break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - mBackground.clearHotspots(); - break; + private void setHotspot(int id, float x, float y) { + final Drawable bg = mBackground; + if (bg != null && bg.supportsHotspots()) { + bg.setHotspot(id, x, y); } } - private void setPointerHotspot(MotionEvent event, int index) { - final int id = event.getPointerId(index); - final float x = event.getX(index); - final float y = event.getY(index); - mBackground.setHotspot(id, x, y); + private void clearHotspot(int id) { + final Drawable bg = mBackground; + if (bg != null && bg.supportsHotspots()) { + bg.removeHotspot(id); + } } /** @@ -9733,6 +9719,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } + void ensureRenderNode() { + if (mRenderNode == null) { + mRenderNode = RenderNode.create(getClass().getName()); + } + } + /** * Recomputes the transform matrix if necessary. */ @@ -9875,8 +9867,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mMatrixDirty = true; invalidateViewProperty(false, false); - if (mDisplayList != null) { - mDisplayList.setCameraDistance(-Math.abs(distance) / dpi); + if (mRenderNode != null) { + mRenderNode.setCameraDistance(-Math.abs(distance) / dpi); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -9921,8 +9913,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mRotation = rotation; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setRotation(rotation); + if (mRenderNode != null) { + mRenderNode.setRotation(rotation); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -9972,8 +9964,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mRotationY = rotationY; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setRotationY(rotationY); + if (mRenderNode != null) { + mRenderNode.setRotationY(rotationY); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -10023,8 +10015,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mRotationX = rotationX; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setRotationX(rotationX); + if (mRenderNode != null) { + mRenderNode.setRotationX(rotationX); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -10066,8 +10058,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mScaleX = scaleX; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setScaleX(scaleX); + if (mRenderNode != null) { + mRenderNode.setScaleX(scaleX); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -10109,8 +10101,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mScaleY = scaleY; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setScaleY(scaleY); + if (mRenderNode != null) { + mRenderNode.setScaleY(scaleY); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -10162,8 +10154,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mPivotX = pivotX; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setPivotX(pivotX); + if (mRenderNode != null) { + mRenderNode.setPivotX(pivotX); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -10214,8 +10206,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mPivotY = pivotY; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setPivotY(pivotY); + if (mRenderNode != null) { + mRenderNode.setPivotY(pivotY); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -10298,8 +10290,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } else { mPrivateFlags &= ~PFLAG_ALPHA_SET; invalidateViewProperty(true, false); - if (mDisplayList != null) { - mDisplayList.setAlpha(getFinalAlpha()); + if (mRenderNode != null) { + mRenderNode.setAlpha(getFinalAlpha()); } } } @@ -10325,8 +10317,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return true; } else { mPrivateFlags &= ~PFLAG_ALPHA_SET; - if (mDisplayList != null) { - mDisplayList.setAlpha(getFinalAlpha()); + if (mRenderNode != null) { + mRenderNode.setAlpha(getFinalAlpha()); } } } @@ -10348,8 +10340,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mTransformationInfo.mTransitionAlpha = alpha; mPrivateFlags &= ~PFLAG_ALPHA_SET; invalidateViewProperty(true, false); - if (mDisplayList != null) { - mDisplayList.setAlpha(getFinalAlpha()); + if (mRenderNode != null) { + mRenderNode.setAlpha(getFinalAlpha()); } } } @@ -10422,8 +10414,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int oldHeight = mBottom - mTop; mTop = top; - if (mDisplayList != null) { - mDisplayList.setTop(mTop); + if (mRenderNode != null) { + mRenderNode.setTop(mTop); } sizeChange(width, mBottom - mTop, width, oldHeight); @@ -10495,8 +10487,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int oldHeight = mBottom - mTop; mBottom = bottom; - if (mDisplayList != null) { - mDisplayList.setBottom(mBottom); + if (mRenderNode != null) { + mRenderNode.setBottom(mBottom); } sizeChange(width, mBottom - mTop, width, oldHeight); @@ -10562,8 +10554,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int height = mBottom - mTop; mLeft = left; - if (mDisplayList != null) { - mDisplayList.setLeft(left); + if (mRenderNode != null) { + mRenderNode.setLeft(left); } sizeChange(mRight - mLeft, height, oldWidth, height); @@ -10626,8 +10618,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, int height = mBottom - mTop; mRight = right; - if (mDisplayList != null) { - mDisplayList.setRight(mRight); + if (mRenderNode != null) { + mRenderNode.setRight(mRight); } sizeChange(mRight - mLeft, height, oldWidth, height); @@ -10727,8 +10719,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mTranslationX = translationX; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setTranslationX(translationX); + if (mRenderNode != null) { + mRenderNode.setTranslationX(translationX); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -10768,8 +10760,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mTranslationY = translationY; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setTranslationY(translationY); + if (mRenderNode != null) { + mRenderNode.setTranslationY(translationY); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -10801,8 +10793,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.mTranslationZ = translationZ; info.mMatrixDirty = true; invalidateViewProperty(false, true); - if (mDisplayList != null) { - mDisplayList.setTranslationZ(translationZ); + if (mRenderNode != null) { + mRenderNode.setTranslationZ(translationZ); } if ((mPrivateFlags2 & PFLAG2_VIEW_QUICK_REJECTED) == PFLAG2_VIEW_QUICK_REJECTED) { // View was rejected last time it was drawn by its parent; this may have changed @@ -10812,15 +10804,40 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Returns a ValueAnimator which can be used to run a reveal animation, - * clipping the content of the view to a circle. + * Returns a ValueAnimator which can animate a clipping circle. + * <p> + * The View will be clipped to the animating circle. + * <p> + * Any shadow cast by the View will respect the circular clip from this animator. + * + * @param centerX The x coordinate of the center of the animating circle. + * @param centerY The y coordinate of the center of the animating circle. + * @param startRadius The starting radius of the animating circle. + * @param endRadius The ending radius of the animating circle. + */ + public final ValueAnimator createRevealAnimator(int centerX, int centerY, + float startRadius, float endRadius) { + return RevealAnimator.ofRevealCircle(this, centerX, centerY, + startRadius, endRadius, false); + } + + /** + * Returns a ValueAnimator which can animate a clearing circle. + * <p> + * The View is prevented from drawing within the circle, so the content + * behind the View shows through. + * + * @param centerX The x coordinate of the center of the animating circle. + * @param centerY The y coordinate of the center of the animating circle. + * @param startRadius The starting radius of the animating circle. + * @param endRadius The ending radius of the animating circle. * - * TODO: Make this a public API. * @hide */ - public final ValueAnimator createRevealAnimator(int x, int y, - float startRadius, float endRadius, boolean inverseClip) { - return RevealAnimator.ofRevealCircle(this, x, y, startRadius, endRadius, inverseClip); + public final ValueAnimator createClearCircleAnimator(int centerX, int centerY, + float startRadius, float endRadius) { + return RevealAnimator.ofRevealCircle(this, centerX, centerY, + startRadius, endRadius, true); } /** @@ -10853,8 +10870,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mOutline.set(outline); } - if (mDisplayList != null) { - mDisplayList.setOutline(mOutline); + if (mRenderNode != null) { + mRenderNode.setOutline(mOutline); } } @@ -10890,8 +10907,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } else { mPrivateFlags3 &= ~PFLAG3_CLIP_TO_OUTLINE; } - if (mDisplayList != null) { - mDisplayList.setClipToOutline(clipToOutline); + if (mRenderNode != null) { + mRenderNode.setClipToOutline(clipToOutline); } } } @@ -10903,8 +10920,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ public void setRevealClip(boolean shouldClip, boolean inverseClip, float x, float y, float radius) { - if (mDisplayList != null) { - mDisplayList.setRevealClip(shouldClip, inverseClip, x, y, radius); + if (mRenderNode != null) { + mRenderNode.setRevealClip(shouldClip, inverseClip, x, y, radius); // TODO: Handle this invalidate in a better way, or purely in native. invalidate(); } @@ -11016,7 +11033,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, final boolean matrixIsIdentity = mTransformationInfo == null || mTransformationInfo.mMatrixIsIdentity; if (matrixIsIdentity) { - if (mDisplayList != null) { + if (mRenderNode != null) { invalidateViewProperty(false, false); } else { final ViewParent p = mParent; @@ -11044,8 +11061,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mTop += offset; mBottom += offset; - if (mDisplayList != null) { - mDisplayList.offsetTopAndBottom(offset); + if (mRenderNode != null) { + mRenderNode.offsetTopAndBottom(offset); invalidateViewProperty(false, false); } else { if (!matrixIsIdentity) { @@ -11067,7 +11084,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, final boolean matrixIsIdentity = mTransformationInfo == null || mTransformationInfo.mMatrixIsIdentity; if (matrixIsIdentity) { - if (mDisplayList != null) { + if (mRenderNode != null) { invalidateViewProperty(false, false); } else { final ViewParent p = mParent; @@ -11092,8 +11109,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mLeft += offset; mRight += offset; - if (mDisplayList != null) { - mDisplayList.offsetLeftAndRight(offset); + if (mRenderNode != null) { + mRenderNode.offsetLeftAndRight(offset); invalidateViewProperty(false, false); } else { if (!matrixIsIdentity) { @@ -11536,7 +11553,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * list properties are not being used in this view */ void invalidateViewProperty(boolean invalidateParent, boolean forceRedraw) { - if (mDisplayList == null || (mPrivateFlags & PFLAG_DRAW_ANIMATION) == PFLAG_DRAW_ANIMATION) { + if (mRenderNode == null || (mPrivateFlags & PFLAG_DRAW_ANIMATION) == PFLAG_DRAW_ANIMATION) { if (invalidateParent) { invalidateParentCaches(); } @@ -13703,10 +13720,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mHardwareLayer.setLayerPaint(mLayerPaint); RenderNode displayList = mHardwareLayer.startRecording(); - if (getDisplayList(displayList, true) != displayList) { - throw new IllegalStateException("getDisplayList() didn't return" - + " the input displaylist for a hardware layer!"); - } + updateDisplayListIfDirty(displayList, true); mHardwareLayer.endRecording(mLocalDirtyRect); mLocalDirtyRect.setEmpty(); } @@ -13847,29 +13861,34 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * Otherwise, the same display list will be returned (after having been rendered into * along the way, depending on the invalidation state of the view). * - * @param displayList The previous version of this displayList, could be null. + * @param renderNode The previous version of this displayList, could be null. * @param isLayer Whether the requester of the display list is a layer. If so, * the view will avoid creating a layer inside the resulting display list. * @return A new or reused DisplayList object. */ - private RenderNode getDisplayList(RenderNode displayList, boolean isLayer) { + private void updateDisplayListIfDirty(@NonNull RenderNode renderNode, boolean isLayer) { final HardwareRenderer renderer = getHardwareRenderer(); + if (renderNode == null) { + throw new IllegalArgumentException("RenderNode must not be null"); + } if (renderer == null || !canHaveDisplayList()) { - return null; + // can't populate RenderNode, don't try + return; } - if (((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0 || - displayList == null || !displayList.isValid() || - (!isLayer && mRecreateDisplayList))) { + if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0 + || !renderNode.isValid() + || (!isLayer && mRecreateDisplayList)) { // Don't need to recreate the display list, just need to tell our // children to restore/recreate theirs - if (displayList != null && displayList.isValid() && - !isLayer && !mRecreateDisplayList) { + if (renderNode.isValid() + && !isLayer + && !mRecreateDisplayList) { mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID; mPrivateFlags &= ~PFLAG_DIRTY_MASK; dispatchGetDisplayList(); - return displayList; + return; // no work needed } if (!isLayer) { @@ -13877,20 +13896,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // we copy in child display lists into ours in drawChild() mRecreateDisplayList = true; } - if (displayList == null) { - displayList = RenderNode.create(getClass().getName()); - // If we're creating a new display list, make sure our parent gets invalidated - // since they will need to recreate their display list to account for this - // new child display list. - invalidateParentCaches(); - } boolean caching = false; int width = mRight - mLeft; int height = mBottom - mTop; int layerType = getLayerType(); - final HardwareCanvas canvas = displayList.start(width, height); + final HardwareCanvas canvas = renderNode.start(width, height); try { if (!isLayer && layerType != LAYER_TYPE_NONE) { @@ -13933,12 +13945,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } } finally { - displayList.end(renderer, canvas); - displayList.setCaching(caching); + renderNode.end(renderer, canvas); + renderNode.setCaching(caching); if (isLayer) { - displayList.setLeftTopRightBottom(0, 0, width, height); + renderNode.setLeftTopRightBottom(0, 0, width, height); } else { - setDisplayListProperties(displayList); + setDisplayListProperties(renderNode); } if (renderer != getHardwareRenderer()) { @@ -13953,26 +13965,25 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID; mPrivateFlags &= ~PFLAG_DIRTY_MASK; } - - return displayList; } /** - * <p>Returns a display list that can be used to draw this view again - * without executing its draw method.</p> + * Returns a RenderNode with View draw content recorded, which can be + * used to draw this view again without executing its draw method. * - * @return A DisplayList ready to replay, or null if caching is not enabled. + * @return A RenderNode ready to replay, or null if caching is not enabled. * * @hide */ public RenderNode getDisplayList() { - mDisplayList = getDisplayList(mDisplayList, false); - return mDisplayList; + ensureRenderNode(); + updateDisplayListIfDirty(mRenderNode, false); + return mRenderNode; } private void resetDisplayList() { - if (mDisplayList != null && mDisplayList.isValid()) { - mDisplayList.destroyDisplayListData(); + if (mRenderNode != null && mRenderNode.isValid()) { + mRenderNode.destroyDisplayListData(); } if (mBackgroundDisplayList != null && mBackgroundDisplayList.isValid()) { @@ -14670,9 +14681,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, transformToApply = parent.getChildTransformation(); } else { if ((mPrivateFlags3 & PFLAG3_VIEW_IS_ANIMATING_TRANSFORM) == - PFLAG3_VIEW_IS_ANIMATING_TRANSFORM && mDisplayList != null) { + PFLAG3_VIEW_IS_ANIMATING_TRANSFORM && mRenderNode != null) { // No longer animating: clear out old animation matrix - mDisplayList.setAnimationMatrix(null); + mRenderNode.setAnimationMatrix(null); mPrivateFlags3 &= ~PFLAG3_VIEW_IS_ANIMATING_TRANSFORM; } if (!useDisplayListProperties && @@ -15185,8 +15196,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if ((mPrivateFlags3 & PFLAG3_OUTLINE_DEFINED) == 0) { // Outline not currently define, query from background mOutline = background.getOutline(); - if (mDisplayList != null) { - mDisplayList.setOutline(mOutline); + if (mRenderNode != null) { + mRenderNode.setOutline(mOutline); } } } @@ -15522,8 +15533,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mTop = top; mRight = right; mBottom = bottom; - if (mDisplayList != null) { - mDisplayList.setLeftTopRightBottom(mLeft, mTop, mRight, mBottom); + if (mRenderNode != null) { + mRenderNode.setLeftTopRightBottom(mLeft, mTop, mRight, mBottom); } mPrivateFlags |= PFLAG_HAS_BOUNDS; @@ -19109,10 +19120,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } - class CheckForLongPress implements Runnable { - + private final class CheckForLongPress implements Runnable { private int mOriginalWindowAttachCount; + @Override public void run() { if (isPressed() && (mParent != null) && mOriginalWindowAttachCount == mWindowAttachCount) { @@ -19128,14 +19139,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } private final class CheckForTap implements Runnable { + public float x; + public float y; + + @Override public void run() { mPrivateFlags &= ~PFLAG_PREPRESSED; + setHotspot(R.attr.state_pressed, x, y); setPressed(true); checkForLongClick(ViewConfiguration.getTapTimeout()); } } private final class PerformClick implements Runnable { + @Override public void run() { performClick(); } @@ -19414,7 +19431,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } private final class UnsetPressedState implements Runnable { + @Override public void run() { + clearHotspot(R.attr.state_pressed); setPressed(false); } } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index aadaa7f0ea78..bcc82fbf8292 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -31,7 +31,6 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.os.Build; -import android.os.Bundle; import android.os.Parcelable; import android.os.SystemClock; import android.util.AttributeSet; @@ -3174,8 +3173,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager setBooleanFlag(FLAG_CLIP_CHILDREN, clipChildren); for (int i = 0; i < mChildrenCount; ++i) { View child = getChildAt(i); - if (child.mDisplayList != null) { - child.mDisplayList.setClipToBounds(clipChildren); + if (child.mRenderNode != null) { + child.mRenderNode.setClipToBounds(clipChildren); } } } @@ -4610,9 +4609,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final View v = children[i]; v.mTop += offset; v.mBottom += offset; - if (v.mDisplayList != null) { + if (v.mRenderNode != null) { invalidate = true; - v.mDisplayList.offsetTopAndBottom(offset); + v.mRenderNode.offsetTopAndBottom(offset); } } diff --git a/core/java/android/view/ViewPropertyAnimator.java b/core/java/android/view/ViewPropertyAnimator.java index 563ffb701cea..bbae0cad6d93 100644 --- a/core/java/android/view/ViewPropertyAnimator.java +++ b/core/java/android/view/ViewPropertyAnimator.java @@ -925,51 +925,51 @@ public class ViewPropertyAnimator { */ private void setValue(int propertyConstant, float value) { final View.TransformationInfo info = mView.mTransformationInfo; - final RenderNode displayList = mView.mDisplayList; + final RenderNode renderNode = mView.mRenderNode; switch (propertyConstant) { case TRANSLATION_X: info.mTranslationX = value; - if (displayList != null) displayList.setTranslationX(value); + if (renderNode != null) renderNode.setTranslationX(value); break; case TRANSLATION_Y: info.mTranslationY = value; - if (displayList != null) displayList.setTranslationY(value); + if (renderNode != null) renderNode.setTranslationY(value); break; case TRANSLATION_Z: info.mTranslationZ = value; - if (displayList != null) displayList.setTranslationZ(value); + if (renderNode != null) renderNode.setTranslationZ(value); break; case ROTATION: info.mRotation = value; - if (displayList != null) displayList.setRotation(value); + if (renderNode != null) renderNode.setRotation(value); break; case ROTATION_X: info.mRotationX = value; - if (displayList != null) displayList.setRotationX(value); + if (renderNode != null) renderNode.setRotationX(value); break; case ROTATION_Y: info.mRotationY = value; - if (displayList != null) displayList.setRotationY(value); + if (renderNode != null) renderNode.setRotationY(value); break; case SCALE_X: info.mScaleX = value; - if (displayList != null) displayList.setScaleX(value); + if (renderNode != null) renderNode.setScaleX(value); break; case SCALE_Y: info.mScaleY = value; - if (displayList != null) displayList.setScaleY(value); + if (renderNode != null) renderNode.setScaleY(value); break; case X: info.mTranslationX = value - mView.mLeft; - if (displayList != null) displayList.setTranslationX(value - mView.mLeft); + if (renderNode != null) renderNode.setTranslationX(value - mView.mLeft); break; case Y: info.mTranslationY = value - mView.mTop; - if (displayList != null) displayList.setTranslationY(value - mView.mTop); + if (renderNode != null) renderNode.setTranslationY(value - mView.mTop); break; case ALPHA: info.mAlpha = value; - if (displayList != null) displayList.setAlpha(value); + if (renderNode != null) renderNode.setAlpha(value); break; } } @@ -1093,7 +1093,7 @@ public class ViewPropertyAnimator { // Shouldn't happen, but just to play it safe return; } - boolean useDisplayListProperties = mView.mDisplayList != null; + boolean useRenderNodeProperties = mView.mRenderNode != null; // alpha requires slightly different treatment than the other (transform) properties. // The logic in setAlpha() is not simply setting mAlpha, plus the invalidation @@ -1101,7 +1101,7 @@ public class ViewPropertyAnimator { // We track what kinds of properties are set, and how alpha is handled when it is // set, and perform the invalidation steps appropriately. boolean alphaHandled = false; - if (!useDisplayListProperties) { + if (!useRenderNodeProperties) { mView.invalidateParentCaches(); } float fraction = animation.getAnimatedFraction(); @@ -1124,7 +1124,7 @@ public class ViewPropertyAnimator { } if ((propertyMask & TRANSFORM_MASK) != 0) { mView.mTransformationInfo.mMatrixDirty = true; - if (!useDisplayListProperties) { + if (!useRenderNodeProperties) { mView.mPrivateFlags |= View.PFLAG_DRAWN; // force another invalidation } } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index fd85df992c59..b617f68560d2 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1465,8 +1465,8 @@ public final class ViewRootImpl implements ViewParent, mWidth, mHeight); } mResizeBuffer.prepare(mWidth, mHeight, false); - RenderNode layerDisplayList = mResizeBuffer.startRecording(); - HardwareCanvas layerCanvas = layerDisplayList.start(mWidth, mHeight); + RenderNode layerRenderNode = mResizeBuffer.startRecording(); + HardwareCanvas layerCanvas = layerRenderNode.start(mWidth, mHeight); final int restoreCount = layerCanvas.save(); int yoff; @@ -1484,9 +1484,9 @@ public final class ViewRootImpl implements ViewParent, mTranslator.translateCanvas(layerCanvas); } - RenderNode displayList = mView.mDisplayList; - if (displayList != null && displayList.isValid()) { - layerCanvas.drawDisplayList(displayList, null, + RenderNode renderNode = mView.mRenderNode; + if (renderNode != null && renderNode.isValid()) { + layerCanvas.drawDisplayList(renderNode, null, RenderNode.FLAG_CLIP_CHILDREN); } else { mView.draw(layerCanvas); @@ -1499,9 +1499,9 @@ public final class ViewRootImpl implements ViewParent, com.android.internal.R.integer.config_mediumAnimTime); layerCanvas.restoreToCount(restoreCount); - layerDisplayList.end(mAttachInfo.mHardwareRenderer, layerCanvas); - layerDisplayList.setCaching(true); - layerDisplayList.setLeftTopRightBottom(0, 0, mWidth, mHeight); + layerRenderNode.end(mAttachInfo.mHardwareRenderer, layerCanvas); + layerRenderNode.setCaching(true); + layerRenderNode.setLeftTopRightBottom(0, 0, mWidth, mHeight); mTempRect.set(0, 0, mWidth, mHeight); mResizeBuffer.endRecording(mTempRect); mAttachInfo.mHardwareRenderer.flushLayerUpdates(); @@ -2178,9 +2178,9 @@ public final class ViewRootImpl implements ViewParent, * @hide */ void outputDisplayList(View view) { - RenderNode displayList = view.getDisplayList(); - if (displayList != null) { - displayList.output(); + RenderNode renderNode = view.getDisplayList(); + if (renderNode != null) { + renderNode.output(); } } @@ -5218,10 +5218,10 @@ public final class ViewRootImpl implements ViewParent, } private static void getGfxInfo(View view, int[] info) { - RenderNode displayList = view.mDisplayList; + RenderNode renderNode = view.mRenderNode; info[0]++; - if (displayList != null) { - info[1] += 0; /* TODO: Memory used by display lists */ + if (renderNode != null) { + info[1] += 0; /* TODO: Memory used by RenderNodes (properties + DisplayLists) */ } if (view instanceof ViewGroup) { diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index 64953f8f45f9..b47177a5a2f6 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -24,6 +24,7 @@ import android.database.DataSetObserver; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Handler; +import android.os.SystemClock; import android.text.TextUtils; import android.util.AttributeSet; import android.util.IntProperty; @@ -1225,6 +1226,15 @@ public class ListPopupWindow { forwarding = onTouchForwarded(event) || !onForwardingStopped(); } else { forwarding = onTouchObserved(event) && onForwardingStarted(); + + if (forwarding) { + // Make sure we cancel any ongoing source event stream. + final long now = SystemClock.uptimeMillis(); + final MotionEvent e = MotionEvent.obtain(now, now, MotionEvent.ACTION_CANCEL, + 0.0f, 0.0f, 0); + mSrc.onTouchEvent(e); + e.recycle(); + } } mForwarding = forwarding; diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java index 1eedc5d7b6c9..d8a6867569c8 100644 --- a/core/java/android/widget/SearchView.java +++ b/core/java/android/widget/SearchView.java @@ -1171,8 +1171,8 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { || !mOnQueryChangeListener.onQueryTextSubmit(query.toString())) { if (mSearchable != null) { launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, query.toString()); - setImeVisibility(false); } + setImeVisibility(false); dismissSuggestions(); } } diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 2d7949140ca1..4752da50d1f0 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -19,11 +19,14 @@ package com.android.internal.widget; import android.Manifest; import android.app.ActivityManagerNative; import android.app.admin.DevicePolicyManager; +import android.app.trust.TrustManager; import android.appwidget.AppWidgetManager; +import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.net.Uri; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; @@ -46,6 +49,8 @@ import com.google.android.collect.Lists; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -145,6 +150,8 @@ public class LockPatternUtils { private static final String LOCK_SCREEN_OWNER_INFO_ENABLED = Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED; + private static final String ENABLED_TRUST_AGENTS = "lockscreen.enabledtrustagents"; + private final Context mContext; private final ContentResolver mContentResolver; private DevicePolicyManager mDevicePolicyManager; @@ -167,6 +174,15 @@ public class LockPatternUtils { return mDevicePolicyManager; } + private TrustManager getTrustManager() { + TrustManager trust = (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE); + if (trust == null) { + Log.e(TAG, "Can't get TrustManagerService: is it running?", + new IllegalStateException("Stack trace:")); + } + return trust; + } + /** * @param contentResolver Used to look up and save settings. */ @@ -242,10 +258,14 @@ public class LockPatternUtils { */ public void reportFailedPasswordAttempt() { getDevicePolicyManager().reportFailedPasswordAttempt(getCurrentOrCallingUserId()); + getTrustManager().reportUnlockAttempt(false /* authenticated */, + getCurrentOrCallingUserId()); } public void reportSuccessfulPasswordAttempt() { getDevicePolicyManager().reportSuccessfulPasswordAttempt(getCurrentOrCallingUserId()); + getTrustManager().reportUnlockAttempt(true /* authenticated */, + getCurrentOrCallingUserId()); } public void setCurrentUser(int userId) { @@ -496,11 +516,12 @@ public class LockPatternUtils { */ public void saveLockPattern(List<LockPatternView.Cell> pattern, boolean isFallback) { try { - getLockSettings().setLockPattern(patternToString(pattern), getCurrentOrCallingUserId()); + int userId = getCurrentOrCallingUserId(); + getLockSettings().setLockPattern(patternToString(pattern), userId); DevicePolicyManager dpm = getDevicePolicyManager(); if (pattern != null) { - int userHandle = getCurrentOrCallingUserId(); + int userHandle = userId; if (userHandle == UserHandle.USER_OWNER) { String stringPattern = patternToString(pattern); updateEncryptionPassword(StorageManager.CRYPT_TYPE_PATTERN, stringPattern); @@ -511,18 +532,18 @@ public class LockPatternUtils { deleteGallery(); setLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); dpm.setActivePasswordState(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, - pattern.size(), 0, 0, 0, 0, 0, 0, getCurrentOrCallingUserId()); + pattern.size(), 0, 0, 0, 0, 0, 0, userId); } else { setLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK); setLong(PASSWORD_TYPE_ALTERNATE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); finishBiometricWeak(); dpm.setActivePasswordState(DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK, - 0, 0, 0, 0, 0, 0, 0, getCurrentOrCallingUserId()); + 0, 0, 0, 0, 0, 0, 0, userId); } } else { dpm.setActivePasswordState(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, 0, 0, - 0, 0, 0, 0, 0, getCurrentOrCallingUserId()); + 0, 0, 0, 0, 0, userId); } } catch (RemoteException re) { Log.e(TAG, "Couldn't save lock pattern " + re); @@ -1374,4 +1395,38 @@ public class LockPatternUtils { setBoolean(LOCKSCREEN_WIDGETS_ENABLED, enabled, userId); } + public void setEnabledTrustAgents(Collection<ComponentName> activeTrustAgents) { + setEnabledTrustAgents(activeTrustAgents, getCurrentOrCallingUserId()); + } + + public List<ComponentName> getEnabledTrustAgents() { + return getEnabledTrustAgents(getCurrentOrCallingUserId()); + } + + public void setEnabledTrustAgents(Collection<ComponentName> activeTrustAgents, int userId) { + StringBuilder sb = new StringBuilder(); + for (ComponentName cn : activeTrustAgents) { + if (sb.length() > 0) { + sb.append(','); + } + sb.append(cn.flattenToShortString()); + } + setString(ENABLED_TRUST_AGENTS, sb.toString(), userId); + getTrustManager().reportEnabledTrustAgentsChanged(getCurrentOrCallingUserId()); + } + + public List<ComponentName> getEnabledTrustAgents(int userId) { + String serialized = getString(ENABLED_TRUST_AGENTS, userId); + if (TextUtils.isEmpty(serialized)) { + return null; + } + String[] split = serialized.split(","); + ArrayList<ComponentName> activeTrustAgents = new ArrayList<ComponentName>(split.length); + for (String s : split) { + if (!TextUtils.isEmpty(s)) { + activeTrustAgents.add(ComponentName.unflattenFromString(s)); + } + } + return activeTrustAgents; + } } diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 58b61baa4318..307293f9a845 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -230,7 +230,7 @@ void JNICameraContext::copyAndPost(JNIEnv* env, const sp<IMemory>& dataPtr, int ssize_t offset; size_t size; sp<IMemoryHeap> heap = dataPtr->getMemory(&offset, &size); - ALOGV("copyAndPost: off=%ld, size=%d", offset, size); + ALOGV("copyAndPost: off=%zd, size=%zu", offset, size); uint8_t *heapBase = (uint8_t*)heap->base(); if (heapBase != NULL) { diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp index cc49059c6bb6..d8faaf30a5c7 100644 --- a/core/jni/android_media_AudioRecord.cpp +++ b/core/jni/android_media_AudioRecord.cpp @@ -220,7 +220,7 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this, lpCallbackData->audioRecord_ref = env->NewGlobalRef(weak_this); lpCallbackData->busy = false; - lpRecorder->set((audio_source_t) source, + const status_t status = lpRecorder->set((audio_source_t) source, sampleRateInHertz, format, // word length, PCM channelMask, @@ -231,7 +231,6 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this, true, // threadCanCallJava sessionId); - const status_t status = lpRecorder->initCheck(); if (status != NO_ERROR) { ALOGE("Error creating AudioRecord instance: initialization check failed with status %d.", status); @@ -312,7 +311,7 @@ static void android_media_AudioRecord_release(JNIEnv *env, jobject thiz) { if (lpRecorder == NULL) { return; } - ALOGV("About to delete lpRecorder: %" PRIxPTR "\n", lpRecorder.get()); + ALOGV("About to delete lpRecorder: %p", lpRecorder.get()); lpRecorder->stop(); audiorecord_callback_cookie *lpCookie = (audiorecord_callback_cookie *)env->GetLongField( @@ -325,7 +324,7 @@ static void android_media_AudioRecord_release(JNIEnv *env, jobject thiz) { // delete the callback information if (lpCookie) { Mutex::Autolock l(sLock); - ALOGV("deleting lpCookie: %" PRIxPTR "\n", lpCookie); + ALOGV("deleting lpCookie: %p", lpCookie); while (lpCookie->busy) { if (lpCookie->cond.waitRelative(sLock, milliseconds(CALLBACK_COND_WAIT_TIMEOUT_MS)) != diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index 9f997c0c6eba..79a46fa268d0 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -203,12 +203,17 @@ android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject weak_this, uint32_t afSampleRate; size_t afFrameCount; - if (AudioSystem::getOutputFrameCount(&afFrameCount, (audio_stream_type_t) streamType) != NO_ERROR) { - ALOGE("Error creating AudioTrack: Could not get AudioSystem frame count."); + status_t status = AudioSystem::getOutputFrameCount(&afFrameCount, + (audio_stream_type_t) streamType); + if (status != NO_ERROR) { + ALOGE("Error %d creating AudioTrack: Could not get AudioSystem frame count " + "for stream type %d.", status, streamType); return (jint) AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; } - if (AudioSystem::getOutputSamplingRate(&afSampleRate, (audio_stream_type_t) streamType) != NO_ERROR) { - ALOGE("Error creating AudioTrack: Could not get AudioSystem sampling rate."); + status = AudioSystem::getOutputSamplingRate(&afSampleRate, (audio_stream_type_t) streamType); + if (status != NO_ERROR) { + ALOGE("Error %d creating AudioTrack: Could not get AudioSystem sampling rate " + "for stream type %d.", status, streamType); return (jint) AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; } @@ -237,7 +242,7 @@ android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject weak_this, atStreamType = (audio_stream_type_t) streamType; break; default: - ALOGE("Error creating AudioTrack: unknown stream type."); + ALOGE("Error creating AudioTrack: unknown stream type %d.", streamType); return (jint) AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE; } @@ -245,8 +250,7 @@ android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject weak_this, // This function was called from Java, so we compare the format against the Java constants audio_format_t format = audioFormatToNative(audioFormat); if (format == AUDIO_FORMAT_INVALID) { - - ALOGE("Error creating AudioTrack: unsupported audio format."); + ALOGE("Error creating AudioTrack: unsupported audio format %d.", audioFormat); return (jint) AUDIOTRACK_ERROR_SETUP_INVALIDFORMAT; } @@ -303,7 +307,7 @@ android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject weak_this, switch (memoryMode) { case MODE_STREAM: - lpTrack->set( + status = lpTrack->set( atStreamType,// stream type sampleRateInHertz, format,// word length, PCM @@ -325,7 +329,7 @@ android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject weak_this, goto native_init_failure; } - lpTrack->set( + status = lpTrack->set( atStreamType,// stream type sampleRateInHertz, format,// word length, PCM @@ -344,8 +348,8 @@ android_media_AudioTrack_setup(JNIEnv *env, jobject thiz, jobject weak_this, goto native_init_failure; } - if (lpTrack->initCheck() != NO_ERROR) { - ALOGE("Error initializing AudioTrack"); + if (status != NO_ERROR) { + ALOGE("Error %d initializing AudioTrack", status); goto native_init_failure; } @@ -853,9 +857,10 @@ static jint android_media_AudioTrack_get_output_sample_rate(JNIEnv *env, jobjec break; } - if (AudioSystem::getOutputSamplingRate(&afSamplingRate, nativeStreamType) != NO_ERROR) { - ALOGE("AudioSystem::getOutputSamplingRate() for stream type %d failed in AudioTrack JNI", - nativeStreamType); + status_t status = AudioSystem::getOutputSamplingRate(&afSamplingRate, nativeStreamType); + if (status != NO_ERROR) { + ALOGE("Error %d in AudioSystem::getOutputSamplingRate() for stream type %d " + "in AudioTrack JNI", status, nativeStreamType); return DEFAULT_OUTPUT_SAMPLE_RATE; } else { return afSamplingRate; diff --git a/core/jni/android_view_GLRenderer.cpp b/core/jni/android_view_GLRenderer.cpp index e45c1b99156d..180c625f516c 100644 --- a/core/jni/android_view_GLRenderer.cpp +++ b/core/jni/android_view_GLRenderer.cpp @@ -26,6 +26,8 @@ #include <utils/Timers.h> +#include <private/hwui/DrawGlInfo.h> + #include <Caches.h> #include <Extensions.h> #include <LayerRenderer.h> @@ -155,6 +157,14 @@ static void android_view_GLRenderer_updateRenderNodeProperties(JNIEnv* env, jobj renderNode->updateProperties(); } +static void android_view_GLRenderer_invokeFunctor(JNIEnv* env, jobject clazz, + jlong functorPtr, jboolean hasContext) { + using namespace android::uirenderer; + Functor* functor = reinterpret_cast<Functor*>(functorPtr); + DrawGlInfo::Mode mode = hasContext ? DrawGlInfo::kModeProcess : DrawGlInfo::kModeProcessNoContext; + (*functor)(mode, NULL); +} + #endif // USE_OPENGL_RENDERER // ---------------------------------------------------------------------------- @@ -187,6 +197,7 @@ static JNINativeMethod gMethods[] = { { "nDestroyLayer", "(J)V", (void*) android_view_GLRenderer_destroyLayer }, { "nSetDisplayListData", "(JJ)V", (void*) android_view_GLRenderer_setDisplayListData }, { "nUpdateRenderNodeProperties", "(J)V", (void*) android_view_GLRenderer_updateRenderNodeProperties }, + { "nInvokeFunctor", "(JZ)V", (void*) android_view_GLRenderer_invokeFunctor }, #endif { "setupShadersDiskCache", "(Ljava/lang/String;)V", diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 28cee4b73238..98bec1bbd9bc 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -139,6 +139,13 @@ static void android_view_ThreadedRenderer_detachFunctor(JNIEnv* env, jobject cla proxy->detachFunctor(functor); } +static void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz, + jlong proxyPtr, jlong functorPtr, jboolean waitForCompletion) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + Functor* functor = reinterpret_cast<Functor*>(functorPtr); + proxy->invokeFunctor(functor, waitForCompletion); +} + static void android_view_ThreadedRenderer_runWithGlContext(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jrunnable) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); @@ -196,6 +203,7 @@ static JNINativeMethod gMethods[] = { { "nDestroyCanvas", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvas }, { "nAttachFunctor", "(JJ)V", (void*) android_view_ThreadedRenderer_attachFunctor }, { "nDetachFunctor", "(JJ)V", (void*) android_view_ThreadedRenderer_detachFunctor }, + { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext }, { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer }, { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer }, diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 2168bd1d69b5..2a4d872eb811 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2547,6 +2547,21 @@ android:label="@string/permlab_control_keyguard" android:description="@string/permdesc_control_keyguard" /> + <!-- Allows an application to listen to trust changes. Only allowed for system processes. + @hide --> + <permission android:name="android.permission.TRUST_LISTENER" + android:protectionLevel="signature" + android:label="@string/permlab_trust_listener" + android:description="@string/permdesc_trust_listener" /> + + <!-- Must be required by an {@link + android.service.trust.TrustAgentService}, + to ensure that only the system can bind to it. --> + <permission android:name="android.permission.BIND_TRUST_AGENT_SERVICE" + android:protectionLevel="signature" + android:label="@string/permlab_bind_trust_agent_service" + android:description="@string/permdesc_bind_trust_agent_service" /> + <!-- Must be required by an {@link android.service.notification.NotificationListenerService}, to ensure that only the system can bind to it. --> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index a59378fde128..80a4ed27a057 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -145,7 +145,7 @@ <string name="silent_mode" msgid="7167703389802618663">"Lautlos-Modus"</string> <string name="turn_on_radio" msgid="3912793092339962371">"Funk einschalten"</string> <string name="turn_off_radio" msgid="8198784949987062346">"Funk ausschalten"</string> - <string name="screen_lock" msgid="799094655496098153">"Display-Sperre"</string> + <string name="screen_lock" msgid="799094655496098153">"Displaysperre"</string> <string name="power_off" msgid="4266614107412865048">"Ausschalten"</string> <string name="silent_mode_silent" msgid="319298163018473078">"Klingelton aus"</string> <string name="silent_mode_vibrate" msgid="7072043388581551395">"Klingeltonmodus \"Vibration\""</string> @@ -160,7 +160,7 @@ <string name="no_recent_tasks" msgid="8794906658732193473">"Keine kürzlich geöffneten Apps"</string> <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet-Optionen"</string> <string name="global_actions" product="default" msgid="2406416831541615258">"Telefonoptionen"</string> - <string name="global_action_lock" msgid="2844945191792119712">"Display-Sperre"</string> + <string name="global_action_lock" msgid="2844945191792119712">"Displaysperre"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Ausschalten"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Fehlerbericht"</string> <string name="bugreport_title" msgid="2667494803742548533">"Fehlerbericht abrufen"</string> @@ -633,7 +633,7 @@ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Ermöglicht der App, die Bluetooth-Konfiguration des Telefons einzusehen und Verbindungen mit gekoppelten Geräten herzustellen und zu akzeptieren."</string> <string name="permlab_nfc" msgid="4423351274757876953">"Nahfeldkommunikation steuern"</string> <string name="permdesc_nfc" msgid="7120611819401789907">"Ermöglicht der App die Kommunikation mit Tags für die Nahfeldkommunikation, Karten und Readern"</string> - <string name="permlab_disableKeyguard" msgid="3598496301486439258">"Display-Sperre deaktivieren"</string> + <string name="permlab_disableKeyguard" msgid="3598496301486439258">"Displaysperre deaktivieren"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ermöglicht der App, die Tastensperre sowie den damit verbundenen Passwortschutz zu deaktivieren. Das Telefon deaktiviert die Tastensperre beispielsweise, wenn ein Anruf eingeht, und aktiviert sie wieder, nachdem das Gespräch beendet wurde."</string> <string name="permlab_readSyncSettings" msgid="6201810008230503052">"Synchronisierungseinstellungen lesen"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ermöglicht der App, die Synchronisierungseinstellungen eines Kontos zu lesen. Beispielsweise kann damit festgestellt werden, ob Kontakte mit einem Konto synchronisiert werden."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 2c8b5d2d8764..899c4f929593 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -233,7 +233,7 @@ <string name="permgrouplab_display" msgid="4279909676036402636">"Používateľské rozhranie iných aplikácií"</string> <string name="permgroupdesc_display" msgid="6051002031933013714">"Vplyv na používateľské rozhranie ďalších aplikácií."</string> <string name="permgrouplab_storage" msgid="1971118770546336966">"Úložisko"</string> - <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Prístup do ukl. priestoru USB."</string> + <string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Prístup do úložiska USB."</string> <string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Prístup na kartu SD."</string> <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"Funkcie zjednodušenia ovládania"</string> <string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"Funkcie, ktoré môže vyžadovať nápomocná technológia."</string> @@ -347,7 +347,7 @@ <string name="permdesc_backup" msgid="6912230525140589891">"Umožňuje aplikácii ovládať mechanizmus na zálohovanie a obnovu údajov systému. Bežné aplikácie toto nastavenie nepoužívajú."</string> <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"potvrdenie operácie úplnej zálohy alebo úplného obnovenia"</string> <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Umožňuje aplikácii spustiť používateľské rozhranie potvrdenia úplnej zálohy. Toto nastavenie by nemala používať žiadna aplikácia."</string> - <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"zobrazenie neoprávnených okien"</string> + <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"zobraziť neoprávnené okná"</string> <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Umožňuje aplikácii vytvárať okná, ktoré majú byť použité interným systémom používateľského rozhrania. Bežné aplikácie toto nastavenie nepoužívajú."</string> <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"vykresliť cez ďalšie aplikácie"</string> <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Umožňuje aplikáciu vykresľovanie nad inými aplikáciami alebo súčasťami používateľského rozhrania. Táto funkcia môže zasahovať do vášho používania rozhrania inej aplikácie alebo meniť zobrazovaný obsah v iných aplikáciách."</string> @@ -474,9 +474,9 @@ <string name="permdesc_accessLocationExtraCommands" msgid="5945166642335800763">"Umožňuje aplikácii pristupovať k ďalším príkazom poskytovateľa informácií o polohe. Aplikácii to môže umožniť zasahovať do činnosti systému GPS alebo iných zdrojov informácií o polohe."</string> <string name="permlab_installLocationProvider" msgid="6578101199825193873">"Oprávnenie na inštaláciu poskytovateľa polohy"</string> <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Vytváranie simulovaných zdrojov polohy na testovanie alebo inštalácia nového poskytovateľa informácií o polohe. Aplikácii to umožní nahradiť polohu a stav, ktoré vracajú iné zdroje informácií o polohe, ako sú napríklad systém GPS alebo poskytovatelia informácií o polohe."</string> - <string name="permlab_accessFineLocation" msgid="1191898061965273372">"presná poloha (pomocou GPS a siete)"</string> + <string name="permlab_accessFineLocation" msgid="1191898061965273372">"zistiť presnú polohu (pomocou GPS a siete)"</string> <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Umožňuje aplikácii získať vašu presnú polohu pomocou systému GPS (Global Positioning System) alebo zdrojov určenia polohy siete, napríklad mobilných veží a sietí Wi-Fi. Tieto služby určovania polohy musia byť na vašom zariadení zapnuté a dostupné, inak ich aplikácia nebude môcť využívať. Aplikácie môžu tieto služby využívať na určenie vašej polohy. Tieto služby môžu zvýšiť spotrebu batérie."</string> - <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"približná poloha (pomocou siete)"</string> + <string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"zistiť približnú polohu (pomocou siete)"</string> <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Umožňuje aplikácii získať vašu približnú polohu. Táto poloha je odvodená zo služieb určovania polohy pomocou zdrojov určenia polohy siete, napríklad mobilných veží a sietí Wi-Fi. Tieto služby určovania polohy musia byť na vašom zariadení zapnuté a dostupné, inak ich aplikácia nebude môcť využívať. Aplikácie môžu tieto služby využívať na určenie vašej približnej polohy."</string> <string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"prístup k službe SurfaceFlinger"</string> <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Umožňuje aplikácii používať funkcie nízkej úrovne aplikácie SurfaceFlinger."</string> @@ -498,13 +498,13 @@ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Umožňuje aplikácii zachytiť a presmerovať zabezpečený výstup videa."</string> <string name="permlab_mediaContentControl" msgid="8749790560720562511">"ovládanie reprodukcie médií a prístup k metadátam"</string> <string name="permdesc_mediaContentControl" msgid="1637478200272062">"Umožňuje aplikácii ovládať reprodukciu médií a pristupovať k informáciám o médiách (názov, autor...)."</string> - <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"zmeny vašich nastavení zvuku"</string> + <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"meniť nastavenia zvuku"</string> <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Umožňuje aplikácii upraviť globálne nastavenia zvuku, ako je hlasitosť, alebo určiť, z ktorého reproduktora bude zvuk vychádzať."</string> - <string name="permlab_recordAudio" msgid="3876049771427466323">"záznam zvuku"</string> + <string name="permlab_recordAudio" msgid="3876049771427466323">"nahrávať zvuk"</string> <string name="permdesc_recordAudio" msgid="4906839301087980680">"Umožňuje aplikácii zaznamenávať zvuk pomocou mikrofónu. Toto povolenie umožňuje aplikácii zaznamenávať zvuk kedykoľvek bez vášho potvrdenia."</string> <string name="permlab_sim_communication" msgid="1180265879464893029">"komunikácia s kartou SIM"</string> <string name="permdesc_sim_communication" msgid="5725159654279639498">"Umožňuje aplikácii odosielať príkazy na kartu SIM. Toto je veľmi nebezpečné povolenie."</string> - <string name="permlab_camera" msgid="3616391919559751192">"snímanie fotografií a natáčanie videí"</string> + <string name="permlab_camera" msgid="3616391919559751192">"fotiť a nakrúcať videá"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Umožňuje aplikácii fotografovať a nahrávať videá pomocou fotoaparátu. Toto povolenie umožňuje aplikácii používať fotoaparát kedykoľvek a bez vášho potvrdenia."</string> <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"Zakázať indikátor LED prenosu pri používaní fotoaparátu"</string> <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Umožňuje v predinštalovanej systémovej aplikácii zakázať indikátor LED používania fotoaparátu."</string> @@ -534,7 +534,7 @@ <string name="permdesc_asec_rename" msgid="1794757588472127675">"Umožňuje aplikácii premenovať interné úložisko."</string> <string name="permlab_vibrate" msgid="7696427026057705834">"ovládať vibrovanie"</string> <string name="permdesc_vibrate" msgid="6284989245902300945">"Umožňuje aplikácii ovládať vibrácie."</string> - <string name="permlab_flashlight" msgid="2155920810121984215">"ovládanie kontrolky"</string> + <string name="permlab_flashlight" msgid="2155920810121984215">"ovládať kontrolku"</string> <string name="permdesc_flashlight" msgid="6522284794568368310">"Umožňuje aplikácii ovládať svetlo."</string> <string name="permlab_manageUsb" msgid="1113453430645402723">"spravovať predvoľby a povolenia zariadení USB"</string> <string name="permdesc_manageUsb" msgid="7776155430218239833">"Umožňuje aplikácii spravovať predvoľby a povolenia zariadení USB."</string> @@ -575,7 +575,7 @@ <string name="permlab_factoryTest" msgid="3715225492696416187">"spustenie v režime továrenského testu"</string> <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Umožňuje aplikácii spustenie v režime nízkoúrovňového testu výrobcu a povolí úplný prístup k hardvéru tabletu. K dispozícii iba vtedy, keď je tablet spustený v režime testovania výrobcu."</string> <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Umožňuje aplikácii spustenie v režime nízkoúrovňového testu výrobcu a povolí úplný prístup k hardvéru telefónu. K dispozícii iba vtedy, keď je telefón spustený v režime testovania výrobcu."</string> - <string name="permlab_setWallpaper" msgid="6627192333373465143">"nastavenie tapety"</string> + <string name="permlab_setWallpaper" msgid="6627192333373465143">"nastaviť tapetu"</string> <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Umožňuje aplikácii nastaviť tapetu systému."</string> <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"upraviť veľkosť tapety"</string> <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Umožňuje aplikácii nastaviť tipy pre veľkosť tapety systému."</string> @@ -610,7 +610,7 @@ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Umožňuje aplikácii zmeniť stav sieťového pripojenia zdieľaného pomocou tetheringu."</string> <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"zmeniť nastavenie použitia údajov na pozadí"</string> <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Umožňuje aplikácii zmeniť nastavenie používania údajov na pozadí."</string> - <string name="permlab_accessWifiState" msgid="5202012949247040011">"zobraziť pripojenia siete Wi-Fi"</string> + <string name="permlab_accessWifiState" msgid="5202012949247040011">"zobraziť pripojenia Wi-Fi"</string> <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Umožňuje aplikácii zobraziť informácie o sieťach Wi-Fi. Napríklad o tom, či je sieť Wi-Fi povolená alebo názvy pripojených zariadení Wi-Fi."</string> <string name="permlab_changeWifiState" msgid="6550641188749128035">"pripojiť a odpojiť od siete Wi-Fi"</string> <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Umožňuje aplikácii pripojiť sa na prístupové body siete Wi-Fi, odpojiť sa od nich a meniť konfiguráciu zariadení pre siete Wi-Fi."</string> @@ -631,19 +631,19 @@ <string name="permlab_bluetooth" msgid="6127769336339276828">"párovať so zariadeniami Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Umožňuje aplikácii zobraziť informácie o konfigurácii Bluetooth na tablete. Taktiež jej umožňuje nadväzovať a akceptovať spojenia so spárovanými zariadeniami."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Umožňuje aplikácii zobraziť informácie o konfigurácii Bluetooth na telefóne. Taktiež jej umožňuje nadväzovať a akceptovať spojenia so spárovanými zariadeniami."</string> - <string name="permlab_nfc" msgid="4423351274757876953">"ovládať technológiu Near Field Communication"</string> - <string name="permdesc_nfc" msgid="7120611819401789907">"Umožňuje aplikácii komunikovať so značkami, kartami a čítačkami s podporou technológie Near Field Communication (NFC)."</string> + <string name="permlab_nfc" msgid="4423351274757876953">"ovládať technológiu NFC"</string> + <string name="permdesc_nfc" msgid="7120611819401789907">"Umožňuje aplikácii komunikovať so značkami, kartami a čítačkami s podporou technológie NFC."</string> <string name="permlab_disableKeyguard" msgid="3598496301486439258">"deaktivácia zámky obrazovky"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Umožňuje aplikácii zakázať uzamknutie klávesnice a akékoľvek súvisiace zabezpečenie heslom. Príkladom je zakázanie uzamknutia klávesnice pri prichádzajúcom telefonickom hovore a jeho opätovné povolenie po skončení hovoru."</string> - <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čítanie nastavení synchronizácie"</string> + <string name="permlab_readSyncSettings" msgid="6201810008230503052">"čítať nastavenia synchronizácie"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Umožňuje aplikácii čítať nastavenia synchronizácie v účte. Môže napríklad určiť, či je s účtom synchronizovaná aplikácia Ľudia."</string> - <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"prepínať nastavenie synchronizácie medzi hodnotou zapnuté a vypnuté"</string> + <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"zapnúť alebo vypnúť synchronizáciu"</string> <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Umožňuje aplikácii upraviť nastavenia synchronizácie v účte. Pomocou tohto povolenia je možné napríklad povoliť synchronizáciu aplikácie Ľudia s účtom."</string> <string name="permlab_readSyncStats" msgid="7396577451360202448">"čítanie štatistických údajov o synchronizácii"</string> <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Umožňuje aplikácii čítať štatistické informácie o synchronizácii v účte vrátane histórie uskutočnených synchronizácií a informácií o množstve synchronizovaných údajov."</string> - <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"čítanie zdrojov prihlásených na odber"</string> + <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"čítať odoberané informačné kanály"</string> <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Umožňuje aplikácii získať podrobnosti o aktuálne synchronizovaných informačných kanáloch."</string> - <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"zápis odoberaných zdrojov"</string> + <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"zapisovať odoberané informačné kanály"</string> <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Umožňuje aplikácii upraviť vaše aktuálne synchronizované informačné kanály. Škodlivé aplikácie môžu synchronizované informačné kanály zmeniť."</string> <string name="permlab_readDictionary" msgid="4107101525746035718">"čítať výrazy pridané do slovníka"</string> <string name="permdesc_readDictionary" msgid="659614600338904243">"Umožňuje aplikácii čítať všetky slová, názvy a frázy, ktoré mohol používateľ uložiť do svojho slovníka."</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 999bc573b225..bd53e498428c 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -5925,6 +5925,16 @@ <attr name="settingsActivity" /> </declare-styleable> + <!-- Use <code>trust_agent</code> as the root tag of the XML resource that + describes an {@link android.service.trust.TrustAgentService}, which is + referenced from its {@link android.service.trust.TrustAgentService#TRUST_AGENT_META_DATA} + meta-data entry. Described here are the attributes that can be included in that tag. --> + <declare-styleable name="TrustAgent"> + <!-- Component name of an activity that allows the user to modify + the settings for this TrustAgent. --> + <attr name="settingsActivity" /> + </declare-styleable> + <!-- =============================== --> <!-- Accounts package class attributes --> <!-- =============================== --> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 16af9a999c2b..7ae5a037d16a 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1339,6 +1339,12 @@ Example: com.google.android.myapp/.resolver.MyResolverActivity --> <string name="config_customResolverActivity"></string> + <!-- Name of the activity that prompts the user to reject, accept, or whitelist + an adb host's public key, when an unwhitelisted host connects to the local adbd. + Can be customized for other product types --> + <string name="config_customAdbPublicKeyActivity" + >com.android.systemui/com.android.systemui.usb.UsbDebuggingActivity</string> + <!-- Apps that are authorized to access shared accounts, overridden by product overlays --> <string name="config_appsAuthorizedForSharedAccounts">;com.android.settings;</string> @@ -1421,4 +1427,5 @@ 1 - The device DOES have a permanent menu key; ignore autodetection. 2 - The device DOES NOT have a permanent menu key; ignore autodetection. --> <integer name="config_overrideHasPermanentMenuKey">0</integer> + </resources> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index d49980ffdf1b..d4692f17d3d2 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2365,4 +2365,6 @@ <public type="style" name="TextAppearance.Quantum.Caption" /> <public type="style" name="TextAppearance.Quantum.Menu" /> <public type="style" name="TextAppearance.Quantum.Button" /> + + <public type="style" name="Widget.Holo.Light.Button.Borderless" /> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 0699e8b4a4be..3a4f059a44fc 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3651,6 +3651,16 @@ <!-- Description of an application permission that lets it control keyguard. --> <string name="permdesc_control_keyguard">Allows an application to control keguard.</string> + <!-- Title of an application permission that lets it listen to trust state changes. --> + <string name="permlab_trust_listener">Listen to trust state changes.</string> + <!-- Description of an application permission that lets it listen to trust state changes. --> + <string name="permdesc_trust_listener">Allows an application to listen for changes in trust state.</string> + + <!-- Title of an application permission that lets it bind to a trust agent service. --> + <string name="permlab_bind_trust_agent_service">Bind to a trust agent service</string> + <!-- Description of an application permission that lets it bind to a trust agent service. --> + <string name="permdesc_bind_trust_agent_service">Allows an application to bind to a trust agent service.</string> + <!-- Title of an application permission that lets it interact with recovery. --> <string name="permlab_recovery">Interact with update and recovery system</string> <!-- Description of an application permission that lets it control keyguard. --> diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml index 512c9b8bd8ae..629b2b7d47a9 100644 --- a/core/res/res/values/styles_device_defaults.xml +++ b/core/res/res/values/styles_device_defaults.xml @@ -32,731 +32,271 @@ easier. --> <resources> <!-- Widget Styles --> - <style name="Widget.DeviceDefault" parent="Widget.Holo" > - - </style> - <style name="Widget.DeviceDefault.Button" parent="Widget.Holo.Button" > - - </style> - <style name="Widget.DeviceDefault.Button.Small" parent="Widget.Holo.Button.Small" > - - </style> - <style name="Widget.DeviceDefault.Button.Inset" parent="Widget.Holo.Button.Inset" > - - </style> - <style name="Widget.DeviceDefault.Button.Toggle" parent="Widget.Holo.Button.Toggle" > - - </style> - <style name="Widget.DeviceDefault.TextView" parent="Widget.Holo.TextView" > - - </style> - <style name="Widget.DeviceDefault.CheckedTextView" parent="Widget.Holo.CheckedTextView" > - - </style> - <style name="Widget.DeviceDefault.AutoCompleteTextView" parent="Widget.Holo.AutoCompleteTextView" > - - </style> - <style name="Widget.DeviceDefault.CompoundButton.CheckBox" parent="Widget.Holo.CompoundButton.CheckBox" > - - </style> - <style name="Widget.DeviceDefault.ListView.DropDown" parent="Widget.Holo.ListView.DropDown" > - - </style> - <style name="Widget.DeviceDefault.EditText" parent="Widget.Holo.EditText" > - - </style> - <style name="Widget.DeviceDefault.ExpandableListView" parent="Widget.Holo.ExpandableListView" > - - </style> - <style name="Widget.DeviceDefault.GridView" parent="Widget.Holo.GridView" > - - </style> - <style name="Widget.DeviceDefault.ImageButton" parent="Widget.Holo.ImageButton" > - - </style> - <style name="Widget.DeviceDefault.ListView" parent="Widget.Holo.ListView" > - - </style> - <style name="Widget.DeviceDefault.PopupWindow" parent="Widget.Holo.PopupWindow" > - - </style> - <style name="Widget.DeviceDefault.ProgressBar" parent="Widget.Holo.ProgressBar" > - - </style> - <style name="Widget.DeviceDefault.ProgressBar.Horizontal" parent="Widget.Holo.ProgressBar.Horizontal" > - - </style> - <style name="Widget.DeviceDefault.ProgressBar.Small" parent="Widget.Holo.ProgressBar.Small" > - - </style> - <style name="Widget.DeviceDefault.ProgressBar.Small.Title" parent="Widget.Holo.ProgressBar.Small.Title" > - - </style> - <style name="Widget.DeviceDefault.ProgressBar.Large" parent="Widget.Holo.ProgressBar.Large" > - - </style> - <style name="Widget.DeviceDefault.SeekBar" parent="Widget.Holo.SeekBar" > - - </style> - <style name="Widget.DeviceDefault.RatingBar" parent="Widget.Holo.RatingBar" > - - </style> - <style name="Widget.DeviceDefault.RatingBar.Indicator" parent="Widget.Holo.RatingBar.Indicator" > - - </style> - <style name="Widget.DeviceDefault.RatingBar.Small" parent="Widget.Holo.RatingBar.Small" > - - </style> - <style name="Widget.DeviceDefault.CompoundButton.RadioButton" parent="Widget.Holo.CompoundButton.RadioButton" > - - </style> - <style name="Widget.DeviceDefault.ScrollView" parent="Widget.Holo.ScrollView" > - - </style> - <style name="Widget.DeviceDefault.HorizontalScrollView" parent="Widget.Holo.HorizontalScrollView" > - - </style> - <style name="Widget.DeviceDefault.Spinner" parent="Widget.Holo.Spinner" > - - </style> - <style name="Widget.DeviceDefault.CompoundButton.Star" parent="Widget.Holo.CompoundButton.Star" > - - </style> - <style name="Widget.DeviceDefault.TabWidget" parent="Widget.Holo.TabWidget" > - - </style> - <style name="Widget.DeviceDefault.WebTextView" parent="Widget.Holo.WebTextView" > - - </style> - <style name="Widget.DeviceDefault.WebView" parent="Widget.Holo.WebView" > - - </style> - <style name="Widget.DeviceDefault.DropDownItem" parent="Widget.Holo.DropDownItem" > - - </style> - <style name="Widget.DeviceDefault.DropDownItem.Spinner" parent="Widget.Holo.DropDownItem.Spinner" > - - </style> - <style name="Widget.DeviceDefault.TextView.SpinnerItem" parent="Widget.Holo.TextView.SpinnerItem" > - - </style> - <style name="Widget.DeviceDefault.ListPopupWindow" parent="Widget.Holo.ListPopupWindow" > - - </style> - <style name="Widget.DeviceDefault.PopupMenu" parent="Widget.Holo.PopupMenu" > - - </style> - <style name="Widget.DeviceDefault.ActionButton" parent="Widget.Holo.ActionButton" > - - </style> - <style name="Widget.DeviceDefault.ActionButton.Overflow" parent="Widget.Holo.ActionButton.Overflow" > - - </style> - <style name="Widget.DeviceDefault.ActionButton.TextButton" parent="Widget.Holo.ActionButton.TextButton" > - - </style> - <style name="Widget.DeviceDefault.ActionMode" parent="Widget.Holo.ActionMode" > - - </style> - <style name="Widget.DeviceDefault.ActionButton.CloseMode" parent="Widget.Holo.ActionButton.CloseMode" > - - </style> - <style name="Widget.DeviceDefault.ActionBar" parent="Widget.Holo.ActionBar" > - - </style> - <style name="Widget.DeviceDefault.Button.Borderless" parent="Widget.Holo.Button.Borderless" > - - </style> - <style name="Widget.DeviceDefault.Tab" parent="Widget.Holo.Tab" > - - </style> - <style name="Widget.DeviceDefault.CalendarView" parent="Widget.Holo.CalendarView" > - - </style> - <style name="Widget.DeviceDefault.DatePicker" parent="Widget.Holo.DatePicker" > - - </style> - <style name="Widget.DeviceDefault.ActionBar.TabView" parent="Widget.Holo.ActionBar.TabView" > - - </style> - <style name="Widget.DeviceDefault.ActionBar.TabText" parent="Widget.Holo.ActionBar.TabText" > - - </style> - <style name="Widget.DeviceDefault.ActionBar.TabBar" parent="Widget.Holo.ActionBar.TabBar" > - - </style> - <style name="Widget.DeviceDefault.ActionBar.Solid" parent="Widget.Holo.ActionBar.Solid" > - - </style> - <style name="Widget.DeviceDefault.Button.Borderless.Small" parent="Widget.Holo.Button.Borderless.Small" > - - </style> - <style name="Widget.DeviceDefault.AbsListView" parent="Widget.Holo.AbsListView" > - - </style> - <style name="Widget.DeviceDefault.Spinner.DropDown.ActionBar" parent="Widget.Holo.Spinner.DropDown.ActionBar" > - - </style> - <style name="Widget.DeviceDefault.PopupWindow.ActionMode" parent="Widget.Holo.PopupWindow.ActionMode" > - - </style> - <style name="Widget.DeviceDefault.CompoundButton.Switch" parent="Widget.Holo.CompoundButton.Switch"> - - </style> - <style name="Widget.DeviceDefault.ExpandableListView.White" parent="Widget.Holo.ExpandableListView.White"> - - </style> - <style name="Widget.DeviceDefault.FastScroll" parent="Widget.Holo.FastScroll"> - - </style> - <style name="Widget.DeviceDefault.FragmentBreadCrumbs" parent="Widget.Holo.FragmentBreadCrumbs"> - - </style> - <style name="Widget.DeviceDefault.Gallery" parent="Widget.Holo.Gallery"> - - </style> - <style name="Widget.DeviceDefault.GestureOverlayView" parent="Widget.Holo.GestureOverlayView"> - - </style> - <style name="Widget.DeviceDefault.ImageWell" parent="Widget.Holo.ImageWell"> - - </style> - <style name="Widget.DeviceDefault.KeyboardView" parent="Widget.Holo.KeyboardView"> - - </style> - <style name="Widget.DeviceDefault.ListView.White" parent="Widget.Holo.ListView.White"> - - </style> - <style name="Widget.DeviceDefault.NumberPicker" parent="Widget.Holo.NumberPicker"> - - </style> - <style name="Widget.DeviceDefault.PreferenceFrameLayout" parent="Widget.Holo.PreferenceFrameLayout"> - - </style> - <style name="Widget.DeviceDefault.ProgressBar.Inverse" parent="Widget.Holo.ProgressBar.Inverse"> - - - </style> - <style name="Widget.DeviceDefault.ProgressBar.Large.Inverse" parent="Widget.Holo.ProgressBar.Large.Inverse"> - - </style> - <style name="Widget.DeviceDefault.ProgressBar.Small.Inverse" parent="Widget.Holo.ProgressBar.Small.Inverse"> - - </style> - <style name="Widget.DeviceDefault.QuickContactBadge.WindowLarge" parent="Widget.Holo.QuickContactBadge.WindowLarge"> - - </style> - <style name="Widget.DeviceDefault.QuickContactBadge.WindowMedium" parent="Widget.Holo.QuickContactBadge.WindowMedium"> - - </style> - <style name="Widget.DeviceDefault.QuickContactBadge.WindowSmall" parent="Widget.Holo.QuickContactBadge.WindowSmall"> - - </style> - <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowLarge" parent="Widget.Holo.QuickContactBadgeSmall.WindowLarge"> - - </style> - <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowMedium" parent="Widget.Holo.QuickContactBadgeSmall.WindowMedium"> - - </style> - <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowSmall" parent="Widget.Holo.QuickContactBadgeSmall.WindowSmall"> - - </style> - <style name="Widget.DeviceDefault.Spinner.DropDown" parent="Widget.Holo.Spinner.DropDown"> - - </style> - <style name="Widget.DeviceDefault.StackView" parent="Widget.Holo.StackView"> - - </style> - <style name="Widget.DeviceDefault.TextSelectHandle" parent="Widget.Holo.TextSelectHandle"> - - </style> - <style name="Widget.DeviceDefault.TextSuggestionsPopupWindow" parent="Widget.Holo.TextSuggestionsPopupWindow"> - - </style> - <style name="Widget.DeviceDefault.TextView.ListSeparator" parent="Widget.Holo.TextView.ListSeparator"> - - </style> - <style name="Widget.DeviceDefault.TimePicker" parent="Widget.Holo.TimePicker"> - - </style> - <style name="Widget.DeviceDefault.Light" parent="Widget.Holo.Light" > - - </style> - <style name="Widget.DeviceDefault.Light.Button" parent="Widget.Holo.Light.Button" > - - </style> - <style name="Widget.DeviceDefault.Light.Button.Small" parent="Widget.Holo.Light.Button.Small" > - - </style> - <style name="Widget.DeviceDefault.Light.Button.Inset" parent="Widget.Holo.Light.Button.Inset" > - - </style> - <style name="Widget.DeviceDefault.Light.Button.Toggle" parent="Widget.Holo.Light.Button.Toggle" > - - </style> - <style name="Widget.DeviceDefault.Light.TextView" parent="Widget.Holo.Light.TextView" > - - </style> - <style name="Widget.DeviceDefault.Light.CheckedTextView" parent="Widget.Holo.Light.CheckedTextView" > - - </style> - <style name="Widget.DeviceDefault.Light.AutoCompleteTextView" parent="Widget.Holo.Light.AutoCompleteTextView" > - - </style> - <style name="Widget.DeviceDefault.Light.CompoundButton.CheckBox" parent="Widget.Holo.Light.CompoundButton.CheckBox" > - - </style> - <style name="Widget.DeviceDefault.Light.ListView.DropDown" parent="Widget.Holo.Light.ListView.DropDown" > - - </style> - <style name="Widget.DeviceDefault.Light.EditText" parent="Widget.Holo.Light.EditText" > - - </style> - <style name="Widget.DeviceDefault.Light.ExpandableListView" parent="Widget.Holo.Light.ExpandableListView" > - - </style> - <style name="Widget.DeviceDefault.Light.FastScroll" parent="Widget.Holo.Light.FastScroll"> - - </style> - <style name="Widget.DeviceDefault.Light.FragmentBreadCrumbs" parent="Widget.Holo.Light.FragmentBreadCrumbs"> - - </style> - <style name="Widget.DeviceDefault.Light.GridView" parent="Widget.Holo.Light.GridView" > - - </style> - <style name="Widget.DeviceDefault.Light.ImageButton" parent="Widget.Holo.Light.ImageButton" > - - </style> - <style name="Widget.DeviceDefault.Light.ListView" parent="Widget.Holo.Light.ListView" > - - </style> - <style name="Widget.DeviceDefault.Light.PopupWindow" parent="Widget.Holo.Light.PopupWindow" > - - </style> - <style name="Widget.DeviceDefault.Light.ProgressBar" parent="Widget.Holo.Light.ProgressBar" > - - </style> - <style name="Widget.DeviceDefault.Light.ProgressBar.Horizontal" parent="Widget.Holo.Light.ProgressBar.Horizontal" > - - </style> - <style name="Widget.DeviceDefault.Light.ProgressBar.Small" parent="Widget.Holo.Light.ProgressBar.Small" > - - </style> - <style name="Widget.DeviceDefault.Light.ProgressBar.Small.Title" parent="Widget.Holo.Light.ProgressBar.Small.Title" > - - </style> - <style name="Widget.DeviceDefault.Light.ProgressBar.Large" parent="Widget.Holo.Light.ProgressBar.Large" > - - </style> - <style name="Widget.DeviceDefault.Light.ProgressBar.Inverse" parent="Widget.Holo.Light.ProgressBar.Inverse" > - - </style> - <style name="Widget.DeviceDefault.Light.ProgressBar.Small.Inverse" parent="Widget.Holo.Light.ProgressBar.Small.Inverse" > - - </style> - <style name="Widget.DeviceDefault.Light.ProgressBar.Large.Inverse" parent="Widget.Holo.Light.ProgressBar.Large.Inverse" > - - </style> - <style name="Widget.DeviceDefault.Light.SeekBar" parent="Widget.Holo.Light.SeekBar" > - - </style> - <style name="Widget.DeviceDefault.Light.RatingBar" parent="Widget.Holo.Light.RatingBar" > - - </style> - <style name="Widget.DeviceDefault.Light.RatingBar.Indicator" parent="Widget.Holo.Light.RatingBar.Indicator" > - - </style> - <style name="Widget.DeviceDefault.Light.RatingBar.Small" parent="Widget.Holo.Light.RatingBar.Small" > - - </style> - <style name="Widget.DeviceDefault.Light.CompoundButton.RadioButton" parent="Widget.Holo.Light.CompoundButton.RadioButton" > - - </style> - <style name="Widget.DeviceDefault.Light.ScrollView" parent="Widget.Holo.Light.ScrollView" > - - </style> - <style name="Widget.DeviceDefault.Light.HorizontalScrollView" parent="Widget.Holo.Light.HorizontalScrollView" > - - </style> - <style name="Widget.DeviceDefault.Light.Spinner" parent="Widget.Holo.Light.Spinner" > - - </style> - <style name="Widget.DeviceDefault.Light.CompoundButton.Star" parent="Widget.Holo.Light.CompoundButton.Star" > - - </style> - <style name="Widget.DeviceDefault.Light.TabWidget" parent="Widget.Holo.Light.TabWidget" > - - </style> - <style name="Widget.DeviceDefault.Light.WebTextView" parent="Widget.Holo.Light.WebTextView" > - - </style> - <style name="Widget.DeviceDefault.Light.WebView" parent="Widget.Holo.Light.WebView" > - - </style> - <style name="Widget.DeviceDefault.Light.DropDownItem" parent="Widget.Holo.Light.DropDownItem" > - - </style> - <style name="Widget.DeviceDefault.Light.DropDownItem.Spinner" parent="Widget.Holo.Light.DropDownItem.Spinner" > - - </style> - <style name="Widget.DeviceDefault.Light.TextView.SpinnerItem" parent="Widget.Holo.Light.TextView.SpinnerItem" > - - </style> - <style name="Widget.DeviceDefault.Light.ListPopupWindow" parent="Widget.Holo.Light.ListPopupWindow" > - - </style> - <style name="Widget.DeviceDefault.Light.PopupMenu" parent="Widget.Holo.Light.PopupMenu" > - - </style> - <style name="Widget.DeviceDefault.Light.Tab" parent="Widget.Holo.Light.Tab" > - - </style> - <style name="Widget.DeviceDefault.Light.CalendarView" parent="Widget.Holo.Light.CalendarView" > - - </style> - <style name="Widget.DeviceDefault.Light.Button.Borderless.Small" parent="Widget.Holo.Light.Button.Borderless.Small" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionButton" parent="Widget.Holo.Light.ActionButton" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionButton.Overflow" parent="Widget.Holo.Light.ActionButton.Overflow" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionMode" parent="Widget.Holo.Light.ActionMode" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionButton.CloseMode" parent="Widget.Holo.Light.ActionButton.CloseMode" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionBar" parent="Widget.Holo.Light.ActionBar" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionBar.TabView" parent="Widget.Holo.Light.ActionBar.TabView" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionBar.TabText" parent="Widget.Holo.Light.ActionBar.TabText" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionBar.TabBar" parent="Widget.Holo.Light.ActionBar.TabBar" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionBar.Solid" parent="Widget.Holo.Light.ActionBar.Solid" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionBar.Solid.Inverse" parent="Widget.Holo.Light.ActionBar.Solid.Inverse" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionBar.TabBar.Inverse" parent="Widget.Holo.Light.ActionBar.TabBar.Inverse" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionBar.TabView.Inverse" parent="Widget.Holo.Light.ActionBar.TabView.Inverse" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionBar.TabText.Inverse" parent="Widget.Holo.Light.ActionBar.TabText.Inverse" > - - </style> - <style name="Widget.DeviceDefault.Light.ActionMode.Inverse" parent="Widget.Holo.Light.ActionMode.Inverse" > - - </style> - <style name="Widget.DeviceDefault.Light.AbsListView" parent="Widget.Holo.Light.AbsListView" > - - </style> - <style name="Widget.DeviceDefault.Light.Spinner.DropDown.ActionBar" parent="Widget.Holo.Light.Spinner.DropDown.ActionBar" > - - </style> - <style name="Widget.DeviceDefault.Light.PopupWindow.ActionMode" parent="Widget.Holo.Light.PopupWindow.ActionMode" > - - </style> - <style name="Widget.DeviceDefault.Light.Button.Borderless" parent="Widget.Holo.Light.Button.Borderless"> - - </style> - <style name="Widget.DeviceDefault.Light.DatePicker" parent="Widget.Holo.Light.DatePicker"> - - </style> - <style name="Widget.DeviceDefault.Light.ExpandableListView.White" parent="Widget.Holo.Light.ExpandableListView.White"> - - </style> - <style name="Widget.DeviceDefault.Light.Gallery" parent="Widget.Holo.Light.Gallery"> - - </style> - <style name="Widget.DeviceDefault.Light.GestureOverlayView" parent="Widget.Holo.Light.GestureOverlayView"> - - </style> - <style name="Widget.DeviceDefault.Light.ImageWell" parent="Widget.Holo.Light.ImageWell"> - - </style> - <style name="Widget.DeviceDefault.Light.ListView.White" parent="Widget.Holo.Light.ListView.White"> - - </style> - <style name="Widget.DeviceDefault.Light.NumberPicker" parent="Widget.Holo.Light.NumberPicker"> - - </style> - <style name="Widget.DeviceDefault.Light.Spinner.DropDown" parent="Widget.Holo.Light.Spinner.DropDown"> - - </style> - <style name="Widget.DeviceDefault.Light.TextView.ListSeparator" parent="Widget.Holo.Light.TextView.ListSeparator"> - - </style> - <style name="Widget.DeviceDefault.Light.TimePicker" parent="Widget.Holo.Light.TimePicker"> - - </style> - <style name="Widget.DeviceDefault.Light.TextSuggestionsPopupWindow" parent="Widget.Holo.Light.TextSuggestionsPopupWindow"> - - </style> + <style name="Widget.DeviceDefault" parent="Widget.Quantum"/> + <style name="Widget.DeviceDefault.Button" parent="Widget.Quantum.Button"/> + <style name="Widget.DeviceDefault.Button.Small" parent="Widget.Quantum.Button.Small"/> + <style name="Widget.DeviceDefault.Button.Inset" parent="Widget.Quantum.Button.Inset"/> + <style name="Widget.DeviceDefault.Button.Toggle" parent="Widget.Quantum.Button.Toggle"/> + <style name="Widget.DeviceDefault.TextView" parent="Widget.Quantum.TextView"/> + <style name="Widget.DeviceDefault.CheckedTextView" parent="Widget.Quantum.CheckedTextView"/> + <style name="Widget.DeviceDefault.AutoCompleteTextView" parent="Widget.Quantum.AutoCompleteTextView"/> + <style name="Widget.DeviceDefault.CompoundButton.CheckBox" parent="Widget.Quantum.CompoundButton.CheckBox"/> + <style name="Widget.DeviceDefault.ListView.DropDown" parent="Widget.Quantum.ListView.DropDown"/> + <style name="Widget.DeviceDefault.EditText" parent="Widget.Quantum.EditText"/> + <style name="Widget.DeviceDefault.ExpandableListView" parent="Widget.Quantum.ExpandableListView"/> + <style name="Widget.DeviceDefault.GridView" parent="Widget.Quantum.GridView"/> + <style name="Widget.DeviceDefault.ImageButton" parent="Widget.Quantum.ImageButton"/> + <style name="Widget.DeviceDefault.ListView" parent="Widget.Quantum.ListView"/> + <style name="Widget.DeviceDefault.PopupWindow" parent="Widget.Quantum.PopupWindow"/> + <style name="Widget.DeviceDefault.ProgressBar" parent="Widget.Quantum.ProgressBar"/> + <style name="Widget.DeviceDefault.ProgressBar.Horizontal" parent="Widget.Quantum.ProgressBar.Horizontal"/> + <style name="Widget.DeviceDefault.ProgressBar.Small" parent="Widget.Quantum.ProgressBar.Small"/> + <style name="Widget.DeviceDefault.ProgressBar.Small.Title" parent="Widget.Quantum.ProgressBar.Small.Title"/> + <style name="Widget.DeviceDefault.ProgressBar.Large" parent="Widget.Quantum.ProgressBar.Large"/> + <style name="Widget.DeviceDefault.SeekBar" parent="Widget.Quantum.SeekBar"/> + <style name="Widget.DeviceDefault.RatingBar" parent="Widget.Quantum.RatingBar"/> + <style name="Widget.DeviceDefault.RatingBar.Indicator" parent="Widget.Quantum.RatingBar.Indicator"/> + <style name="Widget.DeviceDefault.RatingBar.Small" parent="Widget.Quantum.RatingBar.Small"/> + <style name="Widget.DeviceDefault.CompoundButton.RadioButton" parent="Widget.Quantum.CompoundButton.RadioButton"/> + <style name="Widget.DeviceDefault.ScrollView" parent="Widget.Quantum.ScrollView"/> + <style name="Widget.DeviceDefault.HorizontalScrollView" parent="Widget.Quantum.HorizontalScrollView"/> + <style name="Widget.DeviceDefault.Spinner" parent="Widget.Quantum.Spinner"/> + <style name="Widget.DeviceDefault.CompoundButton.Star" parent="Widget.Quantum.CompoundButton.Star"/> + <style name="Widget.DeviceDefault.TabWidget" parent="Widget.Quantum.TabWidget"/> + <style name="Widget.DeviceDefault.WebTextView" parent="Widget.Quantum.WebTextView"/> + <style name="Widget.DeviceDefault.WebView" parent="Widget.Quantum.WebView"/> + <style name="Widget.DeviceDefault.DropDownItem" parent="Widget.Quantum.DropDownItem"/> + <style name="Widget.DeviceDefault.DropDownItem.Spinner" parent="Widget.Quantum.DropDownItem.Spinner"/> + <style name="Widget.DeviceDefault.TextView.SpinnerItem" parent="Widget.Quantum.TextView.SpinnerItem"/> + <style name="Widget.DeviceDefault.ListPopupWindow" parent="Widget.Quantum.ListPopupWindow"/> + <style name="Widget.DeviceDefault.PopupMenu" parent="Widget.Quantum.PopupMenu"/> + <style name="Widget.DeviceDefault.ActionButton" parent="Widget.Quantum.ActionButton"/> + <style name="Widget.DeviceDefault.ActionButton.Overflow" parent="Widget.Quantum.ActionButton.Overflow"/> + <style name="Widget.DeviceDefault.ActionButton.TextButton" parent="Widget.Quantum.ActionButton.TextButton"/> + <style name="Widget.DeviceDefault.ActionMode" parent="Widget.Quantum.ActionMode"/> + <style name="Widget.DeviceDefault.ActionButton.CloseMode" parent="Widget.Quantum.ActionButton.CloseMode"/> + <style name="Widget.DeviceDefault.ActionBar" parent="Widget.Quantum.ActionBar"/> + <style name="Widget.DeviceDefault.Button.Borderless" parent="Widget.Quantum.Button.Borderless"/> + <style name="Widget.DeviceDefault.Tab" parent="Widget.Quantum.Tab"/> + <style name="Widget.DeviceDefault.CalendarView" parent="Widget.Quantum.CalendarView"/> + <style name="Widget.DeviceDefault.DatePicker" parent="Widget.Quantum.DatePicker"/> + <style name="Widget.DeviceDefault.ActionBar.TabView" parent="Widget.Quantum.ActionBar.TabView"/> + <style name="Widget.DeviceDefault.ActionBar.TabText" parent="Widget.Quantum.ActionBar.TabText"/> + <style name="Widget.DeviceDefault.ActionBar.TabBar" parent="Widget.Quantum.ActionBar.TabBar"/> + <style name="Widget.DeviceDefault.ActionBar.Solid" parent="Widget.Quantum.ActionBar.Solid"/> + <style name="Widget.DeviceDefault.Button.Borderless.Small" parent="Widget.Quantum.Button.Borderless.Small"/> + <style name="Widget.DeviceDefault.AbsListView" parent="Widget.Quantum.AbsListView"/> + <style name="Widget.DeviceDefault.Spinner.DropDown.ActionBar" parent="Widget.Quantum.Spinner.DropDown.ActionBar"/> + <style name="Widget.DeviceDefault.PopupWindow.ActionMode" parent="Widget.Quantum.PopupWindow.ActionMode"/> + <style name="Widget.DeviceDefault.CompoundButton.Switch" parent="Widget.Quantum.CompoundButton.Switch"/> + <style name="Widget.DeviceDefault.ExpandableListView.White" parent="Widget.Quantum.ExpandableListView.White"/> + <style name="Widget.DeviceDefault.FastScroll" parent="Widget.Quantum.FastScroll"/> + <style name="Widget.DeviceDefault.FragmentBreadCrumbs" parent="Widget.Quantum.FragmentBreadCrumbs"/> + <style name="Widget.DeviceDefault.Gallery" parent="Widget.Quantum.Gallery"/> + <style name="Widget.DeviceDefault.GestureOverlayView" parent="Widget.Quantum.GestureOverlayView"/> + <style name="Widget.DeviceDefault.ImageWell" parent="Widget.Quantum.ImageWell"/> + <style name="Widget.DeviceDefault.KeyboardView" parent="Widget.Quantum.KeyboardView"/> + <style name="Widget.DeviceDefault.ListView.White" parent="Widget.Quantum.ListView.White"/> + <style name="Widget.DeviceDefault.NumberPicker" parent="Widget.Quantum.NumberPicker"/> + <style name="Widget.DeviceDefault.PreferenceFrameLayout" parent="Widget.Quantum.PreferenceFrameLayout"/> + <style name="Widget.DeviceDefault.ProgressBar.Inverse" parent="Widget.Quantum.ProgressBar.Inverse"/> + <style name="Widget.DeviceDefault.ProgressBar.Large.Inverse" parent="Widget.Quantum.ProgressBar.Large.Inverse"/> + <style name="Widget.DeviceDefault.ProgressBar.Small.Inverse" parent="Widget.Quantum.ProgressBar.Small.Inverse"/> + <style name="Widget.DeviceDefault.QuickContactBadge.WindowLarge" parent="Widget.Quantum.QuickContactBadge.WindowLarge"/> + <style name="Widget.DeviceDefault.QuickContactBadge.WindowMedium" parent="Widget.Quantum.QuickContactBadge.WindowMedium"/> + <style name="Widget.DeviceDefault.QuickContactBadge.WindowSmall" parent="Widget.Quantum.QuickContactBadge.WindowSmall"/> + <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowLarge" parent="Widget.Quantum.QuickContactBadgeSmall.WindowLarge"/> + <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowMedium" parent="Widget.Quantum.QuickContactBadgeSmall.WindowMedium"/> + <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowSmall" parent="Widget.Quantum.QuickContactBadgeSmall.WindowSmall"/> + <style name="Widget.DeviceDefault.Spinner.DropDown" parent="Widget.Quantum.Spinner.DropDown"/> + <style name="Widget.DeviceDefault.StackView" parent="Widget.Quantum.StackView"/> + <style name="Widget.DeviceDefault.TextSelectHandle" parent="Widget.Quantum.TextSelectHandle"/> + <style name="Widget.DeviceDefault.TextSuggestionsPopupWindow" parent="Widget.Quantum.TextSuggestionsPopupWindow"/> + <style name="Widget.DeviceDefault.TextView.ListSeparator" parent="Widget.Quantum.TextView.ListSeparator"/> + <style name="Widget.DeviceDefault.TimePicker" parent="Widget.Quantum.TimePicker"/> + <style name="Widget.DeviceDefault.Light" parent="Widget.Quantum.Light"/> + <style name="Widget.DeviceDefault.Light.Button" parent="Widget.Quantum.Light.Button"/> + <style name="Widget.DeviceDefault.Light.Button.Small" parent="Widget.Quantum.Light.Button.Small"/> + <style name="Widget.DeviceDefault.Light.Button.Inset" parent="Widget.Quantum.Light.Button.Inset"/> + <style name="Widget.DeviceDefault.Light.Button.Toggle" parent="Widget.Quantum.Light.Button.Toggle"/> + <style name="Widget.DeviceDefault.Light.TextView" parent="Widget.Quantum.Light.TextView"/> + <style name="Widget.DeviceDefault.Light.CheckedTextView" parent="Widget.Quantum.Light.CheckedTextView"/> + <style name="Widget.DeviceDefault.Light.AutoCompleteTextView" parent="Widget.Quantum.Light.AutoCompleteTextView"/> + <style name="Widget.DeviceDefault.Light.CompoundButton.CheckBox" parent="Widget.Quantum.Light.CompoundButton.CheckBox"/> + <style name="Widget.DeviceDefault.Light.ListView.DropDown" parent="Widget.Quantum.Light.ListView.DropDown"/> + <style name="Widget.DeviceDefault.Light.EditText" parent="Widget.Quantum.Light.EditText"/> + <style name="Widget.DeviceDefault.Light.ExpandableListView" parent="Widget.Quantum.Light.ExpandableListView"/> + <style name="Widget.DeviceDefault.Light.FastScroll" parent="Widget.Quantum.Light.FastScroll"/> + <style name="Widget.DeviceDefault.Light.FragmentBreadCrumbs" parent="Widget.Quantum.Light.FragmentBreadCrumbs"/> + <style name="Widget.DeviceDefault.Light.GridView" parent="Widget.Quantum.Light.GridView"/> + <style name="Widget.DeviceDefault.Light.ImageButton" parent="Widget.Quantum.Light.ImageButton"/> + <style name="Widget.DeviceDefault.Light.ListView" parent="Widget.Quantum.Light.ListView"/> + <style name="Widget.DeviceDefault.Light.PopupWindow" parent="Widget.Quantum.Light.PopupWindow"/> + <style name="Widget.DeviceDefault.Light.ProgressBar" parent="Widget.Quantum.Light.ProgressBar"/> + <style name="Widget.DeviceDefault.Light.ProgressBar.Horizontal" parent="Widget.Quantum.Light.ProgressBar.Horizontal"/> + <style name="Widget.DeviceDefault.Light.ProgressBar.Small" parent="Widget.Quantum.Light.ProgressBar.Small"/> + <style name="Widget.DeviceDefault.Light.ProgressBar.Small.Title" parent="Widget.Quantum.Light.ProgressBar.Small.Title"/> + <style name="Widget.DeviceDefault.Light.ProgressBar.Large" parent="Widget.Quantum.Light.ProgressBar.Large"/> + <style name="Widget.DeviceDefault.Light.ProgressBar.Inverse" parent="Widget.Quantum.Light.ProgressBar.Inverse"/> + <style name="Widget.DeviceDefault.Light.ProgressBar.Small.Inverse" parent="Widget.Quantum.Light.ProgressBar.Small.Inverse"/> + <style name="Widget.DeviceDefault.Light.ProgressBar.Large.Inverse" parent="Widget.Quantum.Light.ProgressBar.Large.Inverse"/> + <style name="Widget.DeviceDefault.Light.SeekBar" parent="Widget.Quantum.Light.SeekBar"/> + <style name="Widget.DeviceDefault.Light.RatingBar" parent="Widget.Quantum.Light.RatingBar"/> + <style name="Widget.DeviceDefault.Light.RatingBar.Indicator" parent="Widget.Quantum.Light.RatingBar.Indicator"/> + <style name="Widget.DeviceDefault.Light.RatingBar.Small" parent="Widget.Quantum.Light.RatingBar.Small"/> + <style name="Widget.DeviceDefault.Light.CompoundButton.RadioButton" parent="Widget.Quantum.Light.CompoundButton.RadioButton"/> + <style name="Widget.DeviceDefault.Light.ScrollView" parent="Widget.Quantum.Light.ScrollView"/> + <style name="Widget.DeviceDefault.Light.HorizontalScrollView" parent="Widget.Quantum.Light.HorizontalScrollView"/> + <style name="Widget.DeviceDefault.Light.Spinner" parent="Widget.Quantum.Light.Spinner"/> + <style name="Widget.DeviceDefault.Light.CompoundButton.Star" parent="Widget.Quantum.Light.CompoundButton.Star"/> + <style name="Widget.DeviceDefault.Light.TabWidget" parent="Widget.Quantum.Light.TabWidget"/> + <style name="Widget.DeviceDefault.Light.WebTextView" parent="Widget.Quantum.Light.WebTextView"/> + <style name="Widget.DeviceDefault.Light.WebView" parent="Widget.Quantum.Light.WebView"/> + <style name="Widget.DeviceDefault.Light.DropDownItem" parent="Widget.Quantum.Light.DropDownItem"/> + <style name="Widget.DeviceDefault.Light.DropDownItem.Spinner" parent="Widget.Quantum.Light.DropDownItem.Spinner"/> + <style name="Widget.DeviceDefault.Light.TextView.SpinnerItem" parent="Widget.Quantum.Light.TextView.SpinnerItem"/> + <style name="Widget.DeviceDefault.Light.ListPopupWindow" parent="Widget.Quantum.Light.ListPopupWindow"/> + <style name="Widget.DeviceDefault.Light.PopupMenu" parent="Widget.Quantum.Light.PopupMenu"/> + <style name="Widget.DeviceDefault.Light.Tab" parent="Widget.Quantum.Light.Tab"/> + <style name="Widget.DeviceDefault.Light.CalendarView" parent="Widget.Quantum.Light.CalendarView"/> + <style name="Widget.DeviceDefault.Light.Button.Borderless.Small" parent="Widget.Quantum.Light.Button.Borderless.Small"/> + <style name="Widget.DeviceDefault.Light.ActionButton" parent="Widget.Quantum.Light.ActionButton"/> + <style name="Widget.DeviceDefault.Light.ActionButton.Overflow" parent="Widget.Quantum.Light.ActionButton.Overflow"/> + <style name="Widget.DeviceDefault.Light.ActionMode" parent="Widget.Quantum.Light.ActionMode"/> + <style name="Widget.DeviceDefault.Light.ActionButton.CloseMode" parent="Widget.Quantum.Light.ActionButton.CloseMode"/> + <style name="Widget.DeviceDefault.Light.ActionBar" parent="Widget.Quantum.Light.ActionBar"/> + <style name="Widget.DeviceDefault.Light.ActionBar.TabView" parent="Widget.Quantum.Light.ActionBar.TabView"/> + <style name="Widget.DeviceDefault.Light.ActionBar.TabText" parent="Widget.Quantum.Light.ActionBar.TabText"/> + <style name="Widget.DeviceDefault.Light.ActionBar.TabBar" parent="Widget.Quantum.Light.ActionBar.TabBar"/> + <style name="Widget.DeviceDefault.Light.ActionBar.Solid" parent="Widget.Quantum.Light.ActionBar.Solid"/> + <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. --> + <style name="Widget.DeviceDefault.Light.ActionBar.Solid.Inverse" parent="Widget.Holo.Light.ActionBar.Solid.Inverse"/> + <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. --> + <style name="Widget.DeviceDefault.Light.ActionBar.TabBar.Inverse" parent="Widget.Holo.Light.ActionBar.TabBar.Inverse"/> + <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. --> + <style name="Widget.DeviceDefault.Light.ActionBar.TabView.Inverse" parent="Widget.Holo.Light.ActionBar.TabView.Inverse"/> + <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. --> + <style name="Widget.DeviceDefault.Light.ActionBar.TabText.Inverse" parent="Widget.Holo.Light.ActionBar.TabText.Inverse"/> + <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. --> + <style name="Widget.DeviceDefault.Light.ActionMode.Inverse" parent="Widget.Holo.Light.ActionMode.Inverse"/> + <style name="Widget.DeviceDefault.Light.AbsListView" parent="Widget.Quantum.Light.AbsListView"/> + <style name="Widget.DeviceDefault.Light.Spinner.DropDown.ActionBar" parent="Widget.Quantum.Light.Spinner.DropDown.ActionBar"/> + <style name="Widget.DeviceDefault.Light.PopupWindow.ActionMode" parent="Widget.Quantum.Light.PopupWindow.ActionMode"/> + <style name="Widget.DeviceDefault.Light.Button.Borderless" parent="Widget.Quantum.Light.Button.Borderless"/> + <style name="Widget.DeviceDefault.Light.DatePicker" parent="Widget.Quantum.Light.DatePicker"/> + <style name="Widget.DeviceDefault.Light.ExpandableListView.White" parent="Widget.Quantum.Light.ExpandableListView.White"/> + <style name="Widget.DeviceDefault.Light.Gallery" parent="Widget.Quantum.Light.Gallery"/> + <style name="Widget.DeviceDefault.Light.GestureOverlayView" parent="Widget.Quantum.Light.GestureOverlayView"/> + <style name="Widget.DeviceDefault.Light.ImageWell" parent="Widget.Quantum.Light.ImageWell"/> + <style name="Widget.DeviceDefault.Light.ListView.White" parent="Widget.Quantum.Light.ListView.White"/> + <style name="Widget.DeviceDefault.Light.NumberPicker" parent="Widget.Quantum.Light.NumberPicker"/> + <style name="Widget.DeviceDefault.Light.Spinner.DropDown" parent="Widget.Quantum.Light.Spinner.DropDown"/> + <style name="Widget.DeviceDefault.Light.TextView.ListSeparator" parent="Widget.Quantum.Light.TextView.ListSeparator"/> + <style name="Widget.DeviceDefault.Light.TimePicker" parent="Widget.Quantum.Light.TimePicker"/> + <style name="Widget.DeviceDefault.Light.TextSuggestionsPopupWindow" parent="Widget.Quantum.Light.TextSuggestionsPopupWindow"/> <!-- Text Appearance Styles --> - <style name="TextAppearance.DeviceDefault" parent="TextAppearance.Holo" > - - </style> - <style name="TextAppearance.DeviceDefault.Inverse" parent="TextAppearance.Holo.Inverse" > - - </style> - <style name="TextAppearance.DeviceDefault.Large" parent="TextAppearance.Holo.Large" > - - </style> - <style name="TextAppearance.DeviceDefault.Large.Inverse" parent="TextAppearance.Holo.Large.Inverse" > - - </style> - <style name="TextAppearance.DeviceDefault.Medium" parent="TextAppearance.Holo.Medium" > - - </style> - <style name="TextAppearance.DeviceDefault.Medium.Inverse" parent="TextAppearance.Holo.Medium.Inverse" > - - </style> - <style name="TextAppearance.DeviceDefault.Small" parent="TextAppearance.Holo.Small" > - - </style> - <style name="TextAppearance.DeviceDefault.Small.Inverse" parent="TextAppearance.Holo.Small.Inverse" > - - </style> - <style name="TextAppearance.DeviceDefault.SearchResult.Title" parent="TextAppearance.Holo.SearchResult.Title" > - - </style> - <style name="TextAppearance.DeviceDefault.SearchResult.Subtitle" parent="TextAppearance.Holo.SearchResult.Subtitle" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget" parent="TextAppearance.Holo.Widget" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.Button" parent="TextAppearance.Holo.Widget.Button" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.IconMenu.Item" parent="TextAppearance.Holo.Widget.IconMenu.Item" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.TabWidget" parent="TextAppearance.Holo.Widget.TabWidget" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.TextView" parent="TextAppearance.Holo.Widget.TextView" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.TextView.PopupMenu" parent="TextAppearance.Holo.Widget.TextView.PopupMenu" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.DropDownHint" parent="TextAppearance.Holo.Widget.DropDownHint" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.DropDownItem" parent="TextAppearance.Holo.Widget.DropDownItem" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.TextView.SpinnerItem" parent="TextAppearance.Holo.Widget.TextView.SpinnerItem" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.EditText" parent="TextAppearance.Holo.Widget.EditText" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.PopupMenu" parent="TextAppearance.Holo.Widget.PopupMenu" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Large" parent="TextAppearance.Holo.Widget.PopupMenu.Large" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Small" parent="TextAppearance.Holo.Widget.PopupMenu.Small" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title" parent="TextAppearance.Holo.Widget.ActionBar.Title" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle" parent="TextAppearance.Holo.Widget.ActionBar.Subtitle" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Title" parent="TextAppearance.Holo.Widget.ActionMode.Title" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle" parent="TextAppearance.Holo.Widget.ActionMode.Subtitle" > - - </style> - <style name="TextAppearance.DeviceDefault.WindowTitle" parent="TextAppearance.Holo.WindowTitle" > - - </style> - <style name="TextAppearance.DeviceDefault.DialogWindowTitle" parent="TextAppearance.Holo.DialogWindowTitle" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse" parent="TextAppearance.Holo.Widget.ActionBar.Title.Inverse" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle.Inverse" parent="TextAppearance.Holo.Widget.ActionBar.Subtitle.Inverse" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Title.Inverse" parent="TextAppearance.Holo.Widget.ActionMode.Title.Inverse" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle.Inverse" parent="TextAppearance.Holo.Widget.ActionMode.Subtitle.Inverse" > - - </style> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Menu" parent="TextAppearance.Holo.Widget.ActionBar.Menu" > - - </style> - <style name="TextAppearance.DeviceDefault.Light" parent="TextAppearance.Holo.Light"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Inverse" parent="TextAppearance.Holo.Light.Inverse"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Large" parent="TextAppearance.Holo.Light.Large"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Large.Inverse" parent="TextAppearance.Holo.Light.Large.Inverse"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Medium" parent="TextAppearance.Holo.Light.Medium"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Medium.Inverse" parent="TextAppearance.Holo.Light.Medium.Inverse"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.SearchResult.Subtitle" parent="TextAppearance.Holo.Light.SearchResult.Subtitle"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.SearchResult.Title" parent="TextAppearance.Holo.Light.SearchResult.Title"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Small" parent="TextAppearance.Holo.Light.Small"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Small.Inverse" parent="TextAppearance.Holo.Light.Small.Inverse"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Widget.Button" parent="TextAppearance.Holo.Light.Widget.Button"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Widget.PopupMenu.Large" parent="TextAppearance.Holo.Light.Widget.PopupMenu.Large"> - - </style> - <style name="TextAppearance.DeviceDefault.Light.Widget.PopupMenu.Small" parent="TextAppearance.Holo.Light.Widget.PopupMenu.Small"> - - </style> + <style name="TextAppearance.DeviceDefault" parent="TextAppearance.Quantum"/> + <style name="TextAppearance.DeviceDefault.Inverse" parent="TextAppearance.Quantum.Inverse"/> + <style name="TextAppearance.DeviceDefault.Large" parent="TextAppearance.Quantum.Large"/> + <style name="TextAppearance.DeviceDefault.Large.Inverse" parent="TextAppearance.Quantum.Large.Inverse"/> + <style name="TextAppearance.DeviceDefault.Medium" parent="TextAppearance.Quantum.Medium"/> + <style name="TextAppearance.DeviceDefault.Medium.Inverse" parent="TextAppearance.Quantum.Medium.Inverse"/> + <style name="TextAppearance.DeviceDefault.Small" parent="TextAppearance.Quantum.Small"/> + <style name="TextAppearance.DeviceDefault.Small.Inverse" parent="TextAppearance.Quantum.Small.Inverse"/> + <style name="TextAppearance.DeviceDefault.SearchResult.Title" parent="TextAppearance.Quantum.SearchResult.Title"/> + <style name="TextAppearance.DeviceDefault.SearchResult.Subtitle" parent="TextAppearance.Quantum.SearchResult.Subtitle"/> + <style name="TextAppearance.DeviceDefault.Widget" parent="TextAppearance.Quantum.Widget"/> + <style name="TextAppearance.DeviceDefault.Widget.Button" parent="TextAppearance.Quantum.Widget.Button"/> + <style name="TextAppearance.DeviceDefault.Widget.IconMenu.Item" parent="TextAppearance.Quantum.Widget.IconMenu.Item"/> + <style name="TextAppearance.DeviceDefault.Widget.TabWidget" parent="TextAppearance.Quantum.Widget.TabWidget"/> + <style name="TextAppearance.DeviceDefault.Widget.TextView" parent="TextAppearance.Quantum.Widget.TextView"/> + <style name="TextAppearance.DeviceDefault.Widget.TextView.PopupMenu" parent="TextAppearance.Quantum.Widget.TextView.PopupMenu"/> + <style name="TextAppearance.DeviceDefault.Widget.DropDownHint" parent="TextAppearance.Quantum.Widget.DropDownHint"/> + <style name="TextAppearance.DeviceDefault.Widget.DropDownItem" parent="TextAppearance.Quantum.Widget.DropDownItem"/> + <style name="TextAppearance.DeviceDefault.Widget.TextView.SpinnerItem" parent="TextAppearance.Quantum.Widget.TextView.SpinnerItem"/> + <style name="TextAppearance.DeviceDefault.Widget.EditText" parent="TextAppearance.Quantum.Widget.EditText"/> + <style name="TextAppearance.DeviceDefault.Widget.PopupMenu" parent="TextAppearance.Quantum.Widget.PopupMenu"/> + <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Large" parent="TextAppearance.Quantum.Widget.PopupMenu.Large"/> + <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Small" parent="TextAppearance.Quantum.Widget.PopupMenu.Small"/> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title" parent="TextAppearance.Quantum.Widget.ActionBar.Title"/> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle" parent="TextAppearance.Quantum.Widget.ActionBar.Subtitle"/> + <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Title" parent="TextAppearance.Quantum.Widget.ActionMode.Title"/> + <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle" parent="TextAppearance.Quantum.Widget.ActionMode.Subtitle"/> + <style name="TextAppearance.DeviceDefault.WindowTitle" parent="TextAppearance.Quantum.WindowTitle"/> + <style name="TextAppearance.DeviceDefault.DialogWindowTitle" parent="TextAppearance.Quantum.DialogWindowTitle"/> + <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. --> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse" parent="TextAppearance.Quantum.Widget.ActionBar.Title.Inverse"/> + <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. --> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle.Inverse" parent="TextAppearance.Quantum.Widget.ActionBar.Subtitle.Inverse"/> + <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. --> + <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Title.Inverse" parent="TextAppearance.Quantum.Widget.ActionMode.Title.Inverse"/> + <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. --> + <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle.Inverse" parent="TextAppearance.Quantum.Widget.ActionMode.Subtitle.Inverse"/> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Menu" parent="TextAppearance.Quantum.Widget.ActionBar.Menu"/> + <style name="TextAppearance.DeviceDefault.Light" parent="TextAppearance.Quantum.Light"/> + <style name="TextAppearance.DeviceDefault.Light.Inverse" parent="TextAppearance.Quantum.Light.Inverse"/> + <style name="TextAppearance.DeviceDefault.Light.Large" parent="TextAppearance.Quantum.Light.Large"/> + <style name="TextAppearance.DeviceDefault.Light.Large.Inverse" parent="TextAppearance.Quantum.Light.Large.Inverse"/> + <style name="TextAppearance.DeviceDefault.Light.Medium" parent="TextAppearance.Quantum.Light.Medium"/> + <style name="TextAppearance.DeviceDefault.Light.Medium.Inverse" parent="TextAppearance.Quantum.Light.Medium.Inverse"/> + <style name="TextAppearance.DeviceDefault.Light.SearchResult.Subtitle" parent="TextAppearance.Quantum.Light.SearchResult.Subtitle"/> + <style name="TextAppearance.DeviceDefault.Light.SearchResult.Title" parent="TextAppearance.Quantum.Light.SearchResult.Title"/> + <style name="TextAppearance.DeviceDefault.Light.Small" parent="TextAppearance.Quantum.Light.Small"/> + <style name="TextAppearance.DeviceDefault.Light.Small.Inverse" parent="TextAppearance.Quantum.Light.Small.Inverse"/> + <style name="TextAppearance.DeviceDefault.Light.Widget.Button" parent="TextAppearance.Quantum.Light.Widget.Button"/> + <style name="TextAppearance.DeviceDefault.Light.Widget.PopupMenu.Large" parent="TextAppearance.Quantum.Light.Widget.PopupMenu.Large"/> + <style name="TextAppearance.DeviceDefault.Light.Widget.PopupMenu.Small" parent="TextAppearance.Quantum.Light.Widget.PopupMenu.Small"/> <!-- Preference Styles --> - <style name="Preference.DeviceDefault" parent="Preference.Holo"> - - </style> - <style name="Preference.DeviceDefault.Category" parent="Preference.Holo.Category"> - - </style> - <style name="Preference.DeviceDefault.CheckBoxPreference" parent="Preference.Holo.CheckBoxPreference"> - - </style> - <style name="Preference.DeviceDefault.DialogPreference" parent="Preference.Holo.DialogPreference"> - - </style> - <style name="Preference.DeviceDefault.DialogPreference.EditTextPreference" parent="Preference.Holo.DialogPreference.EditTextPreference"> - - </style> - <style name="Preference.DeviceDefault.DialogPreference.YesNoPreference" parent="Preference.Holo.DialogPreference.YesNoPreference"> - - </style> - <style name="Preference.DeviceDefault.Information" parent="Preference.Holo.Information"> - - </style> - <style name="Preference.DeviceDefault.PreferenceScreen" parent="Preference.Holo.PreferenceScreen"> - - </style> - <style name="Preference.DeviceDefault.RingtonePreference" parent="Preference.Holo.RingtonePreference"> - - </style> - <style name="Preference.DeviceDefault.SwitchPreference" parent="Preference.Holo.SwitchPreference"> - - </style> + <style name="Preference.DeviceDefault" parent="Preference.Quantum"/> + <style name="Preference.DeviceDefault.Category" parent="Preference.Quantum.Category"/> + <style name="Preference.DeviceDefault.CheckBoxPreference" parent="Preference.Quantum.CheckBoxPreference"/> + <style name="Preference.DeviceDefault.DialogPreference" parent="Preference.Quantum.DialogPreference"/> + <style name="Preference.DeviceDefault.DialogPreference.EditTextPreference" parent="Preference.Quantum.DialogPreference.EditTextPreference"/> + <style name="Preference.DeviceDefault.DialogPreference.YesNoPreference" parent="Preference.Quantum.DialogPreference.YesNoPreference"/> + <style name="Preference.DeviceDefault.Information" parent="Preference.Quantum.Information"/> + <style name="Preference.DeviceDefault.PreferenceScreen" parent="Preference.Quantum.PreferenceScreen"/> + <style name="Preference.DeviceDefault.RingtonePreference" parent="Preference.Quantum.RingtonePreference"/> + <style name="Preference.DeviceDefault.SwitchPreference" parent="Preference.Quantum.SwitchPreference"/> <!-- AlertDialog Styles --> - <style name="AlertDialog.DeviceDefault" parent="AlertDialog.Holo"> - - </style> - <style name="AlertDialog.DeviceDefault.Light" parent="AlertDialog.Holo.Light" > - - </style> + <style name="AlertDialog.DeviceDefault" parent="AlertDialog.Quantum"/> + <style name="AlertDialog.DeviceDefault.Light" parent="AlertDialog.Quantum.Light"/> <!-- Animation Styles --> - <style name="Animation.DeviceDefault.Activity" parent="Animation.Holo.Activity"> - - </style> - <style name="Animation.DeviceDefault.Dialog" parent="Animation.Holo.Dialog"> - - </style> + <style name="Animation.DeviceDefault.Activity" parent="Animation.Quantum.Activity"/> + <style name="Animation.DeviceDefault.Dialog" parent="Animation.Quantum.Dialog"/> <!-- DialogWindowTitle Styles --> - <style name="DialogWindowTitle.DeviceDefault" parent="DialogWindowTitle.Holo"> - - </style> - <style name="DialogWindowTitle.DeviceDefault.Light" parent="DialogWindowTitle.Holo.Light"> - - </style> + <style name="DialogWindowTitle.DeviceDefault" parent="DialogWindowTitle.Quantum"/> + <style name="DialogWindowTitle.DeviceDefault.Light" parent="DialogWindowTitle.Quantum.Light"/> <!-- WindowTitle Styles --> - <style name="WindowTitle.DeviceDefault" parent="WindowTitle.Holo"> - - </style> - <style name="WindowTitleBackground.DeviceDefault" parent="WindowTitleBackground.Holo"> - - </style> + <style name="WindowTitle.DeviceDefault" parent="WindowTitle.Quantum"/> + <style name="WindowTitleBackground.DeviceDefault" parent="WindowTitleBackground.Quantum"/> <!-- Other Styles --> - <style name="DeviceDefault.ButtonBar" parent="Holo.ButtonBar" > - - </style> - <style name="DeviceDefault.ButtonBar.AlertDialog" parent="Holo.ButtonBar.AlertDialog" > - - </style> - <style name="DeviceDefault.SegmentedButton" parent="Holo.SegmentedButton" > - - </style> - <style name="DeviceDefault.Light.ButtonBar" parent="Holo.Light.ButtonBar" > - - </style> - <style name="DeviceDefault.Light.ButtonBar.AlertDialog" parent="Holo.Light.ButtonBar.AlertDialog" > - - </style> - <style name="DeviceDefault.Light.SegmentedButton" parent="Holo.Light.SegmentedButton" > - - </style> - - <style name="Widget.DeviceDefault.MediaRouteButton" parent="Widget.Holo.MediaRouteButton" /> - <style name="Widget.DeviceDefault.Light.MediaRouteButton" parent="Widget.Holo.Light.MediaRouteButton" /> - - <style name="TextAppearance.DeviceDefault.TimePicker.TimeLabel" parent="TextAppearance.Holo.TimePicker.TimeLabel"> - </style> - - <style name="TextAppearance.DeviceDefault.Light.TimePicker.TimeLabel" parent="TextAppearance.Holo.Light.TimePicker.TimeLabel"> - </style> - - <style name="TextAppearance.DeviceDefault.TimePicker.AmPmLabel" parent="TextAppearance.Holo.TimePicker.AmPmLabel"> - </style> - - <style name="TextAppearance.DeviceDefault.Light.TimePicker.AmPmLabel" parent="TextAppearance.Holo.Light.TimePicker.AmPmLabel"> - </style> - - <style name="Theme.DeviceDefault.Dialog.TimePicker" parent="Theme.Holo.Dialog.TimePicker"> - </style> - - <style name="Theme.DeviceDefault.Light.Dialog.TimePicker" parent="Theme.Holo.Light.Dialog.TimePicker"> - </style> - + <style name="DeviceDefault.ButtonBar" parent="Widget.Quantum.ButtonBar"/> + <style name="DeviceDefault.ButtonBar.AlertDialog" parent="Widget.Quantum.ButtonBar.AlertDialog"/> + <style name="DeviceDefault.SegmentedButton" parent="Widget.Quantum.SegmentedButton"/> + <style name="DeviceDefault.Light.ButtonBar" parent="Widget.Quantum.Light.ButtonBar"/> + <style name="DeviceDefault.Light.ButtonBar.AlertDialog" parent="Widget.Quantum.Light.ButtonBar.AlertDialog"/> + <style name="DeviceDefault.Light.SegmentedButton" parent="Widget.Quantum.Light.SegmentedButton"/> + + <style name="Widget.DeviceDefault.MediaRouteButton" parent="Widget.Quantum.MediaRouteButton" /> + <style name="Widget.DeviceDefault.Light.MediaRouteButton" parent="Widget.Quantum.Light.MediaRouteButton" /> + + <style name="TextAppearance.DeviceDefault.TimePicker.TimeLabel" parent="TextAppearance.Quantum.TimePicker.TimeLabel"/> + <style name="TextAppearance.DeviceDefault.Light.TimePicker.TimeLabel" parent="TextAppearance.Quantum.Light.TimePicker.TimeLabel"/> + <style name="TextAppearance.DeviceDefault.TimePicker.AmPmLabel" parent="TextAppearance.Quantum.TimePicker.AmPmLabel"/> + <style name="TextAppearance.DeviceDefault.Light.TimePicker.AmPmLabel" parent="TextAppearance.Quantum.Light.TimePicker.AmPmLabel"/> + <style name="Theme.DeviceDefault.Dialog.TimePicker" parent="Theme.Quantum.Dialog.TimePicker"/> + <style name="Theme.DeviceDefault.Light.Dialog.TimePicker" parent="Theme.Quantum.Light.Dialog.TimePicker"/> </resources> diff --git a/core/res/res/values/styles_quantum.xml b/core/res/res/values/styles_quantum.xml index 2020feaab261..13edf6a9c961 100644 --- a/core/res/res/values/styles_quantum.xml +++ b/core/res/res/values/styles_quantum.xml @@ -277,20 +277,36 @@ please see styles_device_defaults.xml. <item name="textSize">@dimen/action_bar_title_text_size_quantum</item> </style> + <style name="TextAppearance.Quantum.Widget.ActionMode.Title.Inverse" parent="TextAppearance.Quantum.Medium.Inverse"> + <item name="textSize">@dimen/action_bar_title_text_size_quantum</item> + </style> + <style name="TextAppearance.Quantum.Widget.ActionMode.Subtitle" parent="TextAppearance.Quantum.Small"> <item name="textSize">@dimen/action_bar_subtitle_text_size_quantum</item> </style> + <style name="TextAppearance.Quantum.Widget.ActionMode.Subtitle.Inverse" parent="TextAppearance.Quantum.Small.Inverse"> + <item name="textSize">@dimen/action_bar_subtitle_text_size_quantum</item> + </style> + <!-- Text styles with no light versions --> <style name="TextAppearance.Quantum.Widget.ActionBar.Title" parent="TextAppearance.Quantum.Medium"> <item name="textSize">@dimen/action_bar_title_text_size_quantum</item> </style> + <style name="TextAppearance.Quantum.Widget.ActionBar.Title.Inverse" parent="TextAppearance.Quantum.Medium.Inverse"> + <item name="textSize">@dimen/action_bar_title_text_size_quantum</item> + </style> + <style name="TextAppearance.Quantum.Widget.ActionBar.Subtitle" parent="TextAppearance.Quantum.Small"> <item name="textSize">@dimen/action_bar_subtitle_text_size_quantum</item> </style> + <style name="TextAppearance.Quantum.Widget.ActionBar.Subtitle.Inverse" parent="TextAppearance.Quantum.Small.Inverse"> + <item name="textSize">@dimen/action_bar_subtitle_text_size_quantum</item> + </style> + <style name="TextAppearance.Quantum.Widget.ActionBar.Menu" parent="TextAppearance.Quantum.Small"> <item name="fontFamily">@string/font_family_menu_quantum</item> <item name="textSize">@dimen/text_size_menu_quantum</item>> @@ -298,6 +314,13 @@ please see styles_device_defaults.xml. <item name="textAllCaps">@bool/config_actionMenuItemAllCaps</item> </style> + <style name="TextAppearance.Quantum.Widget.ActionBar.Menu.Inverse" parent="TextAppearance.Quantum.Small.Inverse"> + <item name="fontFamily">@string/font_family_menu_quantum</item> + <item name="textSize">@dimen/text_size_menu_quantum</item>> + <item name="textColor">?attr/actionMenuTextColor</item> + <item name="textAllCaps">@bool/config_actionMenuItemAllCaps</item> + </style> + <style name="TextAppearance.Quantum.WindowTitle"> <item name="textColor">?attr/textColorPrimary</item> <item name="fontFamily">@string/font_family_headline_quantum</item> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index fa847507785d..557dce244293 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1622,6 +1622,7 @@ <java-symbol type="string" name="enable_explore_by_touch_warning_message" /> <java-symbol type="bool" name="config_powerDecoupleAutoSuspendModeFromDisplay" /> <java-symbol type="bool" name="config_powerDecoupleInteractiveModeFromDisplay" /> + <java-symbol type="string" name="config_customAdbPublicKeyActivity" /> <java-symbol type="layout" name="resolver_list" /> <java-symbol type="id" name="resolver_list" /> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 19556a1be990..f4a8882e1f60 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -32,24 +32,24 @@ easier. --> <resources> - <!-- The default theme for apps that target API level 14 and higher. + <!-- The default theme for apps that target API level XX and higher. <p>The DeviceDefault themes are aliases for a specific device’s native look and feel. The DeviceDefault theme family and widget style family offer ways for you to target your app to a device’s native theme with all device customizations intact.</p> - <p>For example, when you set your app's {@code targetSdkVersion} to 14 or higher, this + <p>For example, when you set your app's {@code targetSdkVersion} to XX or higher, this theme is applied to your application by default. As such, your app might appear with the - {@link #Theme_Holo Holo} styles on one device, but with a different set of styles on + {@link #Theme_Quantum.Light Quantum.Light} styles on one device, but with a different set of styles on another device. This is great if you want your app to fit with the device's native look and feel. If, however, you prefer to keep your UI style the same across all devices, you should - apply a specific theme such as {@link #Theme_Holo Holo} or one of your own design. For more - information, read <a - href="http://android-developers.blogspot.com/2012/01/holo-everywhere.html">Holo + apply a specific theme such as {@link #Theme_Quantum.Light Quantum.Light} or one of your own design. + For more information, read <a + href="http://android-developers.blogspot.com/20XX/XX/quantum-everywhere.html">Quantum.Light Everywhere</a>.</p> <p>Styles used by the DeviceDefault theme are named using the convention Type.DeviceDefault.Etc (for example, {@code Widget.DeviceDefault.Button} and {@code TextAppearance.DeviceDefault.Widget.PopupMenu.Large}).</p> --> - <style name="Theme.DeviceDefault" parent="Theme.Holo" > + <style name="Theme.DeviceDefault" parent="Theme.Quantum" > <!-- Text styles --> <item name="textAppearance">@android:style/TextAppearance.DeviceDefault</item> <item name="textAppearanceInverse">@android:style/TextAppearance.DeviceDefault.Inverse</item> @@ -210,29 +210,29 @@ easier. </style> <!-- Variant of {@link #Theme_DeviceDefault} with no action bar --> - <style name="Theme.DeviceDefault.NoActionBar" parent="Theme.Holo.NoActionBar" > + <style name="Theme.DeviceDefault.NoActionBar" parent="Theme.Quantum.NoActionBar" > </style> <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar. This theme sets {@link android.R.attr#windowFullscreen} to true. --> - <style name="Theme.DeviceDefault.NoActionBar.Fullscreen" parent="Theme.Holo.NoActionBar.Fullscreen" > + <style name="Theme.DeviceDefault.NoActionBar.Fullscreen" parent="Theme.Quantum.NoActionBar.Fullscreen" > </style> <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar and extending in to overscan region. This theme sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan} to true. --> - <style name="Theme.DeviceDefault.NoActionBar.Overscan" parent="Theme.Holo.NoActionBar.Overscan" > + <style name="Theme.DeviceDefault.NoActionBar.Overscan" parent="Theme.Quantum.NoActionBar.Overscan" > </style> <!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and {@link android.R.attr#windowTranslucentNavigation} to true. --> - <style name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" parent="Theme.Holo.NoActionBar.TranslucentDecor" > + <style name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" parent="Theme.Quantum.NoActionBar.TranslucentDecor" > </style> <!-- Variant of {@link #Theme_DeviceDefault} with a light-colored style --> - <style name="Theme.DeviceDefault.Light" parent="Theme.Holo.Light" > + <style name="Theme.DeviceDefault.Light" parent="Theme.Quantum.Light" > <!-- Text styles --> <item name="textAppearance">@android:style/TextAppearance.DeviceDefault.Light</item> <item name="textAppearanceInverse">@android:style/TextAppearance.DeviceDefault.Light.Inverse</item> @@ -387,29 +387,29 @@ easier. <item name="mediaRouteButtonStyle">@android:style/Widget.DeviceDefault.Light.MediaRouteButton</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar --> - <style name="Theme.DeviceDefault.Light.NoActionBar" parent="Theme.Holo.Light.NoActionBar" > + <style name="Theme.DeviceDefault.Light.NoActionBar" parent="Theme.Quantum.Light.NoActionBar" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar. This theme sets {@link android.R.attr#windowFullscreen} to true. --> - <style name="Theme.DeviceDefault.Light.NoActionBar.Fullscreen" parent="Theme.Holo.Light.NoActionBar.Fullscreen" > + <style name="Theme.DeviceDefault.Light.NoActionBar.Fullscreen" parent="Theme.Quantum.Light.NoActionBar.Fullscreen" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar and extending in to overscan region. This theme sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan} to true. --> <style name="Theme.DeviceDefault.Light.NoActionBar.Overscan" - parent="Theme.Holo.Light.NoActionBar.Overscan" > + parent="Theme.Quantum.Light.NoActionBar.Overscan" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} that has no title bar and translucent system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and {@link android.R.attr#windowTranslucentNavigation} to true. --> <style name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor" - parent="Theme.Holo.Light.NoActionBar.TranslucentDecor" > + parent="Theme.Quantum.Light.NoActionBar.TranslucentDecor" > </style> <!-- DeviceDefault theme for dialog windows and activities. This changes the window to be floating (not fill the entire screen), and puts a frame around its contents. You can set this theme on an activity if you would like to make an activity that looks like a Dialog. --> - <style name="Theme.DeviceDefault.Dialog" parent="Theme.Holo.Dialog" > + <style name="Theme.DeviceDefault.Dialog" parent="Theme.Quantum.Dialog" > <item name="android:windowTitleStyle">@android:style/DialogWindowTitle.DeviceDefault</item> <item name="android:windowAnimationStyle">@android:style/Animation.DeviceDefault.Dialog</item> @@ -421,16 +421,16 @@ easier. </style> <!-- Variant of {@link #Theme_DeviceDefault_Dialog} that has a nice minimum width for a regular dialog. --> - <style name="Theme.DeviceDefault.Dialog.MinWidth" parent="Theme.Holo.Dialog.MinWidth" > + <style name="Theme.DeviceDefault.Dialog.MinWidth" parent="Theme.Quantum.Dialog.MinWidth" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Dialog} without an action bar --> - <style name="Theme.DeviceDefault.Dialog.NoActionBar" parent="Theme.Holo.Dialog.NoActionBar" > + <style name="Theme.DeviceDefault.Dialog.NoActionBar" parent="Theme.Quantum.Dialog.NoActionBar" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Dialog_NoActionBar} that has a nice minimum width for a regular dialog. --> - <style name="Theme.DeviceDefault.Dialog.NoActionBar.MinWidth" parent="Theme.Holo.Dialog.NoActionBar.MinWidth" > + <style name="Theme.DeviceDefault.Dialog.NoActionBar.MinWidth" parent="Theme.Quantum.Dialog.NoActionBar.MinWidth" > </style> @@ -453,7 +453,7 @@ easier. <!-- DeviceDefault light theme for dialog windows and activities. This changes the window to be floating (not fill the entire screen), and puts a frame around its contents. You can set this theme on an activity if you would like to make an activity that looks like a Dialog.--> - <style name="Theme.DeviceDefault.Light.Dialog" parent="Theme.Holo.Light.Dialog" > + <style name="Theme.DeviceDefault.Light.Dialog" parent="Theme.Quantum.Light.Dialog" > <item name="android:windowTitleStyle">@android:style/DialogWindowTitle.DeviceDefault.Light</item> <item name="android:windowAnimationStyle">@android:style/Animation.DeviceDefault.Dialog</item> @@ -465,16 +465,16 @@ easier. </style> <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} that has a nice minimum width for a regular dialog. --> - <style name="Theme.DeviceDefault.Light.Dialog.MinWidth" parent="Theme.Holo.Light.Dialog.MinWidth" > + <style name="Theme.DeviceDefault.Light.Dialog.MinWidth" parent="Theme.Quantum.Light.Dialog.MinWidth" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} without an action bar --> - <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar" parent="Theme.Holo.Light.Dialog.NoActionBar" > + <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar" parent="Theme.Quantum.Light.Dialog.NoActionBar" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog_NoActionBar} that has a nice minimum width for a regular dialog. --> - <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth" parent="Theme.Holo.Light.Dialog.NoActionBar.MinWidth" > + <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth" parent="Theme.Quantum.Light.Dialog.NoActionBar.MinWidth" > </style> @@ -496,65 +496,65 @@ easier. <!-- DeviceDefault theme for a window that will be displayed either full-screen on smaller screens (small, normal) or as a dialog on larger screens (large, xlarge). --> - <style name="Theme.DeviceDefault.DialogWhenLarge" parent="Theme.Holo.DialogWhenLarge" > + <style name="Theme.DeviceDefault.DialogWhenLarge" parent="Theme.Quantum.DialogWhenLarge" > </style> <!-- DeviceDefault theme for a window without an action bar that will be displayed either full-screen on smaller screens (small, normal) or as a dialog on larger screens (large, xlarge). --> - <style name="Theme.DeviceDefault.DialogWhenLarge.NoActionBar" parent="Theme.Holo.DialogWhenLarge.NoActionBar" > + <style name="Theme.DeviceDefault.DialogWhenLarge.NoActionBar" parent="Theme.Quantum.DialogWhenLarge.NoActionBar" > </style> <!-- DeviceDefault light theme for a window that will be displayed either full-screen on smaller screens (small, normal) or as a dialog on larger screens (large, xlarge). --> - <style name="Theme.DeviceDefault.Light.DialogWhenLarge" parent="Theme.Holo.Light.DialogWhenLarge" > + <style name="Theme.DeviceDefault.Light.DialogWhenLarge" parent="Theme.Quantum.Light.DialogWhenLarge" > </style> <!-- DeviceDefault light theme for a window without an action bar that will be displayed either full-screen on smaller screens (small, normal) or as a dialog on larger screens (large, xlarge). --> - <style name="Theme.DeviceDefault.Light.DialogWhenLarge.NoActionBar" parent="Theme.Holo.Light.DialogWhenLarge.NoActionBar" > + <style name="Theme.DeviceDefault.Light.DialogWhenLarge.NoActionBar" parent="Theme.Quantum.Light.DialogWhenLarge.NoActionBar" > </style> <!-- DeviceDefault theme for a presentation window on a secondary display. --> - <style name="Theme.DeviceDefault.Dialog.Presentation" parent="Theme.Holo.Dialog.Presentation"> + <style name="Theme.DeviceDefault.Dialog.Presentation" parent="Theme.Quantum.Dialog.Presentation"> </style> <!-- DeviceDefault light theme for a presentation window on a secondary display. --> - <style name="Theme.DeviceDefault.Light.Dialog.Presentation" parent="Theme.Holo.Light.Dialog.Presentation"> + <style name="Theme.DeviceDefault.Light.Dialog.Presentation" parent="Theme.Quantum.Light.Dialog.Presentation"> </style> <!-- DeviceDefault theme for panel windows. This removes all extraneous window decorations, so you basically have an empty rectangle in which to place your content. It makes the window floating, with a transparent background, and turns off dimming behind the window. --> - <style name="Theme.DeviceDefault.Panel" parent="Theme.Holo.Panel" > + <style name="Theme.DeviceDefault.Panel" parent="Theme.Quantum.Panel" > </style> <!-- DeviceDefault light theme for panel windows. This removes all extraneous window decorations, so you basically have an empty rectangle in which to place your content. It makes the window floating, with a transparent background, and turns off dimming behind the window. --> - <style name="Theme.DeviceDefault.Light.Panel" parent="Theme.Holo.Light.Panel" > + <style name="Theme.DeviceDefault.Light.Panel" parent="Theme.Quantum.Light.Panel" > </style> <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear behind them. --> - <style name="Theme.DeviceDefault.Wallpaper" parent="Theme.Holo.Wallpaper" > + <style name="Theme.DeviceDefault.Wallpaper" parent="Theme.Quantum.Wallpaper" > </style> <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear behind them and without an action bar. --> - <style name="Theme.DeviceDefault.Wallpaper.NoTitleBar" parent="Theme.Holo.Wallpaper.NoTitleBar" > + <style name="Theme.DeviceDefault.Wallpaper.NoTitleBar" parent="Theme.Quantum.Wallpaper.NoTitleBar" > </style> <!-- DeviceDefault style for input methods, which is used by the {@link android.inputmethodservice.InputMethodService} class.--> - <style name="Theme.DeviceDefault.InputMethod" parent="Theme.Holo.InputMethod" > + <style name="Theme.DeviceDefault.InputMethod" parent="Theme.Quantum.InputMethod" > </style> <!-- Variant of the DeviceDefault (light) theme that has a solid (opaque) action bar with an inverse color profile. --> - <style name="Theme.DeviceDefault.Light.DarkActionBar" parent="Theme.Holo.Light.DarkActionBar" > + <style name="Theme.DeviceDefault.Light.DarkActionBar" parent="Theme.Quantum.Light.DarkActionBar" > <item name="android:actionBarStyle">@android:style/Widget.DeviceDefault.Light.ActionBar.Solid.Inverse</item> <item name="actionDropDownStyle">@android:style/Widget.DeviceDefault.Spinner.DropDown.ActionBar</item> @@ -569,20 +569,20 @@ easier. </style> - <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Holo.Dialog.Alert"> + <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Quantum.Dialog.Alert"> <item name="windowTitleStyle">@android:style/DialogWindowTitle.DeviceDefault</item> </style> - <style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.Holo.Light.Dialog.Alert"> + <style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.Quantum.Light.Dialog.Alert"> <item name="windowTitleStyle">@android:style/DialogWindowTitle.DeviceDefault.Light</item> </style> - <style name="Theme.DeviceDefault.SearchBar" parent="Theme.Holo.SearchBar"> + <style name="Theme.DeviceDefault.SearchBar" parent="Theme.Quantum.SearchBar"> </style> - <style name="Theme.DeviceDefault.Light.SearchBar" parent="Theme.Holo.Light.SearchBar"> + <style name="Theme.DeviceDefault.Light.SearchBar" parent="Theme.Quantum.Light.SearchBar"> </style> - <style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Holo.Dialog.NoFrame"> + <style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Quantum.Dialog.NoFrame"> </style> </resources> diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index 3c3c841660fc..52352c44d24c 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -80,8 +80,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { } /** - * Create a new layer drawable with the specified list of layers and the specified - * constant state. + * Create a new layer drawable with the specified list of layers and the + * specified constant state. * * @param layers The list of layers to add to this drawable. * @param state The constant drawable state. @@ -326,6 +326,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { childDrawable.mInsetR = right; childDrawable.mInsetB = bottom; st.mNum++; + st.invalidateCache(); layer.setCallback(this); } @@ -419,6 +420,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { } childDrawable.mDrawable = drawable; + mLayerState.invalidateCache(); return true; } } @@ -527,6 +529,25 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { } } + private void computeStackedPadding(Rect padding) { + padding.left = 0; + padding.top = 0; + padding.right = 0; + padding.bottom = 0; + + // Take the max padding. + final ChildDrawable[] array = mLayerState.mChildren; + final int N = mLayerState.mNum; + for (int i = 0; i < N; i++) { + refreshChildPadding(i, array[i]); + + padding.left = Math.max(padding.left, mPaddingL[i]); + padding.top = Math.max(padding.top, mPaddingT[i]); + padding.right = Math.max(padding.right, mPaddingR[i]); + padding.bottom = Math.max(padding.bottom, mPaddingB[i]); + } + } + /** * @hide */ @@ -579,25 +600,6 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { } } - private void computeStackedPadding(Rect padding) { - padding.left = 0; - padding.top = 0; - padding.right = 0; - padding.bottom = 0; - - // Take the max padding. - final ChildDrawable[] array = mLayerState.mChildren; - final int N = mLayerState.mNum; - for (int i = 0; i < N; i++) { - refreshChildPadding(i, array[i]); - - padding.left = Math.max(padding.left, mPaddingL[i]); - padding.top = Math.max(padding.top, mPaddingT[i]); - padding.right = Math.max(padding.right, mPaddingR[i]); - padding.bottom = Math.max(padding.bottom, mPaddingB[i]); - } - } - @Override public boolean setVisible(boolean visible, boolean restart) { final boolean changed = super.setVisible(visible, restart); @@ -632,7 +634,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { public int getAlpha() { final ChildDrawable[] array = mLayerState.mChildren; if (mLayerState.mNum > 0) { - // All layers should have the same alpha set on them - just return the first one + // All layers should have the same alpha set on them - just return + // the first one return array[0].mDrawable.getAlpha(); } else { return super.getAlpha(); @@ -649,12 +652,11 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { } /** - * Sets the opacity of this drawable directly, instead of collecting the states from - * the layers - * - * @param opacity The opacity to use, or {@link PixelFormat#UNKNOWN PixelFormat.UNKNOWN} - * for the default behavior + * Sets the opacity of this drawable directly, instead of collecting the + * states from the layers * + * @param opacity The opacity to use, or {@link PixelFormat#UNKNOWN + * PixelFormat.UNKNOWN} for the default behavior * @see PixelFormat#UNKNOWN * @see PixelFormat#TRANSLUCENT * @see PixelFormat#TRANSPARENT @@ -702,7 +704,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { final int N = mLayerState.mNum; for (int i = 0; i < N; i++) { final ChildDrawable r = array[i]; - if (r.mDrawable.setState(state)) { + if (r.mDrawable.isStateful() && r.mDrawable.setState(state)) { changed = true; } @@ -890,7 +892,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { public int[] mThemeAttrs; public int mInsetL, mInsetT, mInsetR, mInsetB; public int mId; - + ChildDrawable() { // Default empty constructor. } @@ -920,14 +922,11 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { int mChangingConfigurations; int mChildrenChangingConfigurations; - private boolean mHaveOpacity = false; + private boolean mHaveOpacity; private int mOpacity; - private boolean mHaveStateful = false; - private boolean mStateful; - - private boolean mCheckedConstantState; - private boolean mCanConstantState; + private boolean mHaveIsStateful; + private boolean mIsStateful; private boolean mAutoMirrored; @@ -951,9 +950,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { mHaveOpacity = orig.mHaveOpacity; mOpacity = orig.mOpacity; - mHaveStateful = orig.mHaveStateful; - mStateful = orig.mStateful; - mCheckedConstantState = mCanConstantState = true; + mHaveIsStateful = orig.mHaveIsStateful; + mIsStateful = orig.mIsStateful; mAutoMirrored = orig.mAutoMirrored; mPaddingMode = orig.mPaddingMode; mThemeAttrs = orig.mThemeAttrs; @@ -993,49 +991,54 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { return mOpacity; } + final ChildDrawable[] array = mChildren; final int N = mNum; - int op = N > 0 ? mChildren[0].mDrawable.getOpacity() : PixelFormat.TRANSPARENT; + int op = N > 0 ? array[0].mDrawable.getOpacity() : PixelFormat.TRANSPARENT; for (int i = 1; i < N; i++) { - op = Drawable.resolveOpacity(op, mChildren[i].mDrawable.getOpacity()); + op = Drawable.resolveOpacity(op, array[i].mDrawable.getOpacity()); } + mOpacity = op; mHaveOpacity = true; return op; } public final boolean isStateful() { - if (mHaveStateful) { - return mStateful; + if (mHaveIsStateful) { + return mIsStateful; } - boolean stateful = false; + final ChildDrawable[] array = mChildren; final int N = mNum; + boolean isStateful = false; for (int i = 0; i < N; i++) { - if (mChildren[i].mDrawable.isStateful()) { - stateful = true; + if (array[i].mDrawable.isStateful()) { + isStateful = true; break; } } - mStateful = stateful; - mHaveStateful = true; - return stateful; + mIsStateful = isStateful; + mHaveIsStateful = true; + return isStateful; } - public boolean canConstantState() { - if (!mCheckedConstantState && mChildren != null) { - mCanConstantState = true; - final int N = mNum; - for (int i = 0; i < N; i++) { - if (mChildren[i].mDrawable.getConstantState() == null) { - mCanConstantState = false; - break; - } + public final boolean canConstantState() { + final ChildDrawable[] array = mChildren; + final int N = mNum; + for (int i = 0; i < N; i++) { + if (array[i].mDrawable.getConstantState() == null) { + return false; } - mCheckedConstantState = true; } - return mCanConstantState; + // Don't cache the result, this method is not called very often. + return true; + } + + public void invalidateCache() { + mHaveOpacity = false; + mHaveIsStateful = false; } } } diff --git a/include/private/hwui/DrawGlInfo.h b/include/private/hwui/DrawGlInfo.h index fc810be8dc62..a357a017405c 100644 --- a/include/private/hwui/DrawGlInfo.h +++ b/include/private/hwui/DrawGlInfo.h @@ -55,7 +55,10 @@ struct DrawGlInfo { kModeDraw, // Indicates the the functor is called only to perform // processing and that no draw should be attempted - kModeProcess + kModeProcess, + // Same as kModeProcess, however there is no GL context because it was + // lost or destroyed + kModeProcessNoContext }; /** @@ -65,14 +68,6 @@ struct DrawGlInfo { enum Status { // The functor is done kStatusDone = 0x0, - // The functor is requesting a redraw (the clip rect - // used by the redraw is specified by DrawGlInfo.) - // The rest of the UI might redraw too. - kStatusDraw = 0x1, - // The functor needs to be invoked again but will - // not redraw. Only the functor is invoked again - // (unless another functor requests a redraw.) - kStatusInvoke = 0x2, // DisplayList actually issued GL drawing commands. // This is used to signal the HardwareRenderer that the // buffers should be flipped - otherwise, there were no diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h index 239a5bc5279e..5fa8f1d5e9ee 100644 --- a/libs/hwui/DisplayListOp.h +++ b/libs/hwui/DisplayListOp.h @@ -1499,13 +1499,13 @@ public: virtual void defer(DeferStateStruct& deferStruct, int saveCount, int level, bool useQuickReject) { if (mDisplayList && mDisplayList->isRenderable() && !mSkipInOrderDraw) { - mDisplayList->defer(deferStruct, level + 1); + mDisplayList->deferNodeInParent(deferStruct, level + 1); } } virtual void replay(ReplayStateStruct& replayStruct, int saveCount, int level, bool useQuickReject) { if (mDisplayList && mDisplayList->isRenderable() && !mSkipInOrderDraw) { - mDisplayList->replay(replayStruct, level + 1); + mDisplayList->replayNodeInParent(replayStruct, level + 1); } } diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp index 4457c61bd736..27409a2887c2 100644 --- a/libs/hwui/Layer.cpp +++ b/libs/hwui/Layer.cpp @@ -209,7 +209,7 @@ void Layer::defer() { dirtyRect.right, dirtyRect.bottom, !isBlend()); displayList->computeOrdering(); - displayList->defer(deferredState, 0); + displayList->deferNodeTree(deferredState); deferredUpdateScheduled = false; } diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 619f331a5f92..e1f484d90fd7 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -409,15 +409,6 @@ status_t OpenGLRenderer::invokeFunctors(Rect& dirty) { for (size_t i = 0; i < count; i++) { Functor* f = functors.itemAt(i); result |= (*f)(DrawGlInfo::kModeProcess, &info); - - if (result & DrawGlInfo::kStatusDraw) { - Rect localDirty(info.dirtyLeft, info.dirtyTop, info.dirtyRight, info.dirtyBottom); - dirty.unionWith(localDirty); - } - - if (result & DrawGlInfo::kStatusInvoke) { - mFunctors.add(f); - } } resume(); } @@ -461,19 +452,10 @@ status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) { interrupt(); // call functor immediately after GL state setup - status_t result = (*functor)(DrawGlInfo::kModeDraw, &info); - - if (result != DrawGlInfo::kStatusDone) { - Rect localDirty(info.dirtyLeft, info.dirtyTop, info.dirtyRight, info.dirtyBottom); - dirty.unionWith(localDirty); - - if (result & DrawGlInfo::kStatusInvoke) { - mFunctors.add(functor); - } - } + (*functor)(DrawGlInfo::kModeDraw, &info); resume(); - return result | DrawGlInfo::kStatusDrew; + return DrawGlInfo::kStatusDrew; } /////////////////////////////////////////////////////////////////////////////// @@ -1924,14 +1906,14 @@ status_t OpenGLRenderer::drawDisplayList(RenderNode* displayList, Rect& dirty, if (CC_UNLIKELY(mCaches.drawDeferDisabled)) { status = startFrame(); ReplayStateStruct replayStruct(*this, dirty, replayFlags); - displayList->replay(replayStruct, 0); + displayList->replayNodeTree(replayStruct); return status | replayStruct.mDrawGlStatus; } bool avoidOverdraw = !mCaches.debugOverdraw && !mCountOverdraw; // shh, don't tell devs! DeferredDisplayList deferredList(*currentClipRect(), avoidOverdraw); DeferStateStruct deferStruct(deferredList, *this, replayFlags); - displayList->defer(deferStruct, 0); + displayList->deferNodeTree(deferStruct); flushLayers(); status = startFrame(); diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index bdf6674c7f0d..34d98a105f33 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -132,10 +132,9 @@ bool RenderNode::hasFunctors() { #define PROPERTY_SAVECOUNT 0 template <class T> -void RenderNode::setViewProperties(OpenGLRenderer& renderer, T& handler, - const int level) { +void RenderNode::setViewProperties(OpenGLRenderer& renderer, T& handler) { #if DEBUG_DISPLAY_LIST - properties().debugOutputProperties(level); + properties().debugOutputProperties(handler.level() + 1); #endif if (properties().getLeft() != 0 || properties().getTop() != 0) { renderer.translate(properties().getLeft(), properties().getTop()); @@ -302,7 +301,6 @@ void RenderNode::computeOrderingImpl( child->computeOrderingImpl(childOp, projectionChildren, projectionTransform); } } - } class DeferOperationHandler { @@ -313,15 +311,25 @@ public: operation->defer(mDeferStruct, saveCount, mLevel, clipToBounds); } inline LinearAllocator& allocator() { return *(mDeferStruct.mAllocator); } + inline void startMark(const char* name) {} // do nothing + inline void endMark() {} + inline int level() { return mLevel; } + inline int replayFlags() { return mDeferStruct.mReplayFlags; } private: DeferStateStruct& mDeferStruct; const int mLevel; }; -void RenderNode::defer(DeferStateStruct& deferStruct, const int level) { +void RenderNode::deferNodeTree(DeferStateStruct& deferStruct) { + DeferOperationHandler handler(deferStruct, 0); + if (properties().getTranslationZ() > 0.0f) issueDrawShadowOperation(Matrix4::identity(), handler); + issueOperations<DeferOperationHandler>(deferStruct.mRenderer, handler); +} + +void RenderNode::deferNodeInParent(DeferStateStruct& deferStruct, const int level) { DeferOperationHandler handler(deferStruct, level); - iterate<DeferOperationHandler>(deferStruct.mRenderer, handler, level); + issueOperations<DeferOperationHandler>(deferStruct.mRenderer, handler); } class ReplayOperationHandler { @@ -335,21 +343,31 @@ public: operation->replay(mReplayStruct, saveCount, mLevel, clipToBounds); } inline LinearAllocator& allocator() { return *(mReplayStruct.mAllocator); } + inline void startMark(const char* name) { + mReplayStruct.mRenderer.startMark(name); + } + inline void endMark() { + mReplayStruct.mRenderer.endMark(); + DISPLAY_LIST_LOGD("%*sDone (%p, %s), returning %d", level * 2, "", this, mName.string(), + mReplayStruct.mDrawGlStatus); + } + inline int level() { return mLevel; } + inline int replayFlags() { return mReplayStruct.mReplayFlags; } private: ReplayStateStruct& mReplayStruct; const int mLevel; }; -void RenderNode::replay(ReplayStateStruct& replayStruct, const int level) { - ReplayOperationHandler handler(replayStruct, level); - - replayStruct.mRenderer.startMark(mName.string()); - iterate<ReplayOperationHandler>(replayStruct.mRenderer, handler, level); - replayStruct.mRenderer.endMark(); +void RenderNode::replayNodeTree(ReplayStateStruct& replayStruct) { + ReplayOperationHandler handler(replayStruct, 0); + if (properties().getTranslationZ() > 0.0f) issueDrawShadowOperation(Matrix4::identity(), handler); + issueOperations<ReplayOperationHandler>(replayStruct.mRenderer, handler); +} - DISPLAY_LIST_LOGD("%*sDone (%p, %s), returning %d", level * 2, "", this, mName.string(), - replayStruct.mDrawGlStatus); +void RenderNode::replayNodeInParent(ReplayStateStruct& replayStruct, const int level) { + ReplayOperationHandler handler(replayStruct, level); + issueOperations<ReplayOperationHandler>(replayStruct.mRenderer, handler); } void RenderNode::buildZSortedChildList(Vector<ZDrawDisplayListOpPair>& zTranslatedNodes) { @@ -373,10 +391,42 @@ void RenderNode::buildZSortedChildList(Vector<ZDrawDisplayListOpPair>& zTranslat std::stable_sort(zTranslatedNodes.begin(), zTranslatedNodes.end()); } +template <class T> +void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& handler) { + if (properties().getAlpha() <= 0.0f) return; + + mat4 shadowMatrixXY(transformFromParent); + applyViewPropertyTransforms(shadowMatrixXY); + + // Z matrix needs actual 3d transformation, so mapped z values will be correct + mat4 shadowMatrixZ(transformFromParent); + applyViewPropertyTransforms(shadowMatrixZ, true); + + const SkPath* outlinePath = properties().getOutline().getPath(); + const RevealClip& revealClip = properties().getRevealClip(); + const SkPath* revealClipPath = revealClip.hasConvexClip() + ? revealClip.getPath() : NULL; // only pass the reveal clip's path if it's convex + + /** + * The drawing area of the caster is always the same as the its perimeter (which + * the shadow system uses) *except* in the inverse clip case. Inform the shadow + * system that the caster's drawing area (as opposed to its perimeter) has been + * clipped, so that it knows the caster can't be opaque. + */ + bool casterUnclipped = !revealClip.willClip() || revealClip.hasConvexClip(); + + DisplayListOp* shadowOp = new (handler.allocator()) DrawShadowOp( + shadowMatrixXY, shadowMatrixZ, + properties().getAlpha(), casterUnclipped, + properties().getWidth(), properties().getHeight(), + outlinePath, revealClipPath); + handler(shadowOp, PROPERTY_SAVECOUNT, properties().getClipToBounds()); +} + #define SHADOW_DELTA 0.1f template <class T> -void RenderNode::iterate3dChildren(const Vector<ZDrawDisplayListOpPair>& zTranslatedNodes, +void RenderNode::issueOperationsOf3dChildren(const Vector<ZDrawDisplayListOpPair>& zTranslatedNodes, ChildrenSelectMode mode, OpenGLRenderer& renderer, T& handler) { const int size = zTranslatedNodes.size(); if (size == 0 @@ -386,12 +436,6 @@ void RenderNode::iterate3dChildren(const Vector<ZDrawDisplayListOpPair>& zTransl return; } - int rootRestoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); - LinearAllocator& alloc = handler.allocator(); - ClipRectOp* clipOp = new (alloc) ClipRectOp(0, 0, properties().getWidth(), properties().getHeight(), - SkRegion::kIntersect_Op); // clip to 3d root bounds - handler(clipOp, PROPERTY_SAVECOUNT, properties().getClipToBounds()); - /** * Draw shadows and (potential) casters mostly in order, but allow the shadows of casters * with very similar Z heights to draw together. @@ -419,35 +463,7 @@ void RenderNode::iterate3dChildren(const Vector<ZDrawDisplayListOpPair>& zTransl // attempt to render the shadow if the caster about to be drawn is its caster, // OR if its caster's Z value is similar to the previous potential caster if (shadowIndex == drawIndex || casterZ - lastCasterZ < SHADOW_DELTA) { - - if (caster->properties().getAlpha() > 0.0f) { - mat4 shadowMatrixXY(casterOp->mTransformFromParent); - caster->applyViewPropertyTransforms(shadowMatrixXY); - - // Z matrix needs actual 3d transformation, so mapped z values will be correct - mat4 shadowMatrixZ(casterOp->mTransformFromParent); - caster->applyViewPropertyTransforms(shadowMatrixZ, true); - - const SkPath* outlinePath = caster->properties().getOutline().getPath(); - const RevealClip& revealClip = caster->properties().getRevealClip(); - const SkPath* revealClipPath = revealClip.hasConvexClip() - ? revealClip.getPath() : NULL; // only pass the reveal clip's path if it's convex - - /** - * The drawing area of the caster is always the same as the its perimeter (which - * the shadow system uses) *except* in the inverse clip case. Inform the shadow - * system that the caster's drawing area (as opposed to its perimeter) has been - * clipped, so that it knows the caster can't be opaque. - */ - bool casterUnclipped = !revealClip.willClip() || revealClip.hasConvexClip(); - - DisplayListOp* shadowOp = new (alloc) DrawShadowOp( - shadowMatrixXY, shadowMatrixZ, - caster->properties().getAlpha(), casterUnclipped, - caster->properties().getWidth(), caster->properties().getHeight(), - outlinePath, revealClipPath); - handler(shadowOp, PROPERTY_SAVECOUNT, properties().getClipToBounds()); - } + caster->issueDrawShadowOperation(casterOp->mTransformFromParent, handler); lastCasterZ = casterZ; // must do this even if current caster not casting a shadow shadowIndex++; @@ -470,17 +486,10 @@ void RenderNode::iterate3dChildren(const Vector<ZDrawDisplayListOpPair>& zTransl renderer.restoreToCount(restoreTo); drawIndex++; } - handler(new (alloc) RestoreToCountOp(rootRestoreTo), PROPERTY_SAVECOUNT, properties().getClipToBounds()); } template <class T> -void RenderNode::iterateProjectedChildren(OpenGLRenderer& renderer, T& handler, const int level) { - int rootRestoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); - LinearAllocator& alloc = handler.allocator(); - ClipRectOp* clipOp = new (alloc) ClipRectOp(0, 0, properties().getWidth(), properties().getHeight(), - SkRegion::kReplace_Op); // clip to projection surface root bounds - handler(clipOp, PROPERTY_SAVECOUNT, properties().getClipToBounds()); - +void RenderNode::issueOperationsOfProjectedChildren(OpenGLRenderer& renderer, T& handler) { for (size_t i = 0; i < mProjectedNodes.size(); i++) { DrawDisplayListOp* childOp = mProjectedNodes[i]; @@ -492,7 +501,6 @@ void RenderNode::iterateProjectedChildren(OpenGLRenderer& renderer, T& handler, childOp->mSkipInOrderDraw = true; renderer.restoreToCount(restoreTo); } - handler(new (alloc) RestoreToCountOp(rootRestoreTo), PROPERTY_SAVECOUNT, properties().getClipToBounds()); } /** @@ -505,7 +513,8 @@ void RenderNode::iterateProjectedChildren(OpenGLRenderer& renderer, T& handler, * defer vs replay logic, per operation */ template <class T> -void RenderNode::iterate(OpenGLRenderer& renderer, T& handler, const int level) { +void RenderNode::issueOperations(OpenGLRenderer& renderer, T& handler) { + const int level = handler.level(); if (CC_UNLIKELY(mDestroyed)) { // temporary debug logging ALOGW("Error: %s is drawing after destruction", mName.string()); CRASH(); @@ -515,6 +524,8 @@ void RenderNode::iterate(OpenGLRenderer& renderer, T& handler, const int level) return; } + handler.startMark(mName.string()); + #if DEBUG_DISPLAY_LIST Rect* clipRect = renderer.getClipRect(); DISPLAY_LIST_LOGD("%*sStart display list (%p, %s), clipRect: %.0f, %.0f, %.0f, %.0f", @@ -530,7 +541,7 @@ void RenderNode::iterate(OpenGLRenderer& renderer, T& handler, const int level) DISPLAY_LIST_LOGD("%*sSave %d %d", (level + 1) * 2, "", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo); - setViewProperties<T>(renderer, handler, level + 1); + setViewProperties<T>(renderer, handler); bool quickRejected = properties().getClipToBounds() && renderer.quickRejectConservative(0, 0, properties().getWidth(), properties().getHeight()); @@ -539,7 +550,7 @@ void RenderNode::iterate(OpenGLRenderer& renderer, T& handler, const int level) buildZSortedChildList(zTranslatedNodes); // for 3d root, draw children with negative z values - iterate3dChildren(zTranslatedNodes, kNegativeZChildren, renderer, handler); + issueOperationsOf3dChildren(zTranslatedNodes, kNegativeZChildren, renderer, handler); DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance(); const int saveCountOffset = renderer.getSaveCount() - 1; @@ -550,23 +561,24 @@ void RenderNode::iterate(OpenGLRenderer& renderer, T& handler, const int level) #if DEBUG_DISPLAY_LIST op->output(level + 1); #endif - logBuffer.writeCommand(level, op->name()); handler(op, saveCountOffset, properties().getClipToBounds()); if (CC_UNLIKELY(i == projectionReceiveIndex && mProjectedNodes.size() > 0)) { - iterateProjectedChildren(renderer, handler, level); + issueOperationsOfProjectedChildren(renderer, handler); } } // for 3d root, draw children with positive z values - iterate3dChildren(zTranslatedNodes, kPositiveZChildren, renderer, handler); + issueOperationsOf3dChildren(zTranslatedNodes, kPositiveZChildren, renderer, handler); } DISPLAY_LIST_LOGD("%*sRestoreToCount %d", (level + 1) * 2, "", restoreTo); handler(new (alloc) RestoreToCountOp(restoreTo), PROPERTY_SAVECOUNT, properties().getClipToBounds()); renderer.setOverrideLayerAlpha(1.0f); + + handler.endMark(); } } /* namespace uirenderer */ diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h index 291d03d892ba..fb5336d1277c 100644 --- a/libs/hwui/RenderNode.h +++ b/libs/hwui/RenderNode.h @@ -92,8 +92,12 @@ public: ANDROID_API void setData(DisplayListData* newData); void computeOrdering(); - void defer(DeferStateStruct& deferStruct, const int level); - void replay(ReplayStateStruct& replayStruct, const int level); + + void deferNodeTree(DeferStateStruct& deferStruct); + void deferNodeInParent(DeferStateStruct& deferStruct, const int level); + + void replayNodeTree(ReplayStateStruct& replayStruct); + void replayNodeInParent(ReplayStateStruct& replayStruct, const int level); ANDROID_API void output(uint32_t level = 1); @@ -164,19 +168,26 @@ private: const mat4* transformFromProjectionSurface); template <class T> - inline void setViewProperties(OpenGLRenderer& renderer, T& handler, const int level); + inline void setViewProperties(OpenGLRenderer& renderer, T& handler); void buildZSortedChildList(Vector<ZDrawDisplayListOpPair>& zTranslatedNodes); + template<class T> + inline void issueDrawShadowOperation(const Matrix4& transformFromParent, T& handler); + template <class T> - inline void iterate3dChildren(const Vector<ZDrawDisplayListOpPair>& zTranslatedNodes, + inline void issueOperationsOf3dChildren(const Vector<ZDrawDisplayListOpPair>& zTranslatedNodes, ChildrenSelectMode mode, OpenGLRenderer& renderer, T& handler); template <class T> - inline void iterateProjectedChildren(OpenGLRenderer& renderer, T& handler, const int level); + inline void issueOperationsOfProjectedChildren(OpenGLRenderer& renderer, T& handler); + /** + * Issue the RenderNode's operations into a handler, recursing for subtrees through + * DrawDisplayListOp's defer() or replay() methods + */ template <class T> - inline void iterate(OpenGLRenderer& renderer, T& handler, const int level); + inline void issueOperations(OpenGLRenderer& renderer, T& handler); class TextContainer { public: diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 8ebffc28a4e2..fa8262705426 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -82,6 +82,8 @@ public: // Returns true on success, false on failure void initialize(); + bool hasContext(); + void usePBufferSurface(); EGLSurface createSurface(EGLNativeWindowType window); void destroySurface(EGLSurface surface); @@ -138,7 +140,7 @@ GlobalContext::GlobalContext() } void GlobalContext::initialize() { - if (mEglDisplay != EGL_NO_DISPLAY) return; + if (hasContext()) return; mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); LOG_ALWAYS_FATAL_IF(mEglDisplay == EGL_NO_DISPLAY, @@ -157,6 +159,10 @@ void GlobalContext::initialize() { initAtlas(); } +bool GlobalContext::hasContext() { + return mEglDisplay != EGL_NO_DISPLAY; +} + void GlobalContext::loadConfig() { EGLint swapBehavior = mCanSetDirtyRegions ? EGL_SWAP_BEHAVIOR_PRESERVED_BIT : 0; EGLint attribs[] = { @@ -411,7 +417,6 @@ void CanvasContext::drawDisplayList(RenderNode* displayList, Rect* dirty) { Rect outBounds; status |= mCanvas->drawDisplayList(displayList, outBounds); - handleFunctorStatus(status, outBounds); // TODO: Draw debug info // TODO: Performance tracking @@ -441,6 +446,15 @@ void CanvasContext::detachFunctor(Functor* functor) { mCanvas->detachFunctor(functor); } +void CanvasContext::invokeFunctor(Functor* functor) { + DrawGlInfo::Mode mode = DrawGlInfo::kModeProcessNoContext; + if (mGlobalContext->hasContext()) { + requireGlContext(); + mode = DrawGlInfo::kModeProcess; + } + (*functor)(mode, NULL); +} + void CanvasContext::invokeFunctors() { mInvokeFunctorsPending = false; @@ -448,22 +462,7 @@ void CanvasContext::invokeFunctors() { makeCurrent(); Rect dirty; - int status = mCanvas->invokeFunctors(dirty); - handleFunctorStatus(status, dirty); -} - -void CanvasContext::handleFunctorStatus(int status, const Rect& redrawClip) { - if (status & DrawGlInfo::kStatusDraw) { - // TODO: Invalidate the redrawClip - // Do we need to post to ViewRootImpl like the current renderer? - // Can we just enqueue ourselves to re-invoke the same display list? - // Something else entirely? Does ChromiumView still want this in a - // RenderThread world? - } - - if (status & DrawGlInfo::kStatusInvoke) { - queueFunctorsTask(); - } + mCanvas->invokeFunctors(dirty); } void CanvasContext::removeFunctorsTask() { diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index e3fdf97103ee..eb9096d5d92c 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -72,6 +72,7 @@ public: void attachFunctor(Functor* functor); void detachFunctor(Functor* functor); + void invokeFunctor(Functor* functor); void runWithGlContext(RenderTask* task); @@ -82,7 +83,6 @@ private: friend class InvokeFunctorsTask; void invokeFunctors(); - void handleFunctorStatus(int status, const Rect& redrawClip); void removeFunctorsTask(); void queueFunctorsTask(int delayMs = FUNCTOR_PROCESS_DELAY); diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 16b93c3cf73d..cd711b030581 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -167,6 +167,22 @@ void RenderProxy::detachFunctor(Functor* functor) { post(task); } +CREATE_BRIDGE2(invokeFunctor, CanvasContext* context, Functor* functor) { + args->context->invokeFunctor(args->functor); + return NULL; +} + +void RenderProxy::invokeFunctor(Functor* functor, bool waitForCompletion) { + SETUP_TASK(invokeFunctor); + args->context = mContext; + args->functor = functor; + if (waitForCompletion) { + postAndWait(task); + } else { + post(task); + } +} + CREATE_BRIDGE2(runWithGlContext, CanvasContext* context, RenderTask* task) { args->context->runWithGlContext(args->task); return NULL; diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index ee7a4c752211..f1ca534e21d7 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -69,6 +69,7 @@ public: ANDROID_API void attachFunctor(Functor* functor); ANDROID_API void detachFunctor(Functor* functor); + ANDROID_API void invokeFunctor(Functor* functor, bool waitForCompletion); ANDROID_API void runWithGlContext(RenderTask* task); diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index 26e9cc53bcc6..04c6e9735cd1 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -56,7 +56,7 @@ public class AudioFormat { /** Default audio channel mask */ public static final int CHANNEL_OUT_DEFAULT = 1; - // Channel mask definitions below are translated to the native values defined in + // Output channel mask definitions below are translated to the native values defined in // in /system/core/include/system/audio.h in the JNI code of AudioTrack public static final int CHANNEL_OUT_FRONT_LEFT = 0x4; public static final int CHANNEL_OUT_FRONT_RIGHT = 0x8; @@ -94,17 +94,21 @@ public class AudioFormat { CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_BACK_CENTER); public static final int CHANNEL_OUT_5POINT1 = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_LOW_FREQUENCY | CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT); + // different from AUDIO_CHANNEL_OUT_7POINT1 public static final int CHANNEL_OUT_7POINT1 = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_LOW_FREQUENCY | CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT | CHANNEL_OUT_FRONT_LEFT_OF_CENTER | CHANNEL_OUT_FRONT_RIGHT_OF_CENTER); /** @hide */ + // matches AUDIO_CHANNEL_OUT_7POINT1 public static final int CHANNEL_OUT_7POINT1_SURROUND = ( CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_FRONT_RIGHT | CHANNEL_OUT_SIDE_LEFT | CHANNEL_OUT_SIDE_RIGHT | CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT | CHANNEL_OUT_LOW_FREQUENCY); + // CHANNEL_OUT_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_OUT_ALL public static final int CHANNEL_IN_DEFAULT = 1; + // These directly match native public static final int CHANNEL_IN_LEFT = 0x4; public static final int CHANNEL_IN_RIGHT = 0x8; public static final int CHANNEL_IN_FRONT = 0x10; @@ -121,5 +125,8 @@ public class AudioFormat { public static final int CHANNEL_IN_VOICE_DNLINK = 0x8000; public static final int CHANNEL_IN_MONO = CHANNEL_IN_FRONT; public static final int CHANNEL_IN_STEREO = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT); + /** @hide */ + public static final int CHANNEL_IN_FRONT_BACK = CHANNEL_IN_FRONT | CHANNEL_IN_BACK; + // CHANNEL_IN_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_IN_ALL } diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index fe510f639bee..7f1c5c728b2d 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -1689,7 +1689,7 @@ public class AudioService extends IAudioService.Stub { private static final String ASSET_FILE_VERSION = "1.0"; private static final String GROUP_TOUCH_SOUNDS = "touch_sounds"; - private static final int SOUND_EFECTS_LOAD_TIMEOUT_MS = 5000; + private static final int SOUND_EFFECTS_LOAD_TIMEOUT_MS = 5000; class LoadSoundEffectReply { public int mStatus = 1; @@ -1801,7 +1801,7 @@ public class AudioService extends IAudioService.Stub { sendMsg(mAudioHandler, MSG_LOAD_SOUND_EFFECTS, SENDMSG_QUEUE, 0, 0, reply, 0); while ((reply.mStatus == 1) && (attempts-- > 0)) { try { - reply.wait(SOUND_EFECTS_LOAD_TIMEOUT_MS); + reply.wait(SOUND_EFFECTS_LOAD_TIMEOUT_MS); } catch (InterruptedException e) { Log.w(TAG, "loadSoundEffects Interrupted while waiting sound pool loaded."); } @@ -3289,7 +3289,7 @@ public class AudioService extends IAudioService.Stub { while ((mSoundPoolCallBack == null) && (attempts-- > 0)) { try { // Wait for mSoundPoolCallBack to be set by the other thread - mSoundEffectsLock.wait(SOUND_EFECTS_LOAD_TIMEOUT_MS); + mSoundEffectsLock.wait(SOUND_EFFECTS_LOAD_TIMEOUT_MS); } catch (InterruptedException e) { Log.w(TAG, "Interrupted while waiting sound pool listener thread."); } @@ -3353,7 +3353,7 @@ public class AudioService extends IAudioService.Stub { status = 1; while ((status == 1) && (attempts-- > 0)) { try { - mSoundEffectsLock.wait(SOUND_EFECTS_LOAD_TIMEOUT_MS); + mSoundEffectsLock.wait(SOUND_EFFECTS_LOAD_TIMEOUT_MS); status = mSoundPoolCallBack.status(); } catch (InterruptedException e) { Log.w(TAG, "Interrupted while waiting sound pool callback."); diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp index a78f16d31e74..3dbf77ba74c9 100644 --- a/media/jni/android_media_MediaExtractor.cpp +++ b/media/jni/android_media_MediaExtractor.cpp @@ -87,7 +87,7 @@ class JavaDataSourceBridge : public DataSource { jbyteArray byteArrayObj = env->NewByteArray(size); env->DeleteLocalRef(env->GetObjectClass(mDataSource)); env->DeleteLocalRef(env->GetObjectClass(byteArrayObj)); - ssize_t numread = env->CallIntMethod(mDataSource, mReadMethod, offset, byteArrayObj, size); + ssize_t numread = env->CallIntMethod(mDataSource, mReadMethod, offset, byteArrayObj, (jint)size); env->GetByteArrayRegion(byteArrayObj, 0, size, (jbyte*) buffer); env->DeleteLocalRef(byteArrayObj); if (env->ExceptionCheck()) { @@ -632,7 +632,7 @@ static jboolean android_media_MediaExtractor_getSampleCryptoInfo( env->CallVoidMethod( cryptoInfoObj, gFields.cryptoInfoSetID, - numSubSamples, + (jint)numSubSamples, numBytesOfPlainDataObj, numBytesOfEncryptedDataObj, keyObj, diff --git a/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm b/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm new file mode 100644 index 000000000000..2a95cfe6f8b1 --- /dev/null +++ b/packages/InputDevices/res/raw/keyboard_layout_arabic.kcm @@ -0,0 +1,319 @@ +# 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. + +# +# Arabic (US-101 keys) keyboard layout. +# + +type OVERLAY + +### ROW 1 + +key GRAVE { + label: '`' + base, capslock: '\u0630' + shift: '\u0651' +} + +key 1 { + label: '1' + base: '\u0661' + shift: '!' + capslock: '1' +} + +key 2 { + label: '2' + base: '\u0662' + shift: '@' + capslock: '2' +} + +key 3 { + label: '3' + base: '\u0663' + shift: '#' + capslock: '3' +} + +key 4 { + label: '4' + base: '\u0664' + shift: '$' + capslock: '4' +} + +key 5 { + label: '5' + base: '\u0665' + shift: '%' + capslock: '5' +} + +key 6 { + label: '6' + base: '\u0666' + shift: '^' + capslock: '6' +} + +key 7 { + label: '7' + base: '\u0667' + shift: '&' + capslock: '7' +} + +key 8 { + label: '8' + base: '\u0668' + shift: '*' + capslock: '8' +} + +key 9 { + label: '9' + base: '\u0669' + shift: '(' + capslock: '9' +} + +key 0 { + label: '0' + base: '\u0660' + shift: ')' + capslock: '0' +} + +key MINUS { + label: '-' + base, capslock: '-' + shift: '_' +} + +key EQUALS { + label: '=' + base, capslock: '=' + shift: '+' +} + +### ROW 2 + +key Q { + label: 'Q' + base, capslock: '\u0636' + shift: '\u064e' +} + +key W { + label: 'W' + base, capslock: '\u0635' + shift: '\u064b' +} + +key E { + label: 'E' + base, capslock: '\u062b' + shift: '\u064f' +} + +key R { + label: 'R' + base, capslock: '\u0642' + shift: '\u064c' +} + +key T { + label: 'T' + base, capslock: '\u0641' + shift: '\ufef9' +} + +key Y { + label: 'Y' + base, capslock: '\u063a' + shift: '\u0625' +} + +key U { + label: 'U' + base, capslock: '\u0639' + shift: '\u2018' +} + +key I { + label: 'I' + base, capslock: '\u0647' + shift: '\u00f7' +} + +key O { + label: 'O' + base, capslock: '\u062e' + shift: '\u00d7' +} + +key P { + label: 'P' + base, capslock: '\u062d' + shift: '\u061b' +} + +key LEFT_BRACKET { + label: '[' + base, capslock: '\u062c' + shift: '<' +} + +key RIGHT_BRACKET { + label: ']' + base, capslock: '\u062f' + shift: '>' +} + +key BACKSLASH { + label: '\\' + base, capslock: '\\' + shift: '|' +} + +### ROW 3 + +key A { + label: 'A' + base, capslock: '\u0634' + shift: '\u0650' +} + +key S { + label: 'S' + base, capslock: '\u0633' + shift: '\u064d' +} + +key D { + label: 'D' + base, capslock: '\u064a' + shift: ']' +} + +key F { + label: 'F' + base, capslock: '\u0628' + shift: '[' +} + +key G { + label: 'G' + base, capslock: '\u0644' + shift: '\ufef7' +} + +key H { + label: 'H' + base, capslock: '\u0627' + shift: '\u0623' +} + +key J { + label: 'J' + base, capslock: '\u062a' + shift: '\u0640' +} + +key K { + label: 'K' + base, capslock: '\u0646' + shift: '\u060c' +} + +key L { + label: 'L' + base, capslock: '\u0645' + shift: '/' +} + +key SEMICOLON { + label: ';' + base, capslock: '\u0643' + shift: ':' +} + +key APOSTROPHE { + label: '\'' + base, capslock: '\u0637' + shift: '"' +} + +### ROW 4 + +key Z { + label: 'Z' + base, capslock: '\u0626' + shift: '~' +} + +key X { + label: 'X' + base, capslock: '\u0621' + shift: '\u0652' +} + +key C { + label: 'C' + base, capslock: '\u0624' + shift: '}' +} + +key V { + label: 'V' + base, capslock: '\u0631' + shift: '{' +} + +key B { + label: 'B' + base, capslock: '\ufefb' + shift: '\ufef5' +} + +key N { + label: 'N' + base, capslock: '\u0649' + shift: '\u0622' +} + +key M { + label: 'M' + base, capslock: '\u0629' + shift: '\u2019' +} + +key COMMA { + label: ',' + base, capslock: '\u0648' + shift: ',' +} + +key PERIOD { + label: '.' + base, capslock: '\u0632' + shift: '.' +} + +key SLASH { + label: '/' + base, capslock: '\u0638' + shift: '\u061f' +} diff --git a/packages/InputDevices/res/raw/keyboard_layout_greek.kcm b/packages/InputDevices/res/raw/keyboard_layout_greek.kcm new file mode 100644 index 000000000000..a7684e12766d --- /dev/null +++ b/packages/InputDevices/res/raw/keyboard_layout_greek.kcm @@ -0,0 +1,338 @@ +# 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. + +# +# Greek (EU based) keyboard layout. +# + +type OVERLAY + +map key 86 PLUS + +### ROW 1 + +key GRAVE { + label: '`' + base, capslock: '`' + shift: '~' +} + +key 1 { + label: '1' + base, capslock: '1' + shift: '!' +} + +key 2 { + label: '2' + base, capslock: '2' + shift: '@' + ralt: '\u00b2' +} + +key 3 { + label: '3' + base, capslock: '3' + shift: '#' + ralt: '\u00b3' +} + +key 4 { + label: '4' + base, capslock: '4' + shift: '$' + ralt: '\u00a3' +} + +key 5 { + label: '5' + base, capslock: '5' + shift: '%' + ralt: '\u00a7' +} + +key 6 { + label: '6' + base, capslock: '6' + shift: '^' + ralt: '\u00b6' +} + +key 7 { + label: '7' + base, capslock: '7' + shift: '&' +} + +key 8 { + label: '8' + base, capslock: '8' + shift: '*' + ralt: '\u00a4' +} + +key 9 { + label: '9' + base, capslock: '9' + shift: '(' + ralt: '\u00a6' +} + +key 0 { + label: '0' + base, capslock: '0' + shift: ')' + ralt: '\u00b0' +} + +key MINUS { + label: '-' + base, capslock: '-' + shift: '_' + ralt: '\u00b1' +} + +key EQUALS { + label: '=' + base, capslock: '=' + shift: '+' + ralt: '\u00bd' +} + +### ROW 2 + +key Q { + label: 'Q' + base, capslock: ';' + shift: ':' +} + +key W { + label: 'W' + base, capslock: '\u03c2' + shift: '\u0385' +} + +key E { + label: 'E' + base: '\u03b5' + shift, capslock: '\u0395' + ralt: '\u20ac' +} + +key R { + label: 'R' + base: '\u03c1' + shift, capslock: '\u03a1' + ralt: '\u00ae' +} + +key T { + label: 'T' + base: '\u03c4' + shift, capslock: '\u03a4' +} + +key Y { + label: 'Y' + base: '\u03c5' + shift, capslock: '\u03a5' + ralt: '\u00a5' +} + +key U { + label: 'U' + base: '\u03b8' + shift, capslock: '\u0398' +} + +key I { + label: 'I' + base: '\u03b9' + shift, capslock: '\u0399' +} + +key O { + label: 'O' + base: '\u03bf' + shift, capslock: '\u039f' +} + +key P { + label: 'P' + base: '\u03c0' + shift, capslock: '\u03a0' +} + +key LEFT_BRACKET { + label: '[' + base, capslock: '[' + shift: '{' + ralt: '\u00ab' +} + +key RIGHT_BRACKET { + label: ']' + base, capslock: ']' + shift: '}' + ralt: '\u00bb' +} + +### ROW 3 + +key A { + label: 'A' + base: '\u03b1' + shift, capslock: '\u0391' +} + +key S { + label: 'S' + base: '\u03c3' + shift, capslock: '\u03a3' +} + +key D { + label: 'D' + base: '\u03b4' + shift, capslock: '\u0394' +} + +key F { + label: 'F' + base: '\u03c6' + shift, capslock: '\u03a6' +} + +key G { + label: 'G' + base: '\u03b3' + shift, capslock: '\u0393' +} + +key H { + label: 'H' + base: '\u03b7' + shift, capslock: '\u0397' +} + +key J { + label: 'J' + base: '\u03be' + shift, capslock: '\u039e' +} + +key K { + label: 'K' + base: '\u03ba' + shift, capslock: '\u039a' +} + +key L { + label: 'L' + base: '\u03bb' + shift, capslock: '\u039b' +} + +key SEMICOLON { + label: ';' + base, capslock: '\u0301' +#should be \u0384 (greek tonos) + shift: '\u0308' + ralt: '\u0385' +} + +key APOSTROPHE { + label: '\'' + base, capslock: '\'' + shift: '"' +} + +key BACKSLASH { + label: '\\' + base, capslock: '\\' + shift: '|' + ralt: '\u00ac' +} + +### ROW 4 + +key PLUS { + label: '<' + base, capslock: '<' + shift: '>' + ralt: '\\' + shift+ralt: '|' +} + +key Z { + label: 'Z' + base: '\u03b6' + shift, capslock: '\u0396' +} + +key X { + label: 'X' + base: '\u03c7' + shift, capslock: '\u03a7' +} + +key C { + label: 'C' + base: '\u03c8' + shift, capslock: '\u03a8' + ralt: '\u00a9' +} + +key V { + label: 'V' + base: '\u03c9' + shift, capslock: '\u03a9' +} + +key B { + label: 'B' + base: '\u03b2' + shift, capslock: '\u0392' +} + +key N { + label: 'N' + base: '\u03bd' + shift, capslock: '\u039d' +} + +key M { + label: 'M' + base: '\u03bc' + shift, capslock: '\u039c' +} + +key COMMA { + label: ',' + base, capslock: ',' + shift: '<' +} + +key PERIOD { + label: '.' + base, capslock: '.' + shift: '>' +} + +key SLASH { + label: '/' + base, capslock: '/' + shift: '?' +} diff --git a/packages/InputDevices/res/raw/keyboard_layout_hebrew.kcm b/packages/InputDevices/res/raw/keyboard_layout_hebrew.kcm new file mode 100644 index 000000000000..cd3a4b959386 --- /dev/null +++ b/packages/InputDevices/res/raw/keyboard_layout_hebrew.kcm @@ -0,0 +1,341 @@ +# 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. + +# +# Hebrew (based EU) keyboard layout. +# + +type OVERLAY + +map key 86 PLUS + +### ROW 1 + +key GRAVE { + label: '`' + base: ';' + shift: '~' + shift+capslock: '\u05b0' +} + +key 1 { + label: '1' + base: '1' + shift: '!' + shift+capslock: '\u05b1' +} + +key 2 { + label: '2' + base: '2' + shift: '@' + shift+capslock: '\u05b2' +} + +key 3 { + label: '3' + base: '3' + shift: '#' + shift+capslock: '\u05b3' +} + +key 4 { + label: '4' + base: '4' + shift: '$' + ralt: '\u20aa' + shift+capslock: '\u05b4' +} + +key 5 { + label: '5' + base: '5' + shift: '%' + shift+capslock: '\u05b5' +} + +key 6 { + label: '6' + base: '6' + shift: '^' + shift+capslock: '\u05b6' +} + +key 7 { + label: '7' + base: '7' + shift: '&' + shift+capslock: '\u05b7' +} + +key 8 { + label: '8' + base: '8' + shift: '*' + shift+capslock: '\u05b8' +} + +key 9 { + label: '9' + base: '9' + shift: '(' + shift+capslock: '\u05c2' +} + +key 0 { + label: '0' + base: '0' + shift: ')' + shift+capslock: '\u05c1' +} + +key MINUS { + label: '-' + base: '-' + shift: '_' + ralt: '\u05bf' + shift+capslock: '\u05b9' +} + +key EQUALS { + label: '=' + base: '=' + shift: '+' + shift+capslock: '\u05bc' +} + +### ROW 2 + +key Q { + label: 'Q' + base: '/' + shift, capslock: 'Q' +} + +key W { + label: 'W' + base: '\u0027' + shift, capslock: 'W' +} + +key E { + label: 'E' + base: '\u05e7' + shift, capslock: 'E' + ralt: '\u20ac' +} + +key R { + label: 'R' + base: '\u05e8' + shift, capslock: 'R' +} + +key T { + label: 'T' + base: '\u05d0' + shift, capslock: 'T' +} + +key Y { + label: 'Y' + base: '\u05d8' + shift, capslock: 'Y' +} + +key U { + label: 'U' + base: '\u05d5' + shift, capslock: 'U' + ralt: '\u05f0' +} + +key I { + label: 'I' + base: '\u05df' + shift, capslock: 'I' +} + +key O { + label: 'O' + base: '\u05dd' + shift, capslock: 'O' +} + +key P { + label: 'P' + base: '\u05e4' + shift, capslock: 'P' +} + +key LEFT_BRACKET { + label: '[' + base, capslock: '[' + shift: '{' +} + +key RIGHT_BRACKET { + label: ']' + base, capslock: ']' + shift: '}' +} + +### ROW 3 + +key A { + label: 'A' + base: '\u05e9' + shift, capslock: 'A' +} + +key S { + label: 'S' + base: '\u05d3' + shift, capslock: 'S' +} + +key D { + label: 'D' + base: '\u05d2' + shift, capslock: 'D' +} + +key F { + label: 'F' + base: '\u05db' + shift, capslock: 'F' +} + +key G { + label: 'G' + base: '\u05e2' + shift, capslock: 'G' +} + +key H { + label: 'H' + base: '\u05d9' + shift, capslock: 'H' + ralt: '\u05f2' +} + +key J { + label: 'J' + base: '\u05d7' + shift, capslock: 'J' + ralt: '\u05f1' +} + +key K { + label: 'K' + base: '\u05dc' + shift, capslock: 'K' +} + +key L { + label: 'L' + base: '\u05da' + shift, capslock: 'L' +} + +key SEMICOLON { + label: ';' + base: '\u05e3' + shift: ':' + capslock: ';' +} + +key APOSTROPHE { + label: '\'' + base: ',' + shift: '"' + capslock: '\'' +} + +key BACKSLASH { + label: '\\' + base: '\\' + shift: '|' +} + +### ROW 4 + +key PLUS { + label: '\\' + base, capslock: '\\' + shift: '|' +} + +key Z { + label: 'Z' + base: '\u05d6' + shift, capslock: 'Z' +} + +key X { + label: 'X' + base: '\u05e1' + shift, capslock: 'X' +} + +key C { + label: 'C' + base: '\u05d1' + shift, capslock: 'C' +} + +key V { + label: 'V' + base: '\u05d4' + shift, capslock: 'V' +} + +key B { + label: 'B' + base: '\u05e0' + shift, capslock: 'B' +} + +key N { + label: 'N' + base: '\u05de' + shift, capslock: 'N' +} + +key M { + label: 'M' + base: '\u05e6' + shift, capslock: 'M' +} + +key COMMA { + label: ',' + base: '\u05ea' + shift: '<' + capslock: ',' +} + +key PERIOD { + label: '.' + base: '\u05e5' + shift: '>' + capslock: '.' +} + +key SLASH { + label: '/' + base: '.' + shift: '?' + capslock: '/' +} diff --git a/packages/InputDevices/res/raw/keyboard_layout_lithuanian.kcm b/packages/InputDevices/res/raw/keyboard_layout_lithuanian.kcm new file mode 100644 index 000000000000..72ca33381525 --- /dev/null +++ b/packages/InputDevices/res/raw/keyboard_layout_lithuanian.kcm @@ -0,0 +1,338 @@ +# 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. + +# +# Lithuanian (EU based) keyboard layout. +# + +type OVERLAY + +map key 86 PLUS + +### ROW 1 + +key GRAVE { + label: '`' + base: '`' + shift: '~' +} + +key 1 { + label: '1' + base: '\u0105' + shift, capslock: '\u0104' + ralt: '1' + shift+ralt: '!' +} + +key 2 { + label: '2' + base: '\u010d' + shift, capslock: '\u010c' + ralt: '2' + shift+ralt: '@' +} + +key 3 { + label: '3' + base: '\u0119' + shift, capslock: '\u0118' + ralt: '3' + shift+ralt: '#' +} + +key 4 { + label: '4' + base: '\u0117' + shift, capslock: '\u0116' + ralt: '4' + shift+ralt: '$' +} + +key 5 { + label: '5' + base: '\u012f' + shift, capslock: '\u012e' + ralt: '5' + shift+ralt: '%' +} + +key 6 { + label: '6' + base: '\u0161' + shift, capslock: '\u0160' + ralt: '6' + shift+ralt: '\u0302' +} + +key 7 { + label: '7' + base: '\u0173' + shift, capslock: '\u0172' + ralt: '7' + shift+ralt: '&' +} + +key 8 { + label: '8' + base: '\u016b' + shift, capslock: '\u016a' + ralt: '8' + shift+ralt: '*' +} + +key 9 { + label: '9' + base: '9' + shift: '(' + ralt: '9' +} + +key 0 { + label: '0' + base: '0' + shift: ')' + ralt: '0' +} + +key MINUS { + label: '-' + base: '-' + shift: '_' +} + +key EQUALS { + label: '=' + base: '\u017e' + shift, capslock: '\u017d' + ralt: '=' + shift+ralt: '+' +} + +### ROW 2 + +key Q { + label: 'Q' + base: 'q' + shift, capslock: 'Q' +} + +key W { + label: 'W' + base: 'w' + shift, capslock: 'W' +} + +key E { + label: 'E' + base: 'e' + shift, capslock: 'E' + ralt: '\u20ac' +} + +key R { + label: 'R' + base: 'r' + shift, capslock: 'R' +} + +key T { + label: 'T' + base: 't' + shift, capslock: 'T' +} + +key Y { + label: 'Y' + base: 'y' + shift, capslock: 'Y' +} + +key U { + label: 'U' + base: 'u' + shift, capslock: 'U' +} + +key I { + label: 'I' + base: 'i' + shift, capslock: 'I' +} + +key O { + label: 'O' + base: 'o' + shift, capslock: 'O' +} + +key P { + label: 'P' + base: 'p' + shift, capslock: 'P' +} + +key LEFT_BRACKET { + label: '[' + base: '[' + shift: '{' +} + +key RIGHT_BRACKET { + label: ']' + base: ']' + shift: '}' +} + +### ROW 3 + +key A { + label: 'A' + base: 'a' + shift, capslock: 'A' +} + +key S { + label: 'S' + base: 's' + shift, capslock: 'S' +} + +key D { + label: 'D' + base: 'd' + shift, capslock: 'D' +} + +key F { + label: 'F' + base: 'f' + shift, capslock: 'F' +} + +key G { + label: 'G' + base: 'g' + shift, capslock: 'G' +} + +key H { + label: 'H' + base: 'h' + shift, capslock: 'H' +} + +key J { + label: 'J' + base: 'j' + shift, capslock: 'J' +} + +key K { + label: 'K' + base: 'k' + shift, capslock: 'K' +} + +key L { + label: 'L' + base: 'l' + shift, capslock: 'L' +} + +key SEMICOLON { + label: ';' + base: ';' + shift: ':' +} + +key APOSTROPHE { + label: '\'' + base: '\'' + shift: '"' +} + +key BACKSLASH { + label: '\\' + base: '\\' + shift: '|' +} + +### ROW 4 + +key PLUS { + label: '\\' + base: '\\' + shift: '|' +} + +key Z { + label: 'Z' + base: 'z' + shift, capslock: 'Z' +} + +key X { + label: 'X' + base: 'x' + shift, capslock: 'X' +} + +key C { + label: 'C' + base: 'c' + shift, capslock: 'C' +} + +key V { + label: 'V' + base: 'v' + shift, capslock: 'V' +} + +key B { + label: 'B' + base: 'b' + shift, capslock: 'B' +} + +key N { + label: 'N' + base: 'n' + shift, capslock: 'N' +} + +key M { + label: 'M' + base: 'm' + shift, capslock: 'M' +} + +key COMMA { + label: ',' + base: ',' + shift: '<' +} + +key PERIOD { + label: '.' + base: '.' + shift: '>' +} + +key SLASH { + label: '/' + base: '/' + shift: '?' +} diff --git a/packages/InputDevices/res/raw/keyboard_layout_spanish_latin.kcm b/packages/InputDevices/res/raw/keyboard_layout_spanish_latin.kcm new file mode 100644 index 000000000000..16eb53f29408 --- /dev/null +++ b/packages/InputDevices/res/raw/keyboard_layout_spanish_latin.kcm @@ -0,0 +1,325 @@ +# 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. + +# +# Spanish (Latin) (EU based) keyboard layout. +# + +type OVERLAY + +map key 86 PLUS + +### ROW 1 + +key GRAVE { + label: '|' + base: '|' + shift: '\u00ba' + ralt: '\u00ac' +} + +key 1 { + label: '1' + base: '1' + shift: '!' +} + +key 2 { + label: '2' + base: '2' + shift: '"' +} + +key 3 { + label: '3' + base: '3' + shift: '#' +} + +key 4 { + label: '4' + base: '4' + shift: '$' + +} + +key 5 { + label: '5' + base: '5' + shift: '%' +} + +key 6 { + label: '6' + base: '6' + shift: '&' +} + +key 7 { + label: '7' + base: '7' + shift: '/' +} + +key 8 { + label: '8' + base: '8' + shift: '(' +} + +key 9 { + label: '9' + base: '9' + shift: ')' +} + +key 0 { + label: '0' + base: '0' + shift: '=' +} + +key MINUS { + label: '\'' + base: '\'' + shift: '?' + ralt: '\\' +} + +key EQUALS { + label: '\u00bf' + base: '\u00bf' + shift: '\u00a1' +} + +### ROW 2 + +key Q { + label: 'Q' + base: 'q' + shift, capslock: 'Q' + ralt: '@' +} + +key W { + label: 'W' + base: 'w' + shift, capslock: 'W' +} + +key E { + label: 'E' + base: 'e' + shift, capslock: 'E' +} + +key R { + label: 'R' + base: 'r' + shift, capslock: 'R' +} + +key T { + label: 'T' + base: 't' + shift, capslock: 'T' +} + +key Y { + label: 'Y' + base: 'y' + shift, capslock: 'Y' +} + +key U { + label: 'U' + base: 'u' + shift, capslock: 'U' +} + +key I { + label: 'I' + base: 'i' + shift, capslock: 'I' +} + +key O { + label: 'O' + base: 'o' + shift, capslock: 'O' +} + +key P { + label: 'P' + base: 'p' + shift, capslock: 'P' +} + +key LEFT_BRACKET { + label: '\u00b4' + base: '\u0301' + shift: '\u0308' + ralt: '[' +} + +key RIGHT_BRACKET { + label: '+' + base: '+' + shift: '*' + ralt: '\u0303' +} + +### ROW 3 + +key A { + label: 'A' + base: 'a' + shift, capslock: 'A' +} + +key S { + label: 'S' + base: 's' + shift, capslock: 'S' +} + +key D { + label: 'D' + base: 'd' + shift, capslock: 'D' +} + +key F { + label: 'F' + base: 'f' + shift, capslock: 'F' +} + +key G { + label: 'G' + base: 'g' + shift, capslock: 'G' +} + +key H { + label: 'H' + base: 'h' + shift, capslock: 'H' +} + +key J { + label: 'J' + base: 'j' + shift, capslock: 'J' +} + +key K { + label: 'K' + base: 'k' + shift, capslock: 'K' +} + +key L { + label: 'L' + base: 'l' + shift, capslock: 'L' +} + +key SEMICOLON { + label: '\u00d1' + base: '\u00f1' + shift, capslock: '\u00d1' +} + +key APOSTROPHE { + label: '{' + base: '{' + shift: '[' + ralt: '\u0302' +} + +key BACKSLASH { + label: '}' + base: '}' + shift: ']' + ralt: '\u0300' +} + +### ROW 4 + +key PLUS { + label: '<' + base: '<' + shift: '>' +} + +key Z { + label: 'Z' + base: 'z' + shift, capslock: 'Z' +} + +key X { + label: 'X' + base: 'x' + shift, capslock: 'X' +} + +key C { + label: 'C' + base: 'c' + shift, capslock: 'C' +} + +key V { + label: 'V' + base: 'v' + shift, capslock: 'V' +} + +key B { + label: 'B' + base: 'b' + shift, capslock: 'B' +} + +key N { + label: 'N' + base: 'n' + shift, capslock: 'N' +} + +key M { + label: 'M' + base: 'm' + shift, capslock: 'M' +} + +key COMMA { + label: ',' + base: ',' + shift: ';' +} + +key PERIOD { + label: '.' + base: '.' + shift: ':' +} + +key SLASH { + label: '-' + base: '-' + shift: '_' +} diff --git a/packages/InputDevices/res/values-af/strings.xml b/packages/InputDevices/res/values-af/strings.xml index 13fcbb4ed829..ddaf70672df1 100644 --- a/packages/InputDevices/res/values-af/strings.xml +++ b/packages/InputDevices/res/values-af/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Sloweens"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turks"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Oekraïens"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabies"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grieks"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebreeus"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Litaus"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spaans (Latyn)"</string> </resources> diff --git a/packages/InputDevices/res/values-am/strings.xml b/packages/InputDevices/res/values-am/strings.xml index d475772501ea..09b65e07faae 100644 --- a/packages/InputDevices/res/values-am/strings.xml +++ b/packages/InputDevices/res/values-am/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ስሎቫኒያ"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ቱርክኛ"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ዩክሬን"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"አረብኛ"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"ግሪክኛ"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"ዕብራስጥ"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"ሊቱዌኒያኛ"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"ስፓኒሽ (ላቲን)"</string> </resources> diff --git a/packages/InputDevices/res/values-ar/strings.xml b/packages/InputDevices/res/values-ar/strings.xml index 903d978b9796..4c5cccc93db2 100644 --- a/packages/InputDevices/res/values-ar/strings.xml +++ b/packages/InputDevices/res/values-ar/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"السلوفينية"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"التركية"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"الأوكرانية"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"العربية"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"اليونانية"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"العبرية"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"الليتوانية"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"الإسبانية (اللاتينية)"</string> </resources> diff --git a/packages/InputDevices/res/values-bg/strings.xml b/packages/InputDevices/res/values-bg/strings.xml index 0c413a403d64..cc3eb36ff9c4 100644 --- a/packages/InputDevices/res/values-bg/strings.xml +++ b/packages/InputDevices/res/values-bg/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"словенски"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"турски"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"украински"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Арабска клавиатурна подредба"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Гръцка клавиатурна подредба"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Ивритска клавиатурна подредба"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Литовска клавиатурна подредба"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Исп. клав. подредба (Лат. Америка)"</string> </resources> diff --git a/packages/InputDevices/res/values-ca/strings.xml b/packages/InputDevices/res/values-ca/strings.xml index 2021b8f19804..2c8521c90f47 100644 --- a/packages/InputDevices/res/values-ca/strings.xml +++ b/packages/InputDevices/res/values-ca/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Eslovè"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turc"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraïnès"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Àrab"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grec"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebreu"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituà"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Espanyol (llatí)"</string> </resources> diff --git a/packages/InputDevices/res/values-cs/strings.xml b/packages/InputDevices/res/values-cs/strings.xml index 33b420e14019..9b65eed1940c 100644 --- a/packages/InputDevices/res/values-cs/strings.xml +++ b/packages/InputDevices/res/values-cs/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovinské"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turecké"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrajinské"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"arabština"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"řečtina"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"hebrejština"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"litevština"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"španělština (Latinská Amerika)"</string> </resources> diff --git a/packages/InputDevices/res/values-da/strings.xml b/packages/InputDevices/res/values-da/strings.xml index fc07db20d292..8b157b405cf6 100644 --- a/packages/InputDevices/res/values-da/strings.xml +++ b/packages/InputDevices/res/values-da/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovensk"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Tyrkisk"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainsk"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-de/strings.xml b/packages/InputDevices/res/values-de/strings.xml index b5c3b50c9f7a..b5a58703989a 100644 --- a/packages/InputDevices/res/values-de/strings.xml +++ b/packages/InputDevices/res/values-de/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slowenisch"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Türkisch"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainisch"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabisch"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Griechisch"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebräisch"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Litauisch"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spanisch (Lateinisch)"</string> </resources> diff --git a/packages/InputDevices/res/values-el/strings.xml b/packages/InputDevices/res/values-el/strings.xml index f5d57a0be78c..976f370ebbde 100644 --- a/packages/InputDevices/res/values-el/strings.xml +++ b/packages/InputDevices/res/values-el/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Σλοβενικά"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Τουρκικά"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ουκρανικά"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Αραβικά"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Ελληνικά"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Εβραϊκά"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Λιθουανικά"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Ισπανικά (Λατινικής Αμερικής)"</string> </resources> diff --git a/packages/InputDevices/res/values-en-rGB/strings.xml b/packages/InputDevices/res/values-en-rGB/strings.xml index 2d794a687464..50a98b2616b6 100644 --- a/packages/InputDevices/res/values-en-rGB/strings.xml +++ b/packages/InputDevices/res/values-en-rGB/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenian"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkish"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainian"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabic"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Greek"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebrew"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lithuanian"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spanish (Latin)"</string> </resources> diff --git a/packages/InputDevices/res/values-en-rIN/strings.xml b/packages/InputDevices/res/values-en-rIN/strings.xml index 2d794a687464..50a98b2616b6 100644 --- a/packages/InputDevices/res/values-en-rIN/strings.xml +++ b/packages/InputDevices/res/values-en-rIN/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenian"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkish"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainian"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabic"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Greek"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebrew"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lithuanian"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spanish (Latin)"</string> </resources> diff --git a/packages/InputDevices/res/values-es-rUS/strings.xml b/packages/InputDevices/res/values-es-rUS/strings.xml index 2d61b804d92e..b842a3b17624 100644 --- a/packages/InputDevices/res/values-es-rUS/strings.xml +++ b/packages/InputDevices/res/values-es-rUS/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Esloveno"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraniano"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Árabe"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Griego"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebreo"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituano"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Español (latino)"</string> </resources> diff --git a/packages/InputDevices/res/values-es/strings.xml b/packages/InputDevices/res/values-es/strings.xml index 82ea4d6c5ce1..8cb01c1a1cdc 100644 --- a/packages/InputDevices/res/values-es/strings.xml +++ b/packages/InputDevices/res/values-es/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Esloveno"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraniano"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Árabe"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Griego"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebreo"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituano"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Español (latino)"</string> </resources> diff --git a/packages/InputDevices/res/values-et-rEE/strings.xml b/packages/InputDevices/res/values-et-rEE/strings.xml index 5b4fa3b2baf7..4ffdb375ea77 100644 --- a/packages/InputDevices/res/values-et-rEE/strings.xml +++ b/packages/InputDevices/res/values-et-rEE/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Sloveenia"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Türgi"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraina"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Araabia"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Kreeka"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Heebrea"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Leedu"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Hispaania (Ladina-Ameerika)"</string> </resources> diff --git a/packages/InputDevices/res/values-fa/strings.xml b/packages/InputDevices/res/values-fa/strings.xml index 06c7f3af7528..fd6f54b84f2e 100644 --- a/packages/InputDevices/res/values-fa/strings.xml +++ b/packages/InputDevices/res/values-fa/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"اسلوونیایی"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ترکی"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"اوکراینی"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"عربی"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"یونانی"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"عبری"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"لیتوانیایی"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"اسپانیایی (لاتین)"</string> </resources> diff --git a/packages/InputDevices/res/values-fi/strings.xml b/packages/InputDevices/res/values-fi/strings.xml index 428eb30ab159..7e9b38624332 100644 --- a/packages/InputDevices/res/values-fi/strings.xml +++ b/packages/InputDevices/res/values-fi/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"sloveeni"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turkki"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukraina"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-fr-rCA/strings.xml b/packages/InputDevices/res/values-fr-rCA/strings.xml index c9476349fb31..900040586f1f 100644 --- a/packages/InputDevices/res/values-fr-rCA/strings.xml +++ b/packages/InputDevices/res/values-fr-rCA/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovène"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turc"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainien"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-fr/strings.xml b/packages/InputDevices/res/values-fr/strings.xml index 4ad4ffa8e630..e3ca49c57d38 100644 --- a/packages/InputDevices/res/values-fr/strings.xml +++ b/packages/InputDevices/res/values-fr/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovène"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turc"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainien"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabe"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grec"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hébreu"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituanien"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Espagnol (latin)"</string> </resources> diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml index 8e1864e74ec3..a1a4ef2cf813 100644 --- a/packages/InputDevices/res/values-hi/strings.xml +++ b/packages/InputDevices/res/values-hi/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"स्लोवेनियाई"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"तुर्की"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"यूक्रेनियाई"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"अरबी"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"ग्रीक"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"हिब्रू"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"लिथुआनियाई"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"स्पेनिश (लैटिन)"</string> </resources> diff --git a/packages/InputDevices/res/values-hr/strings.xml b/packages/InputDevices/res/values-hr/strings.xml index 6217bf0d4a21..0f8329320535 100644 --- a/packages/InputDevices/res/values-hr/strings.xml +++ b/packages/InputDevices/res/values-hr/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovenska"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turska"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrajinska"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arapski"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grčki"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebrejski"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Litavski"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Španjolski (Latinska Amerika)"</string> </resources> diff --git a/packages/InputDevices/res/values-hu/strings.xml b/packages/InputDevices/res/values-hu/strings.xml index 0cdbfb2c581d..645e59718a13 100644 --- a/packages/InputDevices/res/values-hu/strings.xml +++ b/packages/InputDevices/res/values-hu/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"szlovén"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"török"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrán"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"arab"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"görög"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"héber"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"litván"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"spanyol (latin-amerikai)"</string> </resources> diff --git a/packages/InputDevices/res/values-hy-rAM/strings.xml b/packages/InputDevices/res/values-hy-rAM/strings.xml index bc5bbfc825f1..282dc8288b55 100644 --- a/packages/InputDevices/res/values-hy-rAM/strings.xml +++ b/packages/InputDevices/res/values-hy-rAM/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Սլովեներեն"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Թուրքերեն"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ուկրաիներեն"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Արաբերեն"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Հունարեն"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Եբրայերեն"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Լիտվերեն"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Իսպաներեն (Լատինական)"</string> </resources> diff --git a/packages/InputDevices/res/values-in/strings.xml b/packages/InputDevices/res/values-in/strings.xml index 11e2dd0a2ffa..a7fc330b0383 100644 --- a/packages/InputDevices/res/values-in/strings.xml +++ b/packages/InputDevices/res/values-in/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenia"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turki"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraina"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arab"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Yunani"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Ibrani"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lithuania"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spanyol (Latin)"</string> </resources> diff --git a/packages/InputDevices/res/values-it/strings.xml b/packages/InputDevices/res/values-it/strings.xml index 334318e4da34..e8fe31081c78 100644 --- a/packages/InputDevices/res/values-it/strings.xml +++ b/packages/InputDevices/res/values-it/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Sloveno"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraino"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabo"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Greco"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Ebraico"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituano"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spagnolo (America Latina)"</string> </resources> diff --git a/packages/InputDevices/res/values-iw/strings.xml b/packages/InputDevices/res/values-iw/strings.xml index a9893916ccf3..d2673d9b9499 100644 --- a/packages/InputDevices/res/values-iw/strings.xml +++ b/packages/InputDevices/res/values-iw/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"סלובנית"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"טורקית"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"אוקראינית"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"ערבית"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"יוונית"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"עברית"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"ליטאית"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"ספרדית (לטינית)"</string> </resources> diff --git a/packages/InputDevices/res/values-ja/strings.xml b/packages/InputDevices/res/values-ja/strings.xml index 950b727c834e..86cd30ecd523 100644 --- a/packages/InputDevices/res/values-ja/strings.xml +++ b/packages/InputDevices/res/values-ja/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"スロベニア語"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"トルコ語"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ウクライナ語"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"アラビア語"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"ギリシャ語"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"ヘブライ語"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"リトアニア語"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"スペイン語(中南米)"</string> </resources> diff --git a/packages/InputDevices/res/values-ka-rGE/strings.xml b/packages/InputDevices/res/values-ka-rGE/strings.xml index 6e507aa33278..14ebee83e1cb 100644 --- a/packages/InputDevices/res/values-ka-rGE/strings.xml +++ b/packages/InputDevices/res/values-ka-rGE/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"სლოვენური"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"თურქული"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"უკრაინული"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"არაბული"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"ბერძნული"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"ებრაული"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"ლიტვური"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"ესპანური (ლათინური)"</string> </resources> diff --git a/packages/InputDevices/res/values-km-rKH/strings.xml b/packages/InputDevices/res/values-km-rKH/strings.xml index 9a8c99b453ac..569f273d623d 100644 --- a/packages/InputDevices/res/values-km-rKH/strings.xml +++ b/packages/InputDevices/res/values-km-rKH/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ស្លូវ៉ានី"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ទួរគី"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"អ៊ុយក្រែន"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"អារ៉ាប់"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"ក្រិក"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"អ៊ីស្រាអែល"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"លីទុយអានី"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"អេស្ប៉ាញ (ឡាតាំង)"</string> </resources> diff --git a/packages/InputDevices/res/values-ko/strings.xml b/packages/InputDevices/res/values-ko/strings.xml index 8071586acf3f..dbbe6eadbd5e 100644 --- a/packages/InputDevices/res/values-ko/strings.xml +++ b/packages/InputDevices/res/values-ko/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"슬로베니아어"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"터키어"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"우크라이나어"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"아랍어"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"그리스어"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"히브리어"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"리투아니아어"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"스페인어(라틴)"</string> </resources> diff --git a/packages/InputDevices/res/values-lo-rLA/strings.xml b/packages/InputDevices/res/values-lo-rLA/strings.xml index 2c97e115bd68..eaf5026a6140 100644 --- a/packages/InputDevices/res/values-lo-rLA/strings.xml +++ b/packages/InputDevices/res/values-lo-rLA/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ສະໂລເວນຽນ"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ເຕີກິສ"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ຢູເຄຣນຽນ"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"ອາຣັບ"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"ກຣີກ"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"ຮີບຣິວ"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"ລິທົວນຽນ"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"ສະແປນນິດ (ລາຕິນ)"</string> </resources> diff --git a/packages/InputDevices/res/values-lt/strings.xml b/packages/InputDevices/res/values-lt/strings.xml index c0ed159d5c3c..2fcacded9934 100644 --- a/packages/InputDevices/res/values-lt/strings.xml +++ b/packages/InputDevices/res/values-lt/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovėnų k."</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkų k."</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainiečių k."</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabų"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Graikų"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebrajų"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lietuvių"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Ispanų (Lotynų Amerika)"</string> </resources> diff --git a/packages/InputDevices/res/values-lv/strings.xml b/packages/InputDevices/res/values-lv/strings.xml index 07a86544f9c6..921c8814843d 100644 --- a/packages/InputDevices/res/values-lv/strings.xml +++ b/packages/InputDevices/res/values-lv/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovēņu"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turku"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraiņu"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arābu"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grieķu"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Ivrits"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lietuviešu"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spāņu (latīņu)"</string> </resources> diff --git a/packages/InputDevices/res/values-mn-rMN/strings.xml b/packages/InputDevices/res/values-mn-rMN/strings.xml index ec6cccb2abe0..c99339efe490 100644 --- a/packages/InputDevices/res/values-mn-rMN/strings.xml +++ b/packages/InputDevices/res/values-mn-rMN/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Словени"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Турк"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Украйн"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Араб"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Грек"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Еврей"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Литви"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Испани (Латин)"</string> </resources> diff --git a/packages/InputDevices/res/values-ms-rMY/strings.xml b/packages/InputDevices/res/values-ms-rMY/strings.xml index 486f0487e27f..b26a63318f4c 100644 --- a/packages/InputDevices/res/values-ms-rMY/strings.xml +++ b/packages/InputDevices/res/values-ms-rMY/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Bahasa Slovenia"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Bahasa Turki"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Bahasa Ukraine"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-nb/strings.xml b/packages/InputDevices/res/values-nb/strings.xml index b646061fe96e..e8809811d7dd 100644 --- a/packages/InputDevices/res/values-nb/strings.xml +++ b/packages/InputDevices/res/values-nb/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovensk"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Tyrkisk"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainsk"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabisk"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Gresk"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebraisk"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Litauisk"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spansk (latinsk)"</string> </resources> diff --git a/packages/InputDevices/res/values-nl/strings.xml b/packages/InputDevices/res/values-nl/strings.xml index 56d84c95c55d..92a9fcfc88c7 100644 --- a/packages/InputDevices/res/values-nl/strings.xml +++ b/packages/InputDevices/res/values-nl/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Sloveens"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turks"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Oekraïens"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabisch"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grieks"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebreeuws"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Litouws"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spaans (Latijns-Amerika)"</string> </resources> diff --git a/packages/InputDevices/res/values-pl/strings.xml b/packages/InputDevices/res/values-pl/strings.xml index 4522215c08ee..828a45f3be98 100644 --- a/packages/InputDevices/res/values-pl/strings.xml +++ b/packages/InputDevices/res/values-pl/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Słoweński"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turecki"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraiński"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-pt-rPT/strings.xml b/packages/InputDevices/res/values-pt-rPT/strings.xml index 9a639cd49340..670baddcccab 100644 --- a/packages/InputDevices/res/values-pt-rPT/strings.xml +++ b/packages/InputDevices/res/values-pt-rPT/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Esloveno"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraniano"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Árabe"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grego"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebraico"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituano"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Espanhol (América Latina)"</string> </resources> diff --git a/packages/InputDevices/res/values-pt/strings.xml b/packages/InputDevices/res/values-pt/strings.xml index 05a0cd09af7e..71274aa58204 100644 --- a/packages/InputDevices/res/values-pt/strings.xml +++ b/packages/InputDevices/res/values-pt/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Esloveno"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turco"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraniano"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Árabe"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grego"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebraico"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituano"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Espanhol (América Latina)"</string> </resources> diff --git a/packages/InputDevices/res/values-ro/strings.xml b/packages/InputDevices/res/values-ro/strings.xml index 895d8f6ce051..c61455df4898 100644 --- a/packages/InputDevices/res/values-ro/strings.xml +++ b/packages/InputDevices/res/values-ro/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenă"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turcă"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ucraineană"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-ru/strings.xml b/packages/InputDevices/res/values-ru/strings.xml index a4cbfd7437ad..8b93723dc291 100644 --- a/packages/InputDevices/res/values-ru/strings.xml +++ b/packages/InputDevices/res/values-ru/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"словенский"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"турецкий"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"украинский"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-sk/strings.xml b/packages/InputDevices/res/values-sk/strings.xml index 01ab042c5b4d..ec511b391d3c 100644 --- a/packages/InputDevices/res/values-sk/strings.xml +++ b/packages/InputDevices/res/values-sk/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovinské"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turecké"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrajinské"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-sl/strings.xml b/packages/InputDevices/res/values-sl/strings.xml index 30ff3c456d57..b8fc823e2153 100644 --- a/packages/InputDevices/res/values-sl/strings.xml +++ b/packages/InputDevices/res/values-sl/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovenska"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turška"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrajinska"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"arabščina"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"grščina"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"hebrejščina"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"litovščina"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"španščina (Latinska Amerika)"</string> </resources> diff --git a/packages/InputDevices/res/values-sr/strings.xml b/packages/InputDevices/res/values-sr/strings.xml index d23ac008a816..45e0b4be20ec 100644 --- a/packages/InputDevices/res/values-sr/strings.xml +++ b/packages/InputDevices/res/values-sr/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"словеначка"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"турска"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"украјинска"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"арапски"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"грчки"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"хебрејски"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"литвански"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"шпански (Латинска Америка)"</string> </resources> diff --git a/packages/InputDevices/res/values-sv/strings.xml b/packages/InputDevices/res/values-sv/strings.xml index 25a5ae856ed0..ce20bff1b32c 100644 --- a/packages/InputDevices/res/values-sv/strings.xml +++ b/packages/InputDevices/res/values-sv/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenskt"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkiskt"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainskt"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabiska"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grekiska"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebreiska"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Litauiska"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spanska (latinamerikansk)"</string> </resources> diff --git a/packages/InputDevices/res/values-sw/strings.xml b/packages/InputDevices/res/values-sw/strings.xml index 65ab96a18da4..38bc83a06865 100644 --- a/packages/InputDevices/res/values-sw/strings.xml +++ b/packages/InputDevices/res/values-sw/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Kislovenia"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Kituruki"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Kiukrania"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Kiarabu"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Kigiriki"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Kiyahudi"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Kilithuania"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Kihispania (Kilatini)"</string> </resources> diff --git a/packages/InputDevices/res/values-th/strings.xml b/packages/InputDevices/res/values-th/strings.xml index 0cc7d47ed5c9..895128196ede 100644 --- a/packages/InputDevices/res/values-th/strings.xml +++ b/packages/InputDevices/res/values-th/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"สโลวีเนีย"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ตุรกี"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ยูเครน"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"ภาษาอารบิค"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"กรีก"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"ฮิบรู"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"ลิทัวเนีย"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"สเปน (ละติน)"</string> </resources> diff --git a/packages/InputDevices/res/values-tl/strings.xml b/packages/InputDevices/res/values-tl/strings.xml index 08f34d2de4e6..c551e20f13f5 100644 --- a/packages/InputDevices/res/values-tl/strings.xml +++ b/packages/InputDevices/res/values-tl/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenian"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkish"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainian"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabic"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Greek"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebrew"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lithuanian"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spanish (Latin)"</string> </resources> diff --git a/packages/InputDevices/res/values-tr/strings.xml b/packages/InputDevices/res/values-tr/strings.xml index f7c12626eae2..df9a28047d57 100644 --- a/packages/InputDevices/res/values-tr/strings.xml +++ b/packages/InputDevices/res/values-tr/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovence"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Türkçe"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukraynaca"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-uk/strings.xml b/packages/InputDevices/res/values-uk/strings.xml index ee6ffc7cec13..b4b99237b3f0 100644 --- a/packages/InputDevices/res/values-uk/strings.xml +++ b/packages/InputDevices/res/values-uk/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"словенська"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"турецька"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"українська"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Арабська"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Грецька"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Іврит"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Литовська"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Іспанська (латиниця)"</string> </resources> diff --git a/packages/InputDevices/res/values-vi/strings.xml b/packages/InputDevices/res/values-vi/strings.xml index 7a65e459c1be..18aa989fe5d9 100644 --- a/packages/InputDevices/res/values-vi/strings.xml +++ b/packages/InputDevices/res/values-vi/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Tiếng Sloven"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Tiếng Thổ Nhĩ Kỳ"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Tiếng Ukraina"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Tiếng Ả rập"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Tiếng Hy Lạp"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Tiếng Do Thái"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Tiếng Lithuania"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Tiếng Tây Ban Nha (La tinh)"</string> </resources> diff --git a/packages/InputDevices/res/values-zh-rCN/strings.xml b/packages/InputDevices/res/values-zh-rCN/strings.xml index 85b1c84844d0..e055ce2da145 100644 --- a/packages/InputDevices/res/values-zh-rCN/strings.xml +++ b/packages/InputDevices/res/values-zh-rCN/strings.xml @@ -34,4 +34,14 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"斯洛文尼亚语"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"土耳其语"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"乌克兰语"</string> + <!-- no translation found for keyboard_layout_arabic (5671970465174968712) --> + <skip /> + <!-- no translation found for keyboard_layout_greek (7289253560162386040) --> + <skip /> + <!-- no translation found for keyboard_layout_hebrew (7241473985890173812) --> + <skip /> + <!-- no translation found for keyboard_layout_lithuanian (6943110873053106534) --> + <skip /> + <!-- no translation found for keyboard_layout_spanish_latin (5690539836069535697) --> + <skip /> </resources> diff --git a/packages/InputDevices/res/values-zh-rHK/strings.xml b/packages/InputDevices/res/values-zh-rHK/strings.xml index 839c54646b89..031f29448e00 100644 --- a/packages/InputDevices/res/values-zh-rHK/strings.xml +++ b/packages/InputDevices/res/values-zh-rHK/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"斯洛文尼亞文"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"土耳其文"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"烏克蘭文"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"阿拉伯文"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"希臘文"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"希伯來文"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"立陶宛文"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"西班牙文 (拉丁美洲)"</string> </resources> diff --git a/packages/InputDevices/res/values-zh-rTW/strings.xml b/packages/InputDevices/res/values-zh-rTW/strings.xml index ba9f132d8f62..76cb6a28e4ea 100644 --- a/packages/InputDevices/res/values-zh-rTW/strings.xml +++ b/packages/InputDevices/res/values-zh-rTW/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"斯洛維尼亞文"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"土耳其文"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"烏克蘭文"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"阿拉伯文"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"希臘文"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"希伯來文"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"立陶宛文"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"西班牙文 (拉丁美洲)"</string> </resources> diff --git a/packages/InputDevices/res/values-zu/strings.xml b/packages/InputDevices/res/values-zu/strings.xml index fbf1074c35d7..2cdfe52c692f 100644 --- a/packages/InputDevices/res/values-zu/strings.xml +++ b/packages/InputDevices/res/values-zu/strings.xml @@ -34,4 +34,9 @@ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Isi-Slovenian"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Isi-Turkish"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Isi-Ukrainian"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"I-Arabhu"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Isi-Greek"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Isi-Hebrew"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Isi-Lithuanian"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Isi-Spanish (Latin)"</string> </resources> diff --git a/packages/InputDevices/res/values/strings.xml b/packages/InputDevices/res/values/strings.xml index 54c18f1aafc0..62393361369e 100644 --- a/packages/InputDevices/res/values/strings.xml +++ b/packages/InputDevices/res/values/strings.xml @@ -98,4 +98,19 @@ <!-- Ukrainian keyboard layout label. [CHAR LIMIT=35] --> <string name="keyboard_layout_ukrainian">Ukrainian</string> + + <!-- Arabic keyboard layout label. [CHAR LIMIT=35] --> + <string name="keyboard_layout_arabic">Arabic</string> + + <!-- Greek keyboard layout label. [CHAR LIMIT=35] --> + <string name="keyboard_layout_greek">Greek</string> + + <!-- Hebrew keyboard layout label. [CHAR LIMIT=35] --> + <string name="keyboard_layout_hebrew">Hebrew</string> + + <!-- Lithuanian keyboard layout label. [CHAR LIMIT=35] --> + <string name="keyboard_layout_lithuanian">Lithuanian</string> + + <!-- Spanish (Latin) keyboard layout label. [CHAR LIMIT=35] --> + <string name="keyboard_layout_spanish_latin">Spanish (Latin)</string> </resources> diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml index 1f48a363106e..dc1db0b9e28d 100644 --- a/packages/InputDevices/res/xml/keyboard_layouts.xml +++ b/packages/InputDevices/res/xml/keyboard_layouts.xml @@ -123,4 +123,24 @@ <keyboard-layout android:name="keyboard_layout_ukrainian" android:label="@string/keyboard_layout_ukrainian" android:keyboardLayout="@raw/keyboard_layout_ukrainian" /> + + <keyboard-layout android:name="keyboard_layout_arabic" + android:label="@string/keyboard_layout_arabic" + android:keyboardLayout="@raw/keyboard_layout_arabic" /> + + <keyboard-layout android:name="keyboard_layout_greek" + android:label="@string/keyboard_layout_greek" + android:keyboardLayout="@raw/keyboard_layout_greek" /> + + <keyboard-layout android:name="keyboard_layout_hebrew" + android:label="@string/keyboard_layout_hebrew" + android:keyboardLayout="@raw/keyboard_layout_hebrew" /> + + <keyboard-layout android:name="keyboard_layout_lithuanian" + android:label="@string/keyboard_layout_lithuanian" + android:keyboardLayout="@raw/keyboard_layout_lithuanian" /> + + <keyboard-layout android:name="keyboard_layout_spanish_latin" + android:label="@string/keyboard_layout_spanish_latin" + android:keyboardLayout="@raw/keyboard_layout_spanish_latin" /> </keyboard-layouts> diff --git a/packages/Keyguard/AndroidManifest.xml b/packages/Keyguard/AndroidManifest.xml index 66d1e75f9b10..75b7dbd4a24a 100644 --- a/packages/Keyguard/AndroidManifest.xml +++ b/packages/Keyguard/AndroidManifest.xml @@ -39,11 +39,13 @@ <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" /> <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" /> <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" /> + <uses-permission android:name="android.permission.TRUST_LISTENER" /> <application android:label="@string/app_name" android:process="com.android.systemui" android:persistent="true" - android:supportsRtl="true"> + android:supportsRtl="true" + android:requiredForProfile="all"> <service android:name=".KeyguardService" android:exported="true" /> diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java b/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java index 368a97a251e5..0d5e477b3b0b 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java @@ -104,9 +104,10 @@ public abstract class KeyguardActivityLauncher { // Workaround to avoid camera release/acquisition race when resuming face unlock // after showing lockscreen camera (bug 11063890). - KeyguardUpdateMonitor.getInstance(getContext()).setAlternateUnlockEnabled(false); + KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(getContext()); + updateMonitor.setAlternateUnlockEnabled(false); - if (lockPatternUtils.isSecure()) { + if (mustLaunchSecurely()) { // Launch the secure version of the camera if (wouldLaunchResolverActivity(SECURE_CAMERA_INTENT)) { // TODO: Show disambiguation dialog instead. @@ -123,6 +124,13 @@ public abstract class KeyguardActivityLauncher { } } + private boolean mustLaunchSecurely() { + LockPatternUtils lockPatternUtils = getLockPatternUtils(); + KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(getContext()); + int currentUser = lockPatternUtils.getCurrentUser(); + return lockPatternUtils.isSecure() && !updateMonitor.getUserHasTrust(currentUser); + } + public void launchWidgetPicker(int appWidgetId) { Intent pickIntent = new Intent(AppWidgetManager.ACTION_KEYGUARD_APPWIDGET_PICK); @@ -177,9 +185,9 @@ public abstract class KeyguardActivityLauncher { Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); - boolean isSecure = lockPatternUtils.isSecure(); - if (!isSecure || showsWhileLocked) { - if (!isSecure) { + boolean mustLaunchSecurely = mustLaunchSecurely(); + if (!mustLaunchSecurely || showsWhileLocked) { + if (!mustLaunchSecurely) { dismissKeyguardOnNextActivity(); } try { @@ -253,7 +261,7 @@ public abstract class KeyguardActivityLauncher { } private Intent getCameraIntent() { - return getLockPatternUtils().isSecure() ? SECURE_CAMERA_INTENT : INSECURE_CAMERA_INTENT; + return mustLaunchSecurely() ? SECURE_CAMERA_INTENT : INSECURE_CAMERA_INTENT; } private boolean wouldLaunchResolverActivity(Intent intent) { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java index 9f5768aa62b9..da6482ab9144 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java @@ -23,6 +23,7 @@ import com.android.internal.telephony.IccCardConstants; import com.android.internal.widget.LockPatternUtils; public class KeyguardSecurityModel { + /** * The different types of security available for {@link Mode#UnlockScreen}. * @see com.android.internal.policy.impl.LockPatternKeyguardView#getUnlockMode() @@ -82,6 +83,8 @@ public class KeyguardSecurityModel { } else if (simState == IccCardConstants.State.PUK_REQUIRED && mLockPatternUtils.isPukUnlockScreenEnable()) { mode = SecurityMode.SimPuk; + } else if (updateMonitor.getUserHasTrust(mLockPatternUtils.getCurrentUser())) { + mode = SecurityMode.None; } else { final int security = mLockPatternUtils.getKeyguardStoredPasswordQuality(); switch (security) { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 3b712e928d91..88c78ab1b953 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -20,6 +20,7 @@ import android.app.ActivityManagerNative; import android.app.IUserSwitchObserver; import android.app.PendingIntent; import android.app.admin.DevicePolicyManager; +import android.app.trust.TrustManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -51,6 +52,8 @@ import com.android.internal.telephony.TelephonyIntents; import android.telephony.TelephonyManager; import android.util.Log; +import android.util.SparseBooleanArray; + import com.google.android.collect.Lists; import java.lang.ref.WeakReference; @@ -66,7 +69,7 @@ import java.util.ArrayList; * the device, and {@link #getFailedUnlockAttempts()}, {@link #reportFailedAttempt()} * and {@link #clearFailedUnlockAttempts()}. Maybe we should rename this 'KeyguardContext'... */ -public class KeyguardUpdateMonitor { +public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final String TAG = "KeyguardUpdateMonitor"; private static final boolean DEBUG = false; @@ -205,6 +208,17 @@ public class KeyguardUpdateMonitor { private AudioManager mAudioManager; + private SparseBooleanArray mUserHasTrust = new SparseBooleanArray(); + + @Override + public void onTrustChanged(boolean enabled, int userId) { + mUserHasTrust.put(userId, enabled); + } + + public boolean getUserHasTrust(int userId) { + return mUserHasTrust.get(userId); + } + static class DisplayClientState { public int clientGeneration; public boolean clearing; @@ -581,6 +595,9 @@ public class KeyguardUpdateMonitor { // TODO Auto-generated catch block e.printStackTrace(); } + + TrustManager trustManager = (TrustManager) context.getSystemService(Context.TRUST_SERVICE); + trustManager.registerTrustListener(this); } private boolean isDeviceProvisionedInSettingsDb() { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 481d13285cee..556711b00668 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -178,4 +178,5 @@ class KeyguardUpdateMonitorCallback { * Called when the NFC Service has found a tag that is registered for NFC unlock. */ public void onNfcUnlock() { } + } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java index 31e806c2a1d8..c3aa47f7ecd3 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardViewMediator.java @@ -550,7 +550,9 @@ public class KeyguardViewMediator { @Override public int getSessionType() { - return mLockPatternUtils.isSecure() ? Session.TYPE_KEYGUARD_SECURE + return mLockPatternUtils.isSecure() && !mUpdateMonitor.getUserHasTrust( + mLockPatternUtils.getCurrentUser()) + ? Session.TYPE_KEYGUARD_SECURE : Session.TYPE_KEYGUARD_INSECURE; } }, new File(mContext.getCacheDir(), "keyguard_analytics.bin")); diff --git a/packages/Keyguard/test/SampleTrustAgent/Android.mk b/packages/Keyguard/test/SampleTrustAgent/Android.mk new file mode 100644 index 000000000000..7551fdf8a47f --- /dev/null +++ b/packages/Keyguard/test/SampleTrustAgent/Android.mk @@ -0,0 +1,33 @@ +# Copyright (C) 2014 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. +# + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := SampleTrustAgent + +# Remove these to verify permission checks are working correctly +#LOCAL_CERTIFICATE := platform +#LOCAL_PRIVILEGED_MODULE := true + +LOCAL_MODULE_TAGS := tests + +# LOCAL_PROGUARD_FLAG_FILES := proguard.flags + +LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 + +include $(BUILD_PACKAGE) diff --git a/packages/Keyguard/test/SampleTrustAgent/AndroidManifest.xml b/packages/Keyguard/test/SampleTrustAgent/AndroidManifest.xml new file mode 100644 index 000000000000..15119110bb5d --- /dev/null +++ b/packages/Keyguard/test/SampleTrustAgent/AndroidManifest.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2014 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 + --> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.trustagent.test"> + <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17"/> + <uses-permission android:name="android.permission.CONTROL_KEYGUARD" /> + <application android:label="@string/app_name"> + <service + android:name=".SampleTrustAgent" + android:label="@string/app_name" + android:exported="true"> + <intent-filter> + <action android:name="android.service.trust.TrustAgentService" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + <meta-data android:name="android.service.trust.trustagent" + android:resource="@xml/sample_trust_agent"/> + </service> + + <activity + android:name=".SampleTrustAgentSettings" + android:label="@string/app_name" + android:exported="true" + android:launchMode="singleInstance" > + </activity> + </application> +</manifest> diff --git a/packages/Keyguard/test/SampleTrustAgent/res/layout/sample_trust_agent_settings.xml b/packages/Keyguard/test/SampleTrustAgent/res/layout/sample_trust_agent_settings.xml new file mode 100644 index 000000000000..01b107bb4172 --- /dev/null +++ b/packages/Keyguard/test/SampleTrustAgent/res/layout/sample_trust_agent_settings.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + ~ Copyright (C) 2014 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 + --> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <Button android:id="@+id/enable_trust" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Grant trust for 30 seconds" /> + <Button android:id="@+id/revoke_trust" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Revoke trust" /> + <CheckBox android:id="@+id/report_unlock_attempts" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Report unlock attempts" /> +</LinearLayout>
\ No newline at end of file diff --git a/packages/Keyguard/test/SampleTrustAgent/res/values/strings.xml b/packages/Keyguard/test/SampleTrustAgent/res/values/strings.xml new file mode 100644 index 000000000000..0c6b502701ba --- /dev/null +++ b/packages/Keyguard/test/SampleTrustAgent/res/values/strings.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2014 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 + --> + +<resources> + <string name="app_name">Sample Trust Agent</string> +</resources>
\ No newline at end of file diff --git a/packages/Keyguard/test/SampleTrustAgent/res/xml/sample_trust_agent.xml b/packages/Keyguard/test/SampleTrustAgent/res/xml/sample_trust_agent.xml new file mode 100644 index 000000000000..b48e01162c65 --- /dev/null +++ b/packages/Keyguard/test/SampleTrustAgent/res/xml/sample_trust_agent.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2014 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 + --> +<trust_agent xmlns:android="http://schemas.android.com/apk/res/android" + android:settingsActivity=".SampleTrustAgentSettings" /> diff --git a/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java new file mode 100644 index 000000000000..25406d64cd4e --- /dev/null +++ b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2014 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.trustagent.test; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.service.trust.TrustAgentService; +import android.support.v4.content.LocalBroadcastManager; +import android.widget.Toast; + +public class SampleTrustAgent extends TrustAgentService { + + LocalBroadcastManager mLocalBroadcastManager; + + private static final String ACTION_ENABLE_TRUST = "action.sample_trust_agent.enable_trust"; + private static final String ACTION_REVOKE_TRUST = "action.sample_trust_agent.revoke_trust"; + + private static final String EXTRA_MESSAGE = "extra.message"; + private static final String EXTRA_DURATION = "extra.duration"; + private static final String EXTRA_EXTRA = "extra.extra"; + + private static final String PREFERENCE_REPORT_UNLOCK_ATTEMPTS + = "preference.report_unlock_attempts"; + + @Override + public void onCreate() { + super.onCreate(); + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_ENABLE_TRUST); + filter.addAction(ACTION_REVOKE_TRUST); + mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); + mLocalBroadcastManager.registerReceiver(mReceiver, filter); + } + + @Override + protected void onUnlockAttempt(boolean successful) { + if (getReportUnlockAttempts(this)) { + Toast.makeText(this, "onUnlockAttempt(successful=" + successful + ")", + Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + mLocalBroadcastManager.unregisterReceiver(mReceiver); + } + + private BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (ACTION_ENABLE_TRUST.equals(action)) { + enableTrust(intent.getStringExtra(EXTRA_MESSAGE), + intent.getLongExtra(EXTRA_DURATION, 0), + false /* initiatedByUser */); + } else if (ACTION_REVOKE_TRUST.equals(action)) { + revokeTrust(); + } + } + }; + + public static void sendEnableTrust(Context context, + String message, long durationMs, Bundle extra) { + Intent intent = new Intent(ACTION_ENABLE_TRUST); + intent.putExtra(EXTRA_MESSAGE, message); + intent.putExtra(EXTRA_DURATION, durationMs); + intent.putExtra(EXTRA_EXTRA, extra); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + } + + public static void sendRevokeTrust(Context context) { + Intent intent = new Intent(ACTION_REVOKE_TRUST); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + } + + public static void setReportUnlockAttempts(Context context, boolean enabled) { + SharedPreferences sharedPreferences = PreferenceManager + .getDefaultSharedPreferences(context); + sharedPreferences.edit().putBoolean(PREFERENCE_REPORT_UNLOCK_ATTEMPTS, enabled).apply(); + } + + public static boolean getReportUnlockAttempts(Context context) { + SharedPreferences sharedPreferences = PreferenceManager + .getDefaultSharedPreferences(context); + return sharedPreferences.getBoolean(PREFERENCE_REPORT_UNLOCK_ATTEMPTS, false); + } +} diff --git a/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgentSettings.java b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgentSettings.java new file mode 100644 index 000000000000..0a6f6753bdc5 --- /dev/null +++ b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgentSettings.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2014 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.trustagent.test; + +import android.annotation.Nullable; +import android.app.Activity; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.view.View; +import android.widget.CheckBox; +import android.widget.CompoundButton; + +public class SampleTrustAgentSettings extends Activity implements View.OnClickListener, + CompoundButton.OnCheckedChangeListener { + + private static final int TRUST_DURATION_MS = 30 * 1000; + + private CheckBox mReportUnlockAttempts; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.sample_trust_agent_settings); + + findViewById(R.id.enable_trust).setOnClickListener(this); + findViewById(R.id.revoke_trust).setOnClickListener(this); + + mReportUnlockAttempts = (CheckBox) findViewById(R.id.report_unlock_attempts); + mReportUnlockAttempts.setOnCheckedChangeListener(this); + } + + @Override + protected void onResume() { + super.onResume(); + mReportUnlockAttempts.setChecked(SampleTrustAgent.getReportUnlockAttempts(this)); + } + + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.enable_trust) { + SampleTrustAgent.sendEnableTrust(this, "SampleTrustAgent", TRUST_DURATION_MS, + null /* extra */); + } else if (id == R.id.revoke_trust) { + SampleTrustAgent.sendRevokeTrust(this); + } + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (buttonView.getId() == R.id.report_unlock_attempts) { + SampleTrustAgent.setReportUnlockAttempts(this, isChecked); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java index b85d5b93f61d..90b0c490f86e 100644 --- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java +++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java @@ -407,7 +407,8 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener { } case MotionEvent.ACTION_DOWN: - mWatchingForPull = isInside(mScrollAdapter.getHostView(), x, y); + mWatchingForPull = mScrollAdapter != null && + isInside(mScrollAdapter.getHostView(), x, y); mLastMotionY = y; break; diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java index 0120a035ce33..6e025bb1541d 100644 --- a/policy/src/com/android/internal/policy/impl/GlobalActions.java +++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java @@ -121,13 +121,14 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); context.registerReceiver(mBroadcastReceiver, filter); + ConnectivityManager cm = (ConnectivityManager) + context.getSystemService(Context.CONNECTIVITY_SERVICE); + mHasTelephony = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); + // get notified of phone state changes TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE); - ConnectivityManager cm = (ConnectivityManager) - context.getSystemService(Context.CONNECTIVITY_SERVICE); - mHasTelephony = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON), true, mAirplaneModeObserver); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5fa908412fde..004d4febae5c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -945,6 +945,11 @@ public final class ActivityManagerService extends ActivityManagerNative */ boolean mDidDexOpt; + /** + * Set if the systemServer made a call to enterSafeMode. + */ + boolean mSafeMode; + String mDebugApp = null; boolean mWaitForDebugger = false; boolean mDebugTransient = false; @@ -2737,7 +2742,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Run the app in safe mode if its manifest requests so or the // system is booted in safe mode. if ((app.info.flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0 || - Zygote.systemInSafeMode == true) { + mSafeMode == true) { debugFlags |= Zygote.DEBUG_ENABLE_SAFEMODE; } if ("1".equals(SystemProperties.get("debug.checkjni"))) { @@ -8963,6 +8968,8 @@ public final class ActivityManagerService extends ActivityManagerNative } catch (RemoteException e) { } } + + mSafeMode = true; } } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 36e53a3fbb47..6ee3e07a8a87 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2708,6 +2708,9 @@ final class ActivityStack { if (mResumedActivity == r) { mResumedActivity = null; } + if (mPausingActivity == r) { + mPausingActivity = null; + } if (mService.mFocusedActivity == r) { mService.mFocusedActivity = null; } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecService.java b/services/core/java/com/android/server/hdmi/HdmiCecService.java index 36a6e84f5752..0a7236c7d7e4 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecService.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecService.java @@ -37,6 +37,8 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Locale; +import libcore.util.EmptyArray; + /** * Provides a service for sending and processing HDMI-CEC messages, and providing * the information on HDMI settings in general. @@ -63,6 +65,8 @@ public final class HdmiCecService extends SystemService { private static final String PERMISSION = "android.permission.HDMI_CEC"; + private static final byte[] EMPTY_PARAM = EmptyArray.BYTE; + public HdmiCecService(Context context) { super(context); } @@ -285,7 +289,13 @@ public final class HdmiCecService extends SystemService { synchronized (mLock) { HdmiCecDevice device = getLogicalDeviceLocked(b); device.setIsActiveSource(true); - nativeSendActiveSource(mNativePtr, device.getType()); + int physicalAddress = nativeGetPhysicalAddress(mNativePtr); + byte[] param = new byte[] { + (byte) ((physicalAddress >> 8) & 0xff), + (byte) (physicalAddress & 0xff) + }; + nativeSendMessage(mNativePtr, device.getType(), HdmiCec.ADDR_BROADCAST, + HdmiCec.MESSAGE_ACTIVE_SOURCE, param); } } @@ -295,7 +305,8 @@ public final class HdmiCecService extends SystemService { synchronized (mLock) { HdmiCecDevice device = getLogicalDeviceLocked(b); device.setIsActiveSource(false); - nativeSendInactiveSource(mNativePtr, device.getType()); + nativeSendMessage(mNativePtr, device.getType(), HdmiCec.ADDR_BROADCAST, + HdmiCec.MESSAGE_INACTIVE_SOURCE, EMPTY_PARAM); } } @@ -304,7 +315,8 @@ public final class HdmiCecService extends SystemService { enforceAccessPermission(); synchronized (mLock) { HdmiCecDevice device = getLogicalDeviceLocked(b); - nativeSendImageViewOn(mNativePtr, device.getType()); + nativeSendMessage(mNativePtr, device.getType(), HdmiCec.ADDR_TV, + HdmiCec.MESSAGE_IMAGE_VIEW_ON, EMPTY_PARAM); } } @@ -313,7 +325,8 @@ public final class HdmiCecService extends SystemService { enforceAccessPermission(); synchronized (mLock) { HdmiCecDevice device = getLogicalDeviceLocked(b); - nativeSendTextViewOn(mNativePtr, device.getType()); + nativeSendMessage(mNativePtr, device.getType(), HdmiCec.ADDR_TV, + HdmiCec.MESSAGE_TEXT_VIEW_ON, EMPTY_PARAM); } } @@ -322,7 +335,8 @@ public final class HdmiCecService extends SystemService { enforceAccessPermission(); synchronized (mLock) { HdmiCecDevice device = getLogicalDeviceLocked(b); - nativeSendGiveDevicePowerStatus(mNativePtr, device.getType(), address); + nativeSendMessage(mNativePtr, device.getType(), address, + HdmiCec.MESSAGE_GIVE_DEVICE_POWER_STATUS, EMPTY_PARAM); } } @@ -366,7 +380,8 @@ public final class HdmiCecService extends SystemService { if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { pw.println("Permission denial: can't dump HdmiCecService from pid=" - + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); + + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() + + " without permission " + android.Manifest.permission.DUMP); return; } final long ident = Binder.clearCallingIdentity(); @@ -382,10 +397,5 @@ public final class HdmiCecService extends SystemService { private static native void nativeRemoveLogicalAddress(long handler, int deviceType); private static native void nativeSendMessage(long handler, int deviceType, int destination, int opcode, byte[] params); - private static native void nativeSendActiveSource(long handler, int deviceType); - private static native void nativeSendInactiveSource(long handler, int deviceType); - private static native void nativeSendImageViewOn(long handler, int deviceType); - private static native void nativeSendTextViewOn(long handler, int deviceType); - private static native void nativeSendGiveDevicePowerStatus(long handler, int deviceType, - int address); + private static native int nativeGetPhysicalAddress(long handler); } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index ccd6f602bc85..b4f7ae6785a7 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -78,6 +78,7 @@ import android.widget.Toast; import com.android.internal.R; import com.android.internal.notification.NotificationScorer; import com.android.server.EventLogTags; +import com.android.server.notification.NotificationUsageStats.SingleNotificationStats; import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.SystemService; import com.android.server.lights.Light; @@ -205,6 +206,8 @@ public class NotificationManagerService extends SystemService { final ArrayList<NotificationScorer> mScorers = new ArrayList<NotificationScorer>(); + private final NotificationUsageStats mUsageStats = new NotificationUsageStats(); + private int mZenMode; // temporary, until we update apps to provide metadata private static final Set<String> CALL_PACKAGES = new HashSet<String>(Arrays.asList( @@ -791,6 +794,7 @@ public class NotificationManagerService extends SystemService { public static final class NotificationRecord { final StatusBarNotification sbn; + final SingleNotificationStats stats = new SingleNotificationStats(); IBinder statusBarKey; NotificationRecord(StatusBarNotification sbn) @@ -861,6 +865,7 @@ public class NotificationManagerService extends SystemService { } pw.println(prefix + " }"); } + pw.println(prefix + " stats=" + stats.toString()); } @Override @@ -1758,6 +1763,9 @@ public class NotificationManagerService extends SystemService { } } + pw.println("\n Usage Stats:"); + mUsageStats.dump(pw, " "); + } } @@ -1905,9 +1913,11 @@ public class NotificationManagerService extends SystemService { int index = indexOfNotificationLocked(pkg, tag, id, userId); if (index < 0) { mNotificationList.add(r); + mUsageStats.registerPostedByApp(r); } else { old = mNotificationList.remove(index); mNotificationList.add(index, r); + mUsageStats.registerUpdatedByApp(r); // Make sure we don't lose the foreground service state. if (old != null) { notification.flags |= @@ -2300,7 +2310,7 @@ public class NotificationManagerService extends SystemService { manager.sendAccessibilityEvent(event); } - private void cancelNotificationLocked(NotificationRecord r, boolean sendDelete) { + private void cancelNotificationLocked(NotificationRecord r, boolean sendDelete, int reason) { // tell the app if (sendDelete) { if (r.getNotification().deleteIntent != null) { @@ -2359,6 +2369,26 @@ public class NotificationManagerService extends SystemService { mLedNotification = null; } + // Record usage stats + switch (reason) { + case REASON_DELEGATE_CANCEL: + case REASON_DELEGATE_CANCEL_ALL: + case REASON_LISTENER_CANCEL: + case REASON_LISTENER_CANCEL_ALL: + mUsageStats.registerDismissedByUser(r); + break; + case REASON_NOMAN_CANCEL: + case REASON_NOMAN_CANCEL_ALL: + mUsageStats.registerRemovedByApp(r); + break; + case REASON_DELEGATE_CLICK: + mUsageStats.registerCancelDueToClick(r); + break; + default: + mUsageStats.registerCancelUnknown(r); + break; + } + // Save it for users of getHistoricalNotifications() mArchive.record(r.sbn); } @@ -2387,6 +2417,12 @@ public class NotificationManagerService extends SystemService { if (index >= 0) { NotificationRecord r = mNotificationList.get(index); + // Ideally we'd do this in the caller of this method. However, that would + // require the caller to also find the notification. + if (reason == REASON_DELEGATE_CLICK) { + mUsageStats.registerClickedByUser(r); + } + if ((r.getNotification().flags & mustHaveFlags) != mustHaveFlags) { return; } @@ -2397,7 +2433,7 @@ public class NotificationManagerService extends SystemService { mNotificationList.remove(index); mNotificationsByKey.remove(r.sbn.getKey()); - cancelNotificationLocked(r, sendDelete); + cancelNotificationLocked(r, sendDelete, reason); updateLightsLocked(); } } @@ -2469,7 +2505,7 @@ public class NotificationManagerService extends SystemService { } mNotificationList.remove(i); mNotificationsByKey.remove(r.sbn.getKey()); - cancelNotificationLocked(r, false); + cancelNotificationLocked(r, false, reason); } if (canceledSomething) { updateLightsLocked(); @@ -2521,6 +2557,7 @@ public class NotificationManagerService extends SystemService { EventLogTags.writeNotificationCancelAll(callingUid, callingPid, null, userId, 0, 0, reason, listener == null ? null : listener.component.toShortString()); + final int N = mNotificationList.size(); for (int i=N-1; i>=0; i--) { NotificationRecord r = mNotificationList.get(i); @@ -2532,7 +2569,7 @@ public class NotificationManagerService extends SystemService { | Notification.FLAG_NO_CLEAR)) == 0) { mNotificationList.remove(i); mNotificationsByKey.remove(r.sbn.getKey()); - cancelNotificationLocked(r, true); + cancelNotificationLocked(r, true, reason); } } updateLightsLocked(); diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java new file mode 100644 index 000000000000..faa5a432af7d --- /dev/null +++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java @@ -0,0 +1,271 @@ +/* + * Copyright (C) 2014 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.server.notification; + +import com.android.server.notification.NotificationManagerService.NotificationRecord; + +import android.os.SystemClock; +import android.service.notification.StatusBarNotification; +import android.util.Log; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * Keeps track of notification activity, display, and user interaction. + * + * <p>This class receives signals from NoMan and keeps running stats of + * notification usage. Some metrics are updated as events occur. Others, namely + * those involving durations, are updated as the notification is canceled.</p> + * + * <p>This class is thread-safe.</p> + * + * {@hide} + */ +public class NotificationUsageStats { + + // Guarded by synchronized(this). + private final Map<String, AggregatedStats> mStats = new HashMap<String, AggregatedStats>(); + + /** + * Called when a notification has been posted. + */ + public synchronized void registerPostedByApp(NotificationRecord notification) { + notification.stats.posttimeElapsedMs = SystemClock.elapsedRealtime(); + for (AggregatedStats stats : getAggregatedStatsLocked(notification)) { + stats.numPostedByApp++; + } + } + + /** + * Called when a notification has been updated. + */ + public void registerUpdatedByApp(NotificationRecord notification) { + for (AggregatedStats stats : getAggregatedStatsLocked(notification)) { + stats.numUpdatedByApp++; + } + } + + /** + * Called when the originating app removed the notification programmatically. + */ + public synchronized void registerRemovedByApp(NotificationRecord notification) { + for (AggregatedStats stats : getAggregatedStatsLocked(notification)) { + stats.numRemovedByApp++; + stats.collect(notification.stats); + } + } + + /** + * Called when the user dismissed the notification via the UI. + */ + public synchronized void registerDismissedByUser(NotificationRecord notification) { + notification.stats.onDismiss(); + for (AggregatedStats stats : getAggregatedStatsLocked(notification)) { + stats.numDismissedByUser++; + stats.collect(notification.stats); + } + } + + /** + * Called when the user clicked the notification in the UI. + */ + public synchronized void registerClickedByUser(NotificationRecord notification) { + notification.stats.onClick(); + for (AggregatedStats stats : getAggregatedStatsLocked(notification)) { + stats.numClickedByUser++; + } + } + + /** + * Called when the notification is canceled because the user clicked it. + * + * <p>Called after {@link #registerClickedByUser(NotificationRecord)}.</p> + */ + public synchronized void registerCancelDueToClick(NotificationRecord notification) { + // No explicit stats for this (the click has already been registered in + // registerClickedByUser), just make sure the single notification stats + // are folded up into aggregated stats. + for (AggregatedStats stats : getAggregatedStatsLocked(notification)) { + stats.collect(notification.stats); + } + } + + /** + * Called when the notification is canceled due to unknown reasons. + * + * <p>Called for notifications of apps being uninstalled, for example.</p> + */ + public synchronized void registerCancelUnknown(NotificationRecord notification) { + // Fold up individual stats. + for (AggregatedStats stats : getAggregatedStatsLocked(notification)) { + stats.collect(notification.stats); + } + } + + // Locked by this. + private AggregatedStats[] getAggregatedStatsLocked(NotificationRecord record) { + StatusBarNotification n = record.sbn; + + String user = String.valueOf(n.getUserId()); + String userPackage = user + ":" + n.getPackageName(); + + // TODO: Use pool of arrays. + return new AggregatedStats[] { + getOrCreateAggregatedStatsLocked(user), + getOrCreateAggregatedStatsLocked(userPackage), + getOrCreateAggregatedStatsLocked(n.getKey()), + }; + } + + // Locked by this. + private AggregatedStats getOrCreateAggregatedStatsLocked(String key) { + AggregatedStats result = mStats.get(key); + if (result == null) { + result = new AggregatedStats(key); + mStats.put(key, result); + } + return result; + } + + public synchronized void dump(PrintWriter pw, String indent) { + for (AggregatedStats as : mStats.values()) { + as.dump(pw, indent); + } + } + + /** + * Aggregated notification stats. + */ + private static class AggregatedStats { + public final String key; + + // ---- Updated as the respective events occur. + public int numPostedByApp; + public int numUpdatedByApp; + public int numRemovedByApp; + public int numClickedByUser; + public int numDismissedByUser; + + // ---- Updated when a notification is canceled. + public final Aggregate posttimeMs = new Aggregate(); + public final Aggregate posttimeToDismissMs = new Aggregate(); + public final Aggregate posttimeToFirstClickMs = new Aggregate(); + + public AggregatedStats(String key) { + this.key = key; + } + + public void collect(SingleNotificationStats singleNotificationStats) { + posttimeMs.addSample( + SystemClock.elapsedRealtime() - singleNotificationStats.posttimeElapsedMs); + if (singleNotificationStats.posttimeToDismissMs >= 0) { + posttimeToDismissMs.addSample(singleNotificationStats.posttimeToDismissMs); + } + if (singleNotificationStats.posttimeToFirstClickMs >= 0) { + posttimeToFirstClickMs.addSample(singleNotificationStats.posttimeToFirstClickMs); + } + } + + public void dump(PrintWriter pw, String indent) { + pw.println(toStringWithIndent(indent)); + } + + @Override + public String toString() { + return toStringWithIndent(""); + } + + private String toStringWithIndent(String indent) { + return indent + "AggregatedStats{\n" + + indent + " key='" + key + "',\n" + + indent + " numPostedByApp=" + numPostedByApp + ",\n" + + indent + " numUpdatedByApp=" + numUpdatedByApp + ",\n" + + indent + " numRemovedByApp=" + numRemovedByApp + ",\n" + + indent + " numClickedByUser=" + numClickedByUser + ",\n" + + indent + " numDismissedByUser=" + numDismissedByUser + ",\n" + + indent + " posttimeMs=" + posttimeMs + ",\n" + + indent + " posttimeToDismissMs=" + posttimeToDismissMs + ",\n" + + indent + " posttimeToFirstClickMs=" + posttimeToFirstClickMs + ",\n" + + indent + "}"; + } + } + + /** + * Tracks usage of an individual notification that is currently active. + */ + public static class SingleNotificationStats { + /** SystemClock.elapsedRealtime() when the notification was posted. */ + public long posttimeElapsedMs = -1; + /** Elapsed time since the notification was posted until it was first clicked, or -1. */ + public long posttimeToFirstClickMs = -1; + /** Elpased time since the notification was posted until it was dismissed by the user. */ + public long posttimeToDismissMs = -1; + + /** + * Called when the user clicked the notification. + */ + public void onClick() { + if (posttimeToFirstClickMs < 0) { + posttimeToFirstClickMs = SystemClock.elapsedRealtime() - posttimeElapsedMs; + } + } + + /** + * Called when the user removed the notification. + */ + public void onDismiss() { + if (posttimeToDismissMs < 0) { + posttimeToDismissMs = SystemClock.elapsedRealtime() - posttimeElapsedMs; + } + } + + @Override + public String toString() { + return "SingleNotificationStats{" + + "posttimeElapsedMs=" + posttimeElapsedMs + + ", posttimeToFirstClickMs=" + posttimeToFirstClickMs + + ", posttimeToDismissMs=" + posttimeToDismissMs + + '}'; + } + } + + /** + * Aggregates long samples to sum and averages. + */ + public static class Aggregate { + long numSamples; + long sum; + long avg; + + public void addSample(long sample) { + numSamples++; + sum += sample; + avg = sum / numSamples; + } + + @Override + public String toString() { + return "Aggregate{" + + "numSamples=" + numSamples + + ", sum=" + sum + + ", avg=" + avg + + '}'; + } + } +} diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index ae1cfab4c8c7..ff816ea9f3f5 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -407,7 +407,14 @@ public final class Installer extends SystemService { return execute(builder.toString()); } - public boolean restoreconData() { - return (execute("restorecondata") == 0); + public boolean restoreconData(String pkgName, String seinfo, int uid) { + StringBuilder builder = new StringBuilder("restorecondata"); + builder.append(' '); + builder.append(pkgName); + builder.append(' '); + builder.append(seinfo != null ? seinfo : "!"); + builder.append(' '); + builder.append(uid); + return (execute(builder.toString()) == 0); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a07ad5a88abc..09a414e49777 100755 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -402,6 +402,9 @@ public class PackageManagerService extends IPackageManager.Stub { // If mac_permissions.xml was found for seinfo labeling. boolean mFoundPolicyFile; + // If a recursive restorecon of /data/data/<pkg> is needed. + private boolean mShouldRestoreconData = SELinuxMMAC.shouldRestorecon(); + // All available activities, for your resolving pleasure. final ActivityIntentResolver mActivities = new ActivityIntentResolver(); @@ -1536,13 +1539,6 @@ public class PackageManagerService extends IPackageManager.Stub { // can downgrade to reader mSettings.writeLPr(); - if (SELinuxMMAC.shouldRestorecon()) { - Slog.i(TAG, "Relabeling of /data/data and /data/user issued."); - if (mInstaller.restoreconData()) { - SELinuxMMAC.setRestoreconDone(); - } - } - EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY, SystemClock.uptimeMillis()); @@ -4787,6 +4783,11 @@ public class PackageManagerService extends IPackageManager.Stub { } } pkg.applicationInfo.dataDir = dataPath.getPath(); + if (mShouldRestoreconData) { + Slog.i(TAG, "SELinux relabeling of " + pkg.packageName + " issued."); + mInstaller.restoreconData(pkg.packageName, pkg.applicationInfo.seinfo, + pkg.applicationInfo.uid); + } } else { if (DEBUG_PACKAGE_SCANNING) { if ((parseFlags & PackageParser.PARSE_CHATTY) != 0) @@ -11432,6 +11433,10 @@ public class PackageManagerService extends IPackageManager.Stub { */ public void scanAvailableAsecs() { updateExternalMediaStatusInner(true, false, false); + if (mShouldRestoreconData) { + SELinuxMMAC.setRestoreconDone(); + mShouldRestoreconData = false; + } } /* diff --git a/services/core/java/com/android/server/trust/TrustAgentWrapper.java b/services/core/java/com/android/server/trust/TrustAgentWrapper.java new file mode 100644 index 000000000000..a83fa877de6c --- /dev/null +++ b/services/core/java/com/android/server/trust/TrustAgentWrapper.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2014 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.server.trust; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.os.RemoteException; +import android.os.UserHandle; +import android.util.Log; +import android.util.Slog; +import android.service.trust.ITrustAgentService; +import android.service.trust.ITrustAgentServiceCallback; + +/** + * A wrapper around a TrustAgentService interface. Coordinates communication between + * TrustManager and the actual TrustAgent. + */ +public class TrustAgentWrapper { + private static final boolean DEBUG = false; + private static final String TAG = "TrustAgentWrapper"; + + private static final int MSG_ENABLE_TRUST = 1; + private static final int MSG_REVOKE_TRUST = 2; + private static final int MSG_TRUST_TIMEOUT = 3; + + private final TrustManagerService mTrustManagerService; + private final int mUserId; + private final Context mContext; + private final ComponentName mName; + + private ITrustAgentService mTrustAgentService; + + // Trust state + private boolean mTrusted; + private String mMessage; + + private final Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_ENABLE_TRUST: + mTrusted = true; + mMessage = (String) msg.obj; + boolean initiatedByUser = msg.arg1 != 0; + // TODO: Handle handle user initiated trust changes. + mTrustManagerService.updateTrust(mUserId); + break; + case MSG_TRUST_TIMEOUT: + if (DEBUG) Slog.v(TAG, "Trust timed out : " + mName.flattenToShortString()); + // Fall through. + case MSG_REVOKE_TRUST: + mTrusted = false; + mMessage = null; + mTrustManagerService.updateTrust(mUserId); + break; + } + } + }; + + private ITrustAgentServiceCallback mCallback = new ITrustAgentServiceCallback.Stub() { + + public void enableTrust(String userMessage, long durationMs, boolean initiatedByUser) { + if (DEBUG) Slog.v(TAG, "enableTrust(" + userMessage + ", durationMs = " + durationMs + + ", initiatedByUser = " + initiatedByUser + ")"); + + mHandler.obtainMessage(MSG_ENABLE_TRUST, initiatedByUser ? 1 : 0, 0, userMessage) + .sendToTarget(); + if (durationMs > 0) { + mHandler.removeMessages(MSG_TRUST_TIMEOUT); + mHandler.sendEmptyMessageDelayed(MSG_TRUST_TIMEOUT, durationMs); + } + } + + public void revokeTrust() { + if (DEBUG) Slog.v(TAG, "revokeTrust()"); + mHandler.sendEmptyMessage(MSG_REVOKE_TRUST); + } + }; + + private final ServiceConnection mConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + if (DEBUG) Log.v(TAG, "TrustAgent started : " + name.flattenToString()); + mTrustAgentService = ITrustAgentService.Stub.asInterface(service); + setCallback(mCallback); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + if (DEBUG) Log.v(TAG, "TrustAgent disconnected : " + name.flattenToShortString()); + mTrustAgentService = null; + mHandler.sendEmptyMessage(MSG_REVOKE_TRUST); + } + }; + + + public TrustAgentWrapper(Context context, TrustManagerService trustManagerService, + Intent intent, UserHandle user) { + mContext = context; + mTrustManagerService = trustManagerService; + mUserId = user.getIdentifier(); + mName = intent.getComponent(); + if (!context.bindServiceAsUser(intent, mConnection, Context.BIND_AUTO_CREATE, user)) { + if (DEBUG) Log.v(TAG, "can't bind to TrustAgent " + mName.flattenToShortString()); + // TODO: retry somehow? + } + } + + private void onError(Exception e) { + Slog.w(TAG , "Remote Exception", e); + } + + /** + * @see android.service.trust.TrustAgentService#onUnlockAttempt(boolean) + */ + public void onUnlockAttempt(boolean successful) { + try { + if (mTrustAgentService != null) mTrustAgentService.onUnlockAttempt(successful); + } catch (RemoteException e) { + onError(e); + } + } + + private void setCallback(ITrustAgentServiceCallback callback) { + try { + if (mTrustAgentService != null) { + mTrustAgentService.setCallback(callback); + } + } catch (RemoteException e) { + onError(e); + } + } + + public boolean isTrusted() { + return mTrusted; + } + + public String getMessage() { + return mMessage; + } + + public void unbind() { + if (DEBUG) Log.v(TAG, "TrustAgent unbound : " + mName.flattenToShortString()); + mContext.unbindService(mConnection); + } +} diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java new file mode 100644 index 000000000000..a2a49c9de2a2 --- /dev/null +++ b/services/core/java/com/android/server/trust/TrustManagerService.java @@ -0,0 +1,387 @@ +/* + * Copyright (C) 2014 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.server.trust; + +import com.android.internal.content.PackageMonitor; +import com.android.internal.widget.LockPatternUtils; +import com.android.server.SystemService; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import android.Manifest; +import android.app.trust.ITrustListener; +import android.app.trust.ITrustManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.pm.UserInfo; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.os.RemoteException; +import android.os.UserHandle; +import android.os.UserManager; +import android.service.trust.TrustAgentService; +import android.util.ArraySet; +import android.util.AttributeSet; +import android.util.Slog; +import android.util.Xml; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Manages trust agents and trust listeners. + * + * It is responsible for binding to the enabled {@link android.service.trust.TrustAgentService}s + * of each user and notifies them about events that are relevant to them. + * It start and stops them based on the value of + * {@link com.android.internal.widget.LockPatternUtils#getEnabledTrustAgents(int)}. + * + * It also keeps a set of {@link android.app.trust.ITrustListener}s that are notified whenever the + * trust state changes for any user. + * + * Trust state and the setting of enabled agents is kept per user and each user has its own + * instance of a {@link android.service.trust.TrustAgentService}. + */ +public class TrustManagerService extends SystemService { + + private static final boolean DEBUG = false; + private static final String TAG = "TrustManagerService"; + + private static final Intent TRUST_AGENT_INTENT = + new Intent(TrustAgentService.SERVICE_INTERFACE); + + private static final int MSG_REGISTER_LISTENER = 1; + private static final int MSG_UNREGISTER_LISTENER = 2; + private static final int MSG_DISPATCH_UNLOCK_ATTEMPT = 3; + private static final int MSG_ENABLED_AGENTS_CHANGED = 4; + + private final ArraySet<AgentInfo> mActiveAgents = new ArraySet<AgentInfo>(); + private final ArrayList<ITrustListener> mTrustListeners = new ArrayList<ITrustListener>(); + private final Context mContext; + + private UserManager mUserManager; + + /** + * Cache for {@link #refreshAgentList()} + */ + private final ArraySet<AgentInfo> mObsoleteAgents = new ArraySet<AgentInfo>(); + + + public TrustManagerService(Context context) { + super(context); + mContext = context; + mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + } + + @Override + public void onStart() { + publishBinderService(Context.TRUST_SERVICE, mService); + } + + @Override + public void onBootPhase(int phase) { + if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY && !isSafeMode()) { + // Listen for package changes + mPackageMonitor.register(mContext, mHandler.getLooper(), UserHandle.ALL, true); + refreshAgentList(); + } + } + + // Agent management + + private static final class AgentInfo { + CharSequence label; + Drawable icon; + ComponentName component; // service that implements ITrustAgent + ComponentName settings; // setting to launch to modify agent. + TrustAgentWrapper agent; + int userId; + + @Override + public boolean equals(Object other) { + if (!(other instanceof AgentInfo)) { + return false; + } + AgentInfo o = (AgentInfo) other; + return component.equals(o.component) && userId == o.userId; + } + + @Override + public int hashCode() { + return component.hashCode() * 31 + userId; + } + } + + private void updateTrustAll() { + List<UserInfo> userInfos = mUserManager.getUsers(true /* excludeDying */); + for (UserInfo userInfo : userInfos) { + updateTrust(userInfo.id); + } + } + + public void updateTrust(int userId) { + dispatchOnTrustChanged(aggregateIsTrusted(userId), userId); + } + + protected void refreshAgentList() { + if (DEBUG) Slog.d(TAG, "refreshAgentList()"); + PackageManager pm = mContext.getPackageManager(); + + List<UserInfo> userInfos = mUserManager.getUsers(true /* excludeDying */); + LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext); + + mObsoleteAgents.clear(); + mObsoleteAgents.addAll(mActiveAgents); + + for (UserInfo userInfo : userInfos) { + List<ComponentName> enabledAgents = lockPatternUtils.getEnabledTrustAgents(userInfo.id); + if (enabledAgents == null) { + continue; + } + List<ResolveInfo> resolveInfos = pm.queryIntentServicesAsUser(TRUST_AGENT_INTENT, + PackageManager.GET_META_DATA, userInfo.id); + for (ResolveInfo resolveInfo : resolveInfos) { + if (resolveInfo.serviceInfo == null) continue; + ComponentName name = getComponentName(resolveInfo); + if (!enabledAgents.contains(name)) continue; + + AgentInfo agentInfo = new AgentInfo(); + agentInfo.component = name; + agentInfo.userId = userInfo.id; + if (!mActiveAgents.contains(agentInfo)) { + agentInfo.label = resolveInfo.loadLabel(pm); + agentInfo.icon = resolveInfo.loadIcon(pm); + agentInfo.settings = getSettingsComponentName(pm, resolveInfo); + agentInfo.agent = new TrustAgentWrapper(mContext, this, + new Intent().setComponent(name), userInfo.getUserHandle()); + mActiveAgents.add(agentInfo); + } else { + mObsoleteAgents.remove(agentInfo); + } + } + } + + boolean trustMayHaveChanged = false; + for (int i = 0; i < mObsoleteAgents.size(); i++) { + AgentInfo info = mActiveAgents.valueAt(i); + if (info.agent.isTrusted()) { + trustMayHaveChanged = true; + } + info.agent.unbind(); + mActiveAgents.remove(info); + } + + if (trustMayHaveChanged) { + updateTrustAll(); + } + } + + private ComponentName getSettingsComponentName(PackageManager pm, ResolveInfo resolveInfo) { + if (resolveInfo == null || resolveInfo.serviceInfo == null + || resolveInfo.serviceInfo.metaData == null) return null; + String cn = null; + XmlResourceParser parser = null; + Exception caughtException = null; + try { + parser = resolveInfo.serviceInfo.loadXmlMetaData(pm, + TrustAgentService.TRUST_AGENT_META_DATA); + if (parser == null) { + Slog.w(TAG, "Can't find " + TrustAgentService.TRUST_AGENT_META_DATA + " meta-data"); + return null; + } + Resources res = pm.getResourcesForApplication(resolveInfo.serviceInfo.applicationInfo); + AttributeSet attrs = Xml.asAttributeSet(parser); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && type != XmlPullParser.START_TAG) { + // Drain preamble. + } + String nodeName = parser.getName(); + if (!"trust_agent".equals(nodeName)) { + Slog.w(TAG, "Meta-data does not start with trust_agent tag"); + return null; + } + TypedArray sa = res + .obtainAttributes(attrs, com.android.internal.R.styleable.TrustAgent); + cn = sa.getString(com.android.internal.R.styleable.TrustAgent_settingsActivity); + sa.recycle(); + } catch (PackageManager.NameNotFoundException e) { + caughtException = e; + } catch (IOException e) { + caughtException = e; + } catch (XmlPullParserException e) { + caughtException = e; + } finally { + if (parser != null) parser.close(); + } + if (caughtException != null) { + Slog.w(TAG, "Error parsing : " + resolveInfo.serviceInfo.packageName, caughtException); + return null; + } + if (cn == null) { + return null; + } + if (cn.indexOf('/') < 0) { + cn = resolveInfo.serviceInfo.packageName + "/" + cn; + } + return ComponentName.unflattenFromString(cn); + } + + private ComponentName getComponentName(ResolveInfo resolveInfo) { + if (resolveInfo == null || resolveInfo.serviceInfo == null) return null; + return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name); + } + + // Agent dispatch and aggregation + + private boolean aggregateIsTrusted(int userId) { + for (int i = 0; i < mActiveAgents.size(); i++) { + AgentInfo info = mActiveAgents.valueAt(i); + if (info.userId == userId) { + if (info.agent.isTrusted()) { + return true; + } + } + } + return false; + } + + private void dispatchUnlockAttempt(boolean successful, int userId) { + for (int i = 0; i < mActiveAgents.size(); i++) { + AgentInfo info = mActiveAgents.valueAt(i); + if (info.userId == userId) { + info.agent.onUnlockAttempt(successful); + } + } + } + + // Listeners + + private void addListener(ITrustListener listener) { + for (int i = 0; i < mTrustListeners.size(); i++) { + if (mTrustListeners.get(i).asBinder() == listener.asBinder()) { + return; + } + } + mTrustListeners.add(listener); + } + + private void removeListener(ITrustListener listener) { + for (int i = 0; i < mTrustListeners.size(); i++) { + if (mTrustListeners.get(i).asBinder() == listener.asBinder()) { + mTrustListeners.get(i); + return; + } + } + } + + private void dispatchOnTrustChanged(boolean enabled, int userId) { + for (int i = 0; i < mTrustListeners.size(); i++) { + try { + mTrustListeners.get(i).onTrustChanged(enabled, userId); + } catch (RemoteException e) { + Slog.e(TAG, "Exception while notifying TrustListener. Removing listener.", e); + mTrustListeners.get(i); + i--; + } + } + } + + // Plumbing + + private final IBinder mService = new ITrustManager.Stub() { + @Override + public void reportUnlockAttempt(boolean authenticated, int userId) throws RemoteException { + enforceReportPermission(); + mHandler.obtainMessage(MSG_DISPATCH_UNLOCK_ATTEMPT, authenticated ? 1 : 0, userId) + .sendToTarget(); + } + + @Override + public void reportEnabledTrustAgentsChanged(int userId) throws RemoteException { + enforceReportPermission(); + // coalesce refresh messages. + mHandler.removeMessages(MSG_ENABLED_AGENTS_CHANGED); + mHandler.sendEmptyMessage(MSG_ENABLED_AGENTS_CHANGED); + } + + @Override + public void registerTrustListener(ITrustListener trustListener) throws RemoteException { + enforceListenerPermission(); + mHandler.obtainMessage(MSG_REGISTER_LISTENER, trustListener).sendToTarget(); + } + + @Override + public void unregisterTrustListener(ITrustListener trustListener) throws RemoteException { + enforceListenerPermission(); + mHandler.obtainMessage(MSG_UNREGISTER_LISTENER, trustListener).sendToTarget(); + } + + private void enforceReportPermission() { + mContext.enforceCallingPermission(Manifest.permission.ACCESS_KEYGUARD_SECURE_STORAGE, + "reporting trust events"); + } + + private void enforceListenerPermission() { + mContext.enforceCallingPermission(Manifest.permission.TRUST_LISTENER, + "register trust listener"); + } + }; + + private final Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_REGISTER_LISTENER: + addListener((ITrustListener) msg.obj); + break; + case MSG_UNREGISTER_LISTENER: + removeListener((ITrustListener) msg.obj); + break; + case MSG_DISPATCH_UNLOCK_ATTEMPT: + dispatchUnlockAttempt(msg.arg1 != 0, msg.arg2); + break; + case MSG_ENABLED_AGENTS_CHANGED: + refreshAgentList(); + break; + } + } + }; + + private final PackageMonitor mPackageMonitor = new PackageMonitor() { + @Override + public void onSomePackagesChanged() { + refreshAgentList(); + } + + @Override + public boolean onPackageChanged(String packageName, int uid, String[] components) { + // We're interested in all changes, even if just some components get enabled / disabled. + return true; + } + }; +} diff --git a/services/core/jni/com_android_server_hdmi_HdmiCecService.cpp b/services/core/jni/com_android_server_hdmi_HdmiCecService.cpp index 6170c0937cf3..61edda83bd9b 100644 --- a/services/core/jni/com_android_server_hdmi_HdmiCecService.cpp +++ b/services/core/jni/com_android_server_hdmi_HdmiCecService.cpp @@ -63,24 +63,21 @@ public: void initialize(); // initialize individual logical device. - int initLogicalDevice(int type); - void releaseLogicalDevice(int type); + cec_logical_address_t initLogicalDevice(cec_device_type_t type); + void releaseLogicalDevice(cec_device_type_t type); - cec_logical_address_t getLogicalAddress(int deviceType); + cec_logical_address_t getLogicalAddress(cec_device_type_t deviceType); + uint16_t getPhysicalAddress(); int getDeviceType(cec_logical_address_t addr); void queueMessage(const MessageEntry& message); void queueOutgoingMessage(const cec_message_t& message); void sendReportPhysicalAddress(); void sendActiveSource(cec_logical_address_t srcAddr); - void sendInactiveSource(cec_logical_address_t srcAddr); - void sendImageViewOn(cec_logical_address_t srcAddr); - void sendTextViewOn(cec_logical_address_t srcAddr); - void sendGiveDevicePowerStatus(cec_logical_address_t srcAddr, cec_logical_address_t dstAddr); void sendFeatureAbort(cec_logical_address_t srcAddr, cec_logical_address_t dstAddr, int opcode, int reason); void sendCecVersion(cec_logical_address_t srcAddr, cec_logical_address_t dstAddr, int version); - void sendDeviceVendorID(cec_logical_address_t srcAddr, cec_logical_address_t dstAddr); + void sendDeviceVendorId(cec_logical_address_t srcAddr, cec_logical_address_t dstAddr); void sendGiveDeviceVendorID(cec_logical_address_t srcAddr, cec_logical_address_t dstAddr); void sendSetOsdName(cec_logical_address_t srcAddr, cec_logical_address_t dstAddr, const char* name, size_t len); @@ -104,6 +101,7 @@ private: static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName); void updatePhysicalAddress(); + void updateLogicalAddress(); void dispatchMessage(const MessageEntry& message); void processIncomingMessage(const cec_message_t& msg); @@ -147,7 +145,7 @@ private: }; // device type -> logical address mapping - std::map<int, cec_logical_address_t> mLogicalDevices; + std::map<cec_device_type_t, cec_logical_address_t> mLogicalDevices; hdmi_cec_device_t* mDevice; jobject mCallbacksObj; @@ -173,6 +171,10 @@ void HdmiCecHandler::initialize() { updatePhysicalAddress(); } +uint16_t HdmiCecHandler::getPhysicalAddress() { + return mPhysicalAddress; +} + void HdmiCecHandler::updatePhysicalAddress() { uint16_t addr; if (!mDevice->get_physical_address(mDevice, &addr)) { @@ -182,7 +184,17 @@ void HdmiCecHandler::updatePhysicalAddress() { } } -int HdmiCecHandler::initLogicalDevice(int type) { +void HdmiCecHandler::updateLogicalAddress() { + std::map<cec_device_type_t, cec_logical_address_t>::iterator it = mLogicalDevices.begin(); + for (; it != mLogicalDevices.end(); ++it) { + cec_logical_address_t addr; + if (!mDevice->get_logical_address(mDevice, it->first, &addr)) { + it->second = addr; + } + } +} + +cec_logical_address_t HdmiCecHandler::initLogicalDevice(cec_device_type_t type) { cec_logical_address_t addr; int res = mDevice->allocate_logical_address(mDevice, type, &addr); @@ -190,21 +202,21 @@ int HdmiCecHandler::initLogicalDevice(int type) { ALOGE("Logical Address Allocation failed: %d", res); } else { ALOGV("Logical Address Allocation success: %d", addr); - mLogicalDevices.insert(std::pair<int, cec_logical_address_t>(type, addr)); + mLogicalDevices.insert(std::pair<cec_device_type_t, cec_logical_address_t>(type, addr)); } return addr; } -void HdmiCecHandler::releaseLogicalDevice(int type) { - std::map<int, cec_logical_address_t>::iterator it = mLogicalDevices.find(type); +void HdmiCecHandler::releaseLogicalDevice(cec_device_type_t type) { + std::map<cec_device_type_t, cec_logical_address_t>::iterator it = mLogicalDevices.find(type); if (it != mLogicalDevices.end()) { mLogicalDevices.erase(it); } // TODO: remove the address monitored in HAL as well. } -cec_logical_address_t HdmiCecHandler::getLogicalAddress(int mDevicetype) { - std::map<int, cec_logical_address_t>::iterator it = mLogicalDevices.find(mDevicetype); +cec_logical_address_t HdmiCecHandler::getLogicalAddress(cec_device_type_t type) { + std::map<cec_device_type_t, cec_logical_address_t>::iterator it = mLogicalDevices.find(type); if (it != mLogicalDevices.end()) { return it->second; } @@ -212,7 +224,7 @@ cec_logical_address_t HdmiCecHandler::getLogicalAddress(int mDevicetype) { } int HdmiCecHandler::getDeviceType(cec_logical_address_t addr) { - std::map<int, cec_logical_address_t>::iterator it = mLogicalDevices.begin(); + std::map<cec_device_type_t, cec_logical_address_t>::iterator it = mLogicalDevices.begin(); for (; it != mLogicalDevices.end(); ++it) { if (it->second == addr) { return it->first; @@ -245,14 +257,15 @@ void HdmiCecHandler::sendReportPhysicalAddress() { } // Report physical address for each logical one hosted in it. - std::map<int, cec_logical_address_t>::iterator it = mLogicalDevices.begin(); + std::map<cec_device_type_t, cec_logical_address_t>::iterator it = mLogicalDevices.begin(); while (it != mLogicalDevices.end()) { cec_message_t msg; msg.initiator = it->second; // logical address msg.destination = CEC_ADDR_BROADCAST; msg.length = 4; msg.body[0] = CEC_MESSAGE_REPORT_PHYSICAL_ADDRESS; - std::memcpy(msg.body + 1, &mPhysicalAddress, 2); + msg.body[1] = (mPhysicalAddress >> 8) & 0xff; + msg.body[2] = mPhysicalAddress & 0xff; msg.body[3] = it->first; // device type queueOutgoingMessage(msg); ++it; @@ -269,47 +282,8 @@ void HdmiCecHandler::sendActiveSource(cec_logical_address_t srcAddr) { msg.destination = CEC_ADDR_BROADCAST; msg.length = 3; msg.body[0] = CEC_MESSAGE_ACTIVE_SOURCE; - std::memcpy(msg.body + 1, &mPhysicalAddress, 2); - queueOutgoingMessage(msg); -} - -void HdmiCecHandler::sendInactiveSource(cec_logical_address_t srcAddr) { - cec_message_t msg; - msg.initiator = srcAddr; - msg.destination = CEC_ADDR_TV; - msg.length = 3; - msg.body[0] = CEC_MESSAGE_INACTIVE_SOURCE; - if (mPhysicalAddress != INVALID_PHYSICAL_ADDRESS) { - std::memcpy(msg.body + 1, &mPhysicalAddress, 2); - queueOutgoingMessage(msg); - } -} - -void HdmiCecHandler::sendImageViewOn(cec_logical_address_t srcAddr) { - cec_message_t msg; - msg.initiator = srcAddr; - msg.destination = CEC_ADDR_TV; - msg.length = 1; - msg.body[0] = CEC_MESSAGE_IMAGE_VIEW_ON; - queueOutgoingMessage(msg); -} - -void HdmiCecHandler::sendTextViewOn(cec_logical_address_t srcAddr) { - cec_message_t msg; - msg.initiator = srcAddr; - msg.destination = CEC_ADDR_TV; - msg.length = 1; - msg.body[0] = CEC_MESSAGE_TEXT_VIEW_ON; - queueOutgoingMessage(msg); -} - -void HdmiCecHandler::sendGiveDevicePowerStatus(cec_logical_address_t srcAddr, - cec_logical_address_t dstAddr) { - cec_message_t msg; - msg.initiator = srcAddr; - msg.destination = dstAddr; - msg.length = 1; - msg.body[0] = CEC_MESSAGE_GIVE_DEVICE_POWER_STATUS; + msg.body[1] = (mPhysicalAddress >> 8) & 0xff; + msg.body[2] = mPhysicalAddress & 0xff; queueOutgoingMessage(msg); } @@ -346,7 +320,7 @@ void HdmiCecHandler::sendGiveDeviceVendorID(cec_logical_address_t srcAddr, queueOutgoingMessage(msg); } -void HdmiCecHandler::sendDeviceVendorID(cec_logical_address_t srcAddr, +void HdmiCecHandler::sendDeviceVendorId(cec_logical_address_t srcAddr, cec_logical_address_t dstAddr) { cec_message_t msg; msg.initiator = srcAddr; @@ -355,7 +329,9 @@ void HdmiCecHandler::sendDeviceVendorID(cec_logical_address_t srcAddr, msg.body[0] = CEC_MESSAGE_DEVICE_VENDOR_ID; uint32_t vendor_id; mDevice->get_vendor_id(mDevice, &vendor_id); - std::memcpy(msg.body + 1, &vendor_id, 3); + msg.body[1] = (vendor_id >> 16) & 0xff; + msg.body[2] = (vendor_id >> 8) & 0xff; + msg.body[3] = vendor_id & 0xff; queueOutgoingMessage(msg); } @@ -437,9 +413,8 @@ void HdmiCecHandler::dispatchMessage(const MessageEntry& entry) { mMessageQueue.pop_front(); bool connected = entry.second.hotplug.connected; if (connected) { - // TODO: Update logical addresses as well, since they also could have - // changed while the cable was disconnected. updatePhysicalAddress(); + updateLogicalAddress(); } propagateHotplug(connected); } @@ -460,6 +435,9 @@ void HdmiCecHandler::processIncomingMessage(const cec_message_t& msg) { handleGetCECVersion(msg); } else if (opcode == CEC_MESSAGE_GET_MENU_LANGUAGE) { handleGetMenuLanguage(msg); + } else if (opcode == CEC_MESSAGE_ABORT) { + // Compliance testing requires that abort message be responded with feature abort. + sendFeatureAbort(msg.destination, msg.initiator, msg.body[0], ABORT_REFUSED); } else { if (precheckMessage(msg)) { propagateMessage(msg); @@ -480,8 +458,7 @@ bool HdmiCecHandler::precheckMessage(const cec_message_t& msg) { (opcode == CEC_MESSAGE_ACTIVE_SOURCE || opcode == CEC_MESSAGE_SET_STREAM_PATH || opcode == CEC_MESSAGE_INACTIVE_SOURCE)) { - uint16_t senderAddr; - std::memcpy(&senderAddr, &msg.body[1], 2); + uint16_t senderAddr = (msg.body[1] << 8) + msg.body[2]; if (senderAddr == mPhysicalAddress) { return false; } @@ -521,7 +498,7 @@ void HdmiCecHandler::handleRequestActiveSource() { jint activeDeviceType = env->CallIntMethod(mCallbacksObj, gHdmiCecServiceClassInfo.getActiveSource); if (activeDeviceType != INACTIVE_DEVICE_TYPE) { - sendActiveSource(getLogicalAddress(activeDeviceType)); + sendActiveSource(getLogicalAddress(static_cast<cec_device_type_t>(activeDeviceType))); } checkAndClearExceptionFromCallback(env, __FUNCTION__); } @@ -542,7 +519,7 @@ void HdmiCecHandler::handleGetOsdName(const cec_message_t& msg) { } void HdmiCecHandler::handleGiveDeviceVendorID(const cec_message_t& msg) { - sendDeviceVendorID(msg.destination, msg.initiator); + sendDeviceVendorId(msg.destination, msg.initiator); } void HdmiCecHandler::handleGetCECVersion(const cec_message_t& msg) { @@ -596,64 +573,34 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject callbacksObj) { static void nativeSendMessage(JNIEnv* env, jclass clazz, jlong handlerPtr, jint deviceType, jint dstAddr, jint opcode, jbyteArray params) { HdmiCecHandler *handler = reinterpret_cast<HdmiCecHandler *>(handlerPtr); - cec_logical_address_t srcAddr = handler->getLogicalAddress(deviceType); + cec_logical_address_t srcAddr = handler->getLogicalAddress( + static_cast<cec_device_type_t>(deviceType)); jsize len = env->GetArrayLength(params); ScopedByteArrayRO paramsPtr(env, params); cec_message_t message; message.initiator = srcAddr; message.destination = static_cast<cec_logical_address_t>(dstAddr); - message.length = len + 1; + message.length = min(len + 1, CEC_MESSAGE_BODY_MAX_LENGTH); message.body[0] = opcode; - std::memcpy(message.body + 1, paramsPtr.get(), len); + std::memcpy(message.body + 1, paramsPtr.get(), message.length - 1); handler->sendCecMessage(message); } -static int nativeAllocateLogicalAddress(JNIEnv* env, jclass clazz, jlong handlerPtr, +static jint nativeAllocateLogicalAddress(JNIEnv* env, jclass clazz, jlong handlerPtr, jint deviceType) { HdmiCecHandler *handler = reinterpret_cast<HdmiCecHandler *>(handlerPtr); - return handler->initLogicalDevice(deviceType); + return handler->initLogicalDevice(static_cast<cec_device_type_t>(deviceType)); } static void nativeRemoveLogicalAddress(JNIEnv* env, jclass clazz, jlong handlerPtr, jint deviceType) { HdmiCecHandler *handler = reinterpret_cast<HdmiCecHandler *>(handlerPtr); - return handler->releaseLogicalDevice(deviceType); -} - -static void nativeSendActiveSource(JNIEnv* env, jclass clazz, jlong handlerPtr, - jint deviceType) { - HdmiCecHandler *handler = reinterpret_cast<HdmiCecHandler *>(handlerPtr); - cec_logical_address_t srcAddr = handler->getLogicalAddress(deviceType); - handler->sendActiveSource(srcAddr); -} - -static void nativeSendInactiveSource(JNIEnv* env, jclass clazz, jlong handlerPtr, - jint deviceType) { - HdmiCecHandler *handler = reinterpret_cast<HdmiCecHandler *>(handlerPtr); - cec_logical_address_t srcAddr = handler->getLogicalAddress(deviceType); - handler->sendInactiveSource(srcAddr); -} - -static void nativeSendImageViewOn(JNIEnv* env, jclass clazz, jlong handlerPtr, - jint deviceType) { - HdmiCecHandler *handler = reinterpret_cast<HdmiCecHandler *>(handlerPtr); - cec_logical_address_t srcAddr = handler->getLogicalAddress(deviceType); - handler->sendImageViewOn(srcAddr); -} - -static void nativeSendTextViewOn(JNIEnv* env, jclass clazz, jlong handlerPtr, - jint deviceType) { - HdmiCecHandler *handler = reinterpret_cast<HdmiCecHandler *>(handlerPtr); - cec_logical_address_t srcAddr = handler->getLogicalAddress(deviceType); - handler->sendTextViewOn(srcAddr); + return handler->releaseLogicalDevice(static_cast<cec_device_type_t>(deviceType)); } -static void nativeSendGiveDevicePowerStatus(JNIEnv* env, jclass clazz, jlong handlerPtr, - jint deviceType, jint destination) { +static jint nativeGetPhysicalAddress(JNIEnv* env, jclass clazz, jlong handlerPtr) { HdmiCecHandler *handler = reinterpret_cast<HdmiCecHandler *>(handlerPtr); - cec_logical_address_t srcAddr = handler->getLogicalAddress(deviceType); - cec_logical_address_t dstAddr = static_cast<cec_logical_address_t>(destination); - handler->sendGiveDevicePowerStatus(srcAddr, dstAddr); + return handler->getPhysicalAddress(); } static JNINativeMethod sMethods[] = { @@ -666,16 +613,8 @@ static JNINativeMethod sMethods[] = { (void *)nativeAllocateLogicalAddress }, { "nativeRemoveLogicalAddress", "(JI)V", (void *)nativeRemoveLogicalAddress }, - { "nativeSendActiveSource", "(JI)V", - (void *)nativeSendActiveSource }, - { "nativeSendInactiveSource", "(JI)V", - (void *)nativeSendInactiveSource }, - { "nativeSendImageViewOn", "(JI)V", - (void *)nativeSendImageViewOn }, - { "nativeSendTextViewOn", "(JI)V", - (void *)nativeSendTextViewOn }, - { "nativeSendGiveDevicePowerStatus", "(JII)V", - (void *)nativeSendGiveDevicePowerStatus } + { "nativeGetPhysicalAddress", "(J)I", + (void *)nativeGetPhysicalAddress }, }; #define CLASS_PATH "com/android/server/hdmi/HdmiCecService" diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index c925669c4572..ab4c89e1d060 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -76,6 +76,7 @@ import com.android.server.power.ShutdownThread; import com.android.server.search.SearchManagerService; import com.android.server.statusbar.StatusBarManagerService; import com.android.server.storage.DeviceStorageMonitorService; +import com.android.server.trust.TrustManagerService; import com.android.server.twilight.TwilightService; import com.android.server.usb.UsbService; import com.android.server.wallpaper.WallpaperManagerService; @@ -116,6 +117,8 @@ public final class SystemServer { "com.android.server.usb.UsbService$Lifecycle"; private static final String WIFI_SERVICE_CLASS = "com.android.server.wifi.WifiService"; + private static final String WIFI_HOTSPOT_SERVICE_CLASS = + "com.android.server.wifi.hotspot.WifiHotspotService"; private static final String WIFI_P2P_SERVICE_CLASS = "com.android.server.wifi.p2p.WifiP2pService"; private static final String HDMI_CEC_SERVICE_CLASS = @@ -614,6 +617,12 @@ public final class SystemServer { } try { + mSystemServiceManager.startService(WIFI_HOTSPOT_SERVICE_CLASS); + } catch (Throwable e) { + reportWtf("starting Wi-Fi HotspotService", e); + } + + try { mSystemServiceManager.startService(WIFI_SERVICE_CLASS); } catch (Throwable e) { reportWtf("starting Wi-Fi Service", e); @@ -905,6 +914,13 @@ public final class SystemServer { } catch (Throwable e) { reportWtf("starting MediaRouterService", e); } + + try { + Slog.i(TAG, "Trust Manager"); + mSystemServiceManager.startService(TrustManagerService.class); + } catch (Throwable e) { + Slog.e(TAG, "Failure starting TrustManagerService", e); + } } } @@ -913,8 +929,6 @@ public final class SystemServer { final boolean safeMode = wm.detectSafeMode(); if (safeMode) { mActivityManagerService.enterSafeMode(); - // Post the safe mode state in the Zygote class - Zygote.systemInSafeMode = true; // Disable the JIT for the system_server process VMRuntime.getRuntime().disableJitCompilation(); } else { diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java index ce953a4b134e..f73d4259489e 100644 --- a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java +++ b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java @@ -17,8 +17,10 @@ package com.android.server.usb; import android.content.ActivityNotFoundException; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.os.Handler; @@ -244,15 +246,18 @@ public class UsbDebuggingManager implements Runnable { } private void showConfirmationDialog(String key, String fingerprints) { - Intent dialogIntent = new Intent(); - - dialogIntent.setClassName("com.android.systemui", - "com.android.systemui.usb.UsbDebuggingActivity"); - dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - dialogIntent.putExtra("key", key); - dialogIntent.putExtra("fingerprints", fingerprints); + Intent intent = new Intent(); + + ComponentName componentName = ComponentName.unflattenFromString( + Resources.getSystem().getString( + com.android.internal.R.string.config_customAdbPublicKeyActivity)); + intent.setClassName(componentName.getPackageName(), + componentName.getClassName()); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("key", key); + intent.putExtra("fingerprints", fingerprints); try { - mContext.startActivity(dialogIntent); + mContext.startActivity(intent); } catch (ActivityNotFoundException e) { Slog.e(TAG, "unable to start UsbDebuggingActivity"); } diff --git a/wifi/java/android/net/wifi/hotspot/IWifiHotspotManager.aidl b/wifi/java/android/net/wifi/hotspot/IWifiHotspotManager.aidl new file mode 100644 index 000000000000..2b1601bce993 --- /dev/null +++ b/wifi/java/android/net/wifi/hotspot/IWifiHotspotManager.aidl @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2014, 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 android.net.wifi.hotspot; + +/** + * Interface that allows controlling and querying Hotspot connectivity. + * + * {@hide} + */ +interface IWifiHotspotManager +{ + void test(); +} + diff --git a/wifi/java/android/net/wifi/hotspot/WifiHotspotManager.java b/wifi/java/android/net/wifi/hotspot/WifiHotspotManager.java new file mode 100644 index 000000000000..ac15017c0705 --- /dev/null +++ b/wifi/java/android/net/wifi/hotspot/WifiHotspotManager.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2014 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 android.net.wifi.hotspot; + +import android.content.Context; +import android.os.RemoteException; +import android.util.Log; + +/** + * TODO: doc + */ +public class WifiHotspotManager { + + private static final String TAG = "WifiHotspotManager"; + + private Context mContext; + IWifiHotspotManager mService; + + public WifiHotspotManager(Context context, IWifiHotspotManager service) { + mContext = context; + mService = service; + } + + public void test() { + try{ + Log.d(TAG, "test()"); + mService.test(); + } + catch (RemoteException e) { + Log.e(TAG, "test() exception"); + e.printStackTrace(); + } + } +} |