diff options
70 files changed, 968 insertions, 532 deletions
diff --git a/api/current.txt b/api/current.txt index 5e14236875fb..e3c3ae250bbf 100644 --- a/api/current.txt +++ b/api/current.txt @@ -3915,6 +3915,7 @@ package android.app {      field public static final int MODE_IGNORED = 1; // 0x1      field public static final java.lang.String OPSTR_COARSE_LOCATION = "android:coarse_location";      field public static final java.lang.String OPSTR_FINE_LOCATION = "android:fine_location"; +    field public static final java.lang.String OPSTR_GET_USAGE_STATS = "android:get_usage_stats";      field public static final java.lang.String OPSTR_MONITOR_HIGH_POWER_LOCATION = "android:monitor_location_high_power";      field public static final java.lang.String OPSTR_MONITOR_LOCATION = "android:monitor_location";    } @@ -28700,44 +28701,6 @@ package android.telephony {      field public static int STATUS_UNKNOWN_ERROR;    } -  public class MessagingConfigurationManager { -    method public boolean getCarrierConfigBoolean(java.lang.String, boolean); -    method public boolean getCarrierConfigBoolean(long, java.lang.String, boolean); -    method public int getCarrierConfigInt(java.lang.String, int); -    method public int getCarrierConfigInt(long, java.lang.String, int); -    method public java.lang.String getCarrierConfigString(java.lang.String, java.lang.String); -    method public java.lang.String getCarrierConfigString(long, java.lang.String, java.lang.String); -    method public static android.telephony.MessagingConfigurationManager getDefault(); -    field public static final java.lang.String CONF_ALIAS_ENABLED = "aliasEnabled"; -    field public static final java.lang.String CONF_ALIAS_MAX_CHARS = "aliasMaxChars"; -    field public static final java.lang.String CONF_ALIAS_MIN_CHARS = "aliasMinChars"; -    field public static final java.lang.String CONF_ALLOW_ATTACH_AUDIO = "allowAttachAudio"; -    field public static final java.lang.String CONF_APPEND_TRANSACTION_ID = "enabledTransID"; -    field public static final java.lang.String CONF_EMAIL_GATEWAY_NUMBER = "emailGatewayNumber"; -    field public static final java.lang.String CONF_HTTP_PARAMS = "httpParams"; -    field public static final java.lang.String CONF_HTTP_SOCKET_TIMEOUT = "httpSocketTimeout"; -    field public static final java.lang.String CONF_MAX_IMAGE_HEIGHT = "maxImageHeight"; -    field public static final java.lang.String CONF_MAX_IMAGE_WIDTH = "maxImageWidth"; -    field public static final java.lang.String CONF_MAX_MESSAGE_SIZE = "maxMessageSize"; -    field public static final java.lang.String CONF_MESSAGE_TEXT_MAX_SIZE = "maxMessageTextSize"; -    field public static final java.lang.String CONF_MMS_DELIVERY_REPORT_ENABLED = "enableMMSDeliveryReports"; -    field public static final java.lang.String CONF_MMS_ENABLED = "enabledMMS"; -    field public static final java.lang.String CONF_MMS_READ_REPORT_ENABLED = "enableMMSReadReports"; -    field public static final java.lang.String CONF_MULTIPART_SMS_ENABLED = "enableMultipartSMS"; -    field public static final java.lang.String CONF_NAI_SUFFIX = "naiSuffix"; -    field public static final java.lang.String CONF_NOTIFY_WAP_MMSC_ENABLED = "enabledNotifyWapMMSC"; -    field public static final java.lang.String CONF_RECIPIENT_LIMIT = "recipientLimit"; -    field public static final java.lang.String CONF_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES = "sendMultipartSmsAsSeparateMessages"; -    field public static final java.lang.String CONF_SMS_DELIVERY_REPORT_ENABLED = "enableSMSDeliveryReports"; -    field public static final java.lang.String CONF_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD = "smsToMmsTextLengthThreshold"; -    field public static final java.lang.String CONF_SMS_TO_MMS_TEXT_THRESHOLD = "smsToMmsTextThreshold"; -    field public static final java.lang.String CONF_SUBJECT_MAX_LENGTH = "maxSubjectLength"; -    field public static final java.lang.String CONF_SUPPORT_MMS_CONTENT_DISPOSITION = "supportMmsContentDisposition"; -    field public static final java.lang.String CONF_UA_PROF_TAG_NAME = "uaProfTagName"; -    field public static final java.lang.String CONF_UA_PROF_URL = "uaProfUrl"; -    field public static final java.lang.String CONF_USER_AGENT = "userAgent"; -  } -    public class NeighboringCellInfo implements android.os.Parcelable {      ctor public deprecated NeighboringCellInfo();      ctor public deprecated NeighboringCellInfo(int, int); @@ -28887,28 +28850,54 @@ package android.telephony {      method public boolean deleteStoredMessage(android.net.Uri);      method public java.util.ArrayList<java.lang.String> divideMessage(java.lang.String);      method public void downloadMultimediaMessage(java.lang.String, android.content.ContentValues, android.app.PendingIntent); -    method public void downloadMultimediaMessage(long, java.lang.String, android.content.ContentValues, android.app.PendingIntent);      method public boolean getAutoPersisting(); +    method public android.os.Bundle getCarrierConfigValues();      method public static android.telephony.SmsManager getDefault(); +    method public static android.telephony.SmsManager getSmsManagerForSubId(long); +    method public long getSubId();      method public android.net.Uri importMultimediaMessage(byte[], java.lang.String, long, boolean, boolean);      method public android.net.Uri importTextMessage(java.lang.String, int, java.lang.String, long, boolean, boolean);      method public void injectSmsPdu(byte[], java.lang.String, android.app.PendingIntent);      method public void sendDataMessage(java.lang.String, java.lang.String, short, byte[], android.app.PendingIntent, android.app.PendingIntent);      method public void sendMultimediaMessage(byte[], java.lang.String, android.content.ContentValues, android.app.PendingIntent); -    method public void sendMultimediaMessage(long, byte[], java.lang.String, android.content.ContentValues, android.app.PendingIntent);      method public void sendMultipartTextMessage(java.lang.String, java.lang.String, java.util.ArrayList<java.lang.String>, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);      method public void sendStoredMultimediaMessage(android.net.Uri, android.content.ContentValues, android.app.PendingIntent); -    method public void sendStoredMultimediaMessage(long, android.net.Uri, android.content.ContentValues, android.app.PendingIntent);      method public void sendStoredMultipartTextMessage(android.net.Uri, java.lang.String, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>); -    method public void sendStoredMultipartTextMessage(long, android.net.Uri, java.lang.String, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);      method public void sendStoredTextMessage(android.net.Uri, java.lang.String, android.app.PendingIntent, android.app.PendingIntent); -    method public void sendStoredTextMessage(long, android.net.Uri, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);      method public void sendTextMessage(java.lang.String, java.lang.String, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);      method public void setAutoPersisting(boolean);      method public void updateMmsDownloadStatus(int, byte[]);      method public void updateMmsSendStatus(int, boolean);      method public void updateSmsSendStatus(int, boolean);      method public boolean updateStoredMessageStatus(android.net.Uri, android.content.ContentValues); +    field public static final java.lang.String MMS_CONFIG_ALIAS_ENABLED = "aliasEnabled"; +    field public static final java.lang.String MMS_CONFIG_ALIAS_MAX_CHARS = "aliasMaxChars"; +    field public static final java.lang.String MMS_CONFIG_ALIAS_MIN_CHARS = "aliasMinChars"; +    field public static final java.lang.String MMS_CONFIG_ALLOW_ATTACH_AUDIO = "allowAttachAudio"; +    field public static final java.lang.String MMS_CONFIG_APPEND_TRANSACTION_ID = "enabledTransID"; +    field public static final java.lang.String MMS_CONFIG_EMAIL_GATEWAY_NUMBER = "emailGatewayNumber"; +    field public static final java.lang.String MMS_CONFIG_HTTP_PARAMS = "httpParams"; +    field public static final java.lang.String MMS_CONFIG_HTTP_SOCKET_TIMEOUT = "httpSocketTimeout"; +    field public static final java.lang.String MMS_CONFIG_MAX_IMAGE_HEIGHT = "maxImageHeight"; +    field public static final java.lang.String MMS_CONFIG_MAX_IMAGE_WIDTH = "maxImageWidth"; +    field public static final java.lang.String MMS_CONFIG_MAX_MESSAGE_SIZE = "maxMessageSize"; +    field public static final java.lang.String MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE = "maxMessageTextSize"; +    field public static final java.lang.String MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED = "enableMMSDeliveryReports"; +    field public static final java.lang.String MMS_CONFIG_MMS_ENABLED = "enabledMMS"; +    field public static final java.lang.String MMS_CONFIG_MMS_READ_REPORT_ENABLED = "enableMMSReadReports"; +    field public static final java.lang.String MMS_CONFIG_MULTIPART_SMS_ENABLED = "enableMultipartSMS"; +    field public static final java.lang.String MMS_CONFIG_NAI_SUFFIX = "naiSuffix"; +    field public static final java.lang.String MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED = "enabledNotifyWapMMSC"; +    field public static final java.lang.String MMS_CONFIG_RECIPIENT_LIMIT = "recipientLimit"; +    field public static final java.lang.String MMS_CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES = "sendMultipartSmsAsSeparateMessages"; +    field public static final java.lang.String MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED = "enableSMSDeliveryReports"; +    field public static final java.lang.String MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD = "smsToMmsTextLengthThreshold"; +    field public static final java.lang.String MMS_CONFIG_SMS_TO_MMS_TEXT_THRESHOLD = "smsToMmsTextThreshold"; +    field public static final java.lang.String MMS_CONFIG_SUBJECT_MAX_LENGTH = "maxSubjectLength"; +    field public static final java.lang.String MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION = "supportMmsContentDisposition"; +    field public static final java.lang.String MMS_CONFIG_UA_PROF_TAG_NAME = "uaProfTagName"; +    field public static final java.lang.String MMS_CONFIG_UA_PROF_URL = "uaProfUrl"; +    field public static final java.lang.String MMS_CONFIG_USER_AGENT = "userAgent";      field public static final java.lang.String MESSAGE_STATUS_READ = "read";      field public static final java.lang.String MESSAGE_STATUS_SEEN = "seen";      field public static final int MMS_ERROR_HTTP_FAILURE = 4; // 0x4 diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 66928ca2f859..ba9c9d644ef8 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -220,6 +220,9 @@ public class AppOpsManager {      /** Continually monitoring location data with a relatively high power request. */      public static final String OPSTR_MONITOR_HIGH_POWER_LOCATION              = "android:monitor_location_high_power"; +    /** Access to {@link android.app.usage.UsageStatsManager}. */ +    public static final String OPSTR_GET_USAGE_STATS +            = "android:get_usage_stats";      /** Activate a VPN connection without user intervention. @hide */      @SystemApi      public static final String OPSTR_ACTIVATE_VPN = "android:activate_vpn"; @@ -331,7 +334,7 @@ public class AppOpsManager {              null,              OPSTR_MONITOR_LOCATION,              OPSTR_MONITOR_HIGH_POWER_LOCATION, -            null, +            OPSTR_GET_USAGE_STATS,              null,              null,              null, diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 4bfef410dbef..3c219fd5ed37 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -685,6 +685,23 @@ public class ConnectivityManager {      }      /** +     * Returns the {@link Network} object currently serving a given type, or +     * null if the given type is not connected. +     * +     * <p>This method requires the caller to hold the permission +     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. +     * +     * @hide +     */ +    public Network getNetworkForType(int networkType) { +        try { +            return mService.getNetworkForType(networkType); +        } catch (RemoteException e) { +            return null; +        } +    } + +    /**       * Returns an array of all {@link Network} currently tracked by the       * framework.       * diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index b2fc3be27d99..974c4cd0bcf1 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -48,6 +48,7 @@ interface IConnectivityManager      NetworkInfo getNetworkInfo(int networkType);      NetworkInfo getNetworkInfoForNetwork(in Network network);      NetworkInfo[] getAllNetworkInfo(); +    Network getNetworkForType(int networkType);      Network[] getAllNetworks();      NetworkInfo getProvisioningOrActiveNetworkInfo(); diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java index d2a4728fb070..e686be797997 100644 --- a/core/java/android/net/Network.java +++ b/core/java/android/net/Network.java @@ -35,6 +35,7 @@ import java.net.URLStreamHandler;  import java.util.concurrent.atomic.AtomicReference;  import javax.net.SocketFactory; +import com.android.okhttp.ConnectionPool;  import com.android.okhttp.HostResolver;  import com.android.okhttp.OkHttpClient; @@ -60,6 +61,17 @@ public class Network implements Parcelable {      private volatile OkHttpClient mOkHttpClient = null;      private Object mLock = new Object(); +    // Default connection pool values. These are evaluated at startup, just +    // like the OkHttp code. Also like the OkHttp code, we will throw parse +    // exceptions at class loading time if the properties are set but are not +    // valid integers. +    private static final boolean httpKeepAlive = +            Boolean.parseBoolean(System.getProperty("http.keepAlive", "true")); +    private static final int httpMaxConnections = +            httpKeepAlive ? Integer.parseInt(System.getProperty("http.maxConnections", "5")) : 0; +    private static final long httpKeepAliveDurationMs = +            Long.parseLong(System.getProperty("http.keepAliveDuration", "300000"));  // 5 minutes. +      /**       * @hide       */ @@ -183,6 +195,20 @@ public class Network implements Parcelable {          return mNetworkBoundSocketFactory;      } +    // TODO: This creates an OkHttpClient with its own connection pool for +    // every Network object, instead of one for every NetId. This is +    // suboptimal, because an app could potentially have more than one +    // Network object for the same NetId, causing increased memory footprint +    // and performance penalties due to lack of connection reuse (connection +    // setup time, congestion window growth time, etc.). +    // +    // Instead, investigate only having one OkHttpClient for every NetId, +    // perhaps by using a static HashMap of NetIds to OkHttpClient objects. The +    // tricky part is deciding when to remove an OkHttpClient; a WeakHashMap +    // shouldn't be used because whether a Network is referenced doesn't +    // correlate with whether a new Network will be instantiated in the near +    // future with the same NetID. A good solution would involve purging empty +    // (or when all connections are timed out) ConnectionPools.      private void maybeInitHttpClient() {          if (mOkHttpClient == null) {              synchronized (mLock) { @@ -193,9 +219,12 @@ public class Network implements Parcelable {                              return Network.this.getAllByName(host);                          }                      }; +                    ConnectionPool pool = new ConnectionPool(httpMaxConnections, +                                                             httpKeepAliveDurationMs);                      mOkHttpClient = new OkHttpClient()                              .setSocketFactory(getSocketFactory()) -                            .setHostResolver(hostResolver); +                            .setHostResolver(hostResolver) +                            .setConnectionPool(pool);                  }              }          } diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 6d4a302420ad..b3e28ea1550e 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -19,6 +19,7 @@ package android.os;  import android.net.InterfaceConfiguration;  import android.net.INetworkManagementEventObserver; +import android.net.Network;  import android.net.NetworkStats;  import android.net.RouteInfo;  import android.net.UidRange; @@ -164,10 +165,10 @@ interface INetworkManagementService      /**       * Sets the list of DNS forwarders (in order of priority)       */ -    void setDnsForwarders(in String[] dns); +    void setDnsForwarders(in Network network, in String[] dns);      /** -     * Returns the list of DNS fowarders (in order of priority) +     * Returns the list of DNS forwarders (in order of priority)       */      String[] getDnsForwarders(); diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java index d1fadd67716b..cf407f401844 100644 --- a/core/java/android/os/storage/IMountService.java +++ b/core/java/android/os/storage/IMountService.java @@ -1518,10 +1518,14 @@ public interface IMountService extends IInterface {      static final int ENCRYPTION_STATE_NONE = 1;      /** The volume has been encrypted succesfully. */      static final int ENCRYPTION_STATE_OK = 0; -    /** The volume is in a bad state. */ +    /** The volume is in a bad state.*/      static final int ENCRYPTION_STATE_ERROR_UNKNOWN = -1; -    /** The volume is in a bad state - partially encrypted. Data is likely irrecoverable. */ +    /** Encryption is incomplete */      static final int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2; +    /** Encryption is incomplete and irrecoverable */ +    static final int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3; +    /** Underlying data is corrupt */ +    static final int ENCRYPTION_STATE_ERROR_CORRUPT = -4;      /**       * Determines the encryption state of the volume. diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java index 063a08d1397f..7dcad6861669 100644 --- a/core/java/android/view/PointerIcon.java +++ b/core/java/android/view/PointerIcon.java @@ -149,9 +149,9 @@ public final class PointerIcon implements Parcelable {       * Creates a custom pointer from the given bitmap and hotspot information.       *       * @param bitmap The bitmap for the icon. -     * @param hotspotX The X offset of the pointer icon hotspot in the bitmap. +     * @param hotSpotX The X offset of the pointer icon hotspot in the bitmap.       *        Must be within the [0, bitmap.getWidth()) range. -     * @param hotspotY The Y offset of the pointer icon hotspot in the bitmap. +     * @param hotSpotY The Y offset of the pointer icon hotspot in the bitmap.       *        Must be within the [0, bitmap.getHeight()) range.       * @return A pointer icon for this bitmap.       * @@ -374,18 +374,18 @@ public final class PointerIcon implements Parcelable {      }      private void loadResource(Context context, Resources resources, int resourceId) { -        XmlResourceParser parser = resources.getXml(resourceId); +        final XmlResourceParser parser = resources.getXml(resourceId);          final int bitmapRes;          final float hotSpotX;          final float hotSpotY;          try {              XmlUtils.beginDocument(parser, "pointer-icon"); -            TypedArray a = resources.obtainAttributes( +            final TypedArray a = resources.obtainAttributes(                      parser, com.android.internal.R.styleable.PointerIcon);              bitmapRes = a.getResourceId(com.android.internal.R.styleable.PointerIcon_bitmap, 0); -            hotSpotX = a.getFloat(com.android.internal.R.styleable.PointerIcon_hotSpotX, 0); -            hotSpotY = a.getFloat(com.android.internal.R.styleable.PointerIcon_hotSpotY, 0); +            hotSpotX = a.getDimension(com.android.internal.R.styleable.PointerIcon_hotSpotX, 0); +            hotSpotY = a.getDimension(com.android.internal.R.styleable.PointerIcon_hotSpotY, 0);              a.recycle();          } catch (Exception ex) {              throw new IllegalArgumentException("Exception parsing pointer icon resource.", ex); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 9b3a1e001c29..3e1b674892a1 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -1861,6 +1861,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener              return getCompoundPaddingTop();          } +        if (mLayout == null) { +            assumeLayout(); +        } +          if (mLayout.getLineCount() <= mMaximum) {              return getCompoundPaddingTop();          } @@ -1894,6 +1898,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener              return getCompoundPaddingBottom();          } +        if (mLayout == null) { +            assumeLayout(); +        } +          if (mLayout.getLineCount() <= mMaximum) {              return getCompoundPaddingBottom();          } diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 62ea35194954..8ea28eca476b 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -367,6 +367,9 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding                  peeker.mOpticalInsets[0], peeker.mOpticalInsets[1], peeker.mOpticalInsets[2], peeker.mOpticalInsets[3],                  peeker.mOutlineInsets[0], peeker.mOutlineInsets[1], peeker.mOutlineInsets[2], peeker.mOutlineInsets[3],                  peeker.mOutlineRadius, peeker.mOutlineAlpha, scale); +        if (ninePatchInsets == NULL) { +            return nullObjectReturn("nine patch insets == null"); +        }          if (javaBitmap != NULL) {              env->SetObjectField(javaBitmap, gBitmap_ninePatchInsetsFieldID, ninePatchInsets);          } diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index 7c41c2e428e1..d7b75dbb0324 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -419,6 +419,7 @@ jobject GraphicsJNI::createBitmap(JNIEnv* env, SkBitmap* bitmap, jbyteArray buff  {      SkASSERT(bitmap);      SkASSERT(bitmap->pixelRef()); +    SkASSERT(!env->ExceptionCheck());      bool isMutable = bitmapCreateFlags & kBitmapCreateFlag_Mutable;      bool isPremultiplied = bitmapCreateFlags & kBitmapCreateFlag_Premultiplied; diff --git a/core/res/res/drawable-hdpi/pointer_spot_anchor.png b/core/res/res/drawable-hdpi/pointer_spot_anchor.png Binary files differindex d7aca3677085..bdb5311d5f21 100644 --- a/core/res/res/drawable-hdpi/pointer_spot_anchor.png +++ b/core/res/res/drawable-hdpi/pointer_spot_anchor.png diff --git a/core/res/res/drawable-hdpi/pointer_spot_anchor_icon.xml b/core/res/res/drawable-hdpi/pointer_spot_anchor_icon.xml deleted file mode 100644 index 2222b8e023e2..000000000000 --- a/core/res/res/drawable-hdpi/pointer_spot_anchor_icon.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<pointer-icon xmlns:android="http://schemas.android.com/apk/res/android" -    android:bitmap="@drawable/pointer_spot_anchor" -    android:hotSpotX="33" -    android:hotSpotY="33" /> diff --git a/core/res/res/drawable-hdpi/pointer_spot_hover.png b/core/res/res/drawable-hdpi/pointer_spot_hover.png Binary files differindex 5041aa3a022f..e7f2a0ca27c9 100644 --- a/core/res/res/drawable-hdpi/pointer_spot_hover.png +++ b/core/res/res/drawable-hdpi/pointer_spot_hover.png diff --git a/core/res/res/drawable-hdpi/pointer_spot_hover_icon.xml b/core/res/res/drawable-hdpi/pointer_spot_hover_icon.xml deleted file mode 100644 index dc62a696eb3b..000000000000 --- a/core/res/res/drawable-hdpi/pointer_spot_hover_icon.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<pointer-icon xmlns:android="http://schemas.android.com/apk/res/android" -    android:bitmap="@drawable/pointer_spot_hover" -    android:hotSpotX="33" -    android:hotSpotY="33" /> diff --git a/core/res/res/drawable-hdpi/pointer_spot_touch.png b/core/res/res/drawable-hdpi/pointer_spot_touch.png Binary files differindex 64a42a18f2c3..0326f91bdb00 100644 --- a/core/res/res/drawable-hdpi/pointer_spot_touch.png +++ b/core/res/res/drawable-hdpi/pointer_spot_touch.png diff --git a/core/res/res/drawable-hdpi/pointer_spot_touch_icon.xml b/core/res/res/drawable-hdpi/pointer_spot_touch_icon.xml deleted file mode 100644 index 4bffee6ab58b..000000000000 --- a/core/res/res/drawable-hdpi/pointer_spot_touch_icon.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<pointer-icon xmlns:android="http://schemas.android.com/apk/res/android" -    android:bitmap="@drawable/pointer_spot_touch" -    android:hotSpotX="24" -    android:hotSpotY="24" /> diff --git a/core/res/res/drawable-mdpi/pointer_arrow_icon.xml b/core/res/res/drawable-mdpi/pointer_arrow_icon.xml deleted file mode 100644 index 2f5676f38aed..000000000000 --- a/core/res/res/drawable-mdpi/pointer_arrow_icon.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<pointer-icon xmlns:android="http://schemas.android.com/apk/res/android" -    android:bitmap="@drawable/pointer_arrow" -    android:hotSpotX="6" -    android:hotSpotY="6" /> diff --git a/core/res/res/drawable-mdpi/pointer_spot_anchor.png b/core/res/res/drawable-mdpi/pointer_spot_anchor.png Binary files differindex d7aca3677085..4e282e7f14cd 100644 --- a/core/res/res/drawable-mdpi/pointer_spot_anchor.png +++ b/core/res/res/drawable-mdpi/pointer_spot_anchor.png diff --git a/core/res/res/drawable-mdpi/pointer_spot_hover.png b/core/res/res/drawable-mdpi/pointer_spot_hover.png Binary files differindex 5041aa3a022f..67d0b066341b 100644 --- a/core/res/res/drawable-mdpi/pointer_spot_hover.png +++ b/core/res/res/drawable-mdpi/pointer_spot_hover.png diff --git a/core/res/res/drawable-mdpi/pointer_spot_touch.png b/core/res/res/drawable-mdpi/pointer_spot_touch.png Binary files differindex 64a42a18f2c3..45dc5c08f932 100644 --- a/core/res/res/drawable-mdpi/pointer_spot_touch.png +++ b/core/res/res/drawable-mdpi/pointer_spot_touch.png diff --git a/core/res/res/drawable-xhdpi/pointer_arrow_icon.xml b/core/res/res/drawable-xhdpi/pointer_arrow_icon.xml deleted file mode 100644 index 2fbe45a2e9f2..000000000000 --- a/core/res/res/drawable-xhdpi/pointer_arrow_icon.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<pointer-icon xmlns:android="http://schemas.android.com/apk/res/android" -    android:bitmap="@drawable/pointer_arrow" -    android:hotSpotX="12" -    android:hotSpotY="12" /> diff --git a/core/res/res/drawable-xhdpi/pointer_spot_anchor.png b/core/res/res/drawable-xhdpi/pointer_spot_anchor.png Binary files differindex ad41c9785db4..fa9226e943ad 100644 --- a/core/res/res/drawable-xhdpi/pointer_spot_anchor.png +++ b/core/res/res/drawable-xhdpi/pointer_spot_anchor.png diff --git a/core/res/res/drawable-xhdpi/pointer_spot_hover.png b/core/res/res/drawable-xhdpi/pointer_spot_hover.png Binary files differindex e9b98f6d4b90..f09a778e6b93 100644 --- a/core/res/res/drawable-xhdpi/pointer_spot_hover.png +++ b/core/res/res/drawable-xhdpi/pointer_spot_hover.png diff --git a/core/res/res/drawable-xhdpi/pointer_spot_touch.png b/core/res/res/drawable-xhdpi/pointer_spot_touch.png Binary files differindex e10d99809161..53d7a20406f7 100644 --- a/core/res/res/drawable-xhdpi/pointer_spot_touch.png +++ b/core/res/res/drawable-xhdpi/pointer_spot_touch.png diff --git a/core/res/res/drawable-hdpi/pointer_arrow_icon.xml b/core/res/res/drawable/pointer_arrow_icon.xml index a4cce5c631c0..8f7d658c9f3a 100644 --- a/core/res/res/drawable-hdpi/pointer_arrow_icon.xml +++ b/core/res/res/drawable/pointer_arrow_icon.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8"?>  <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"      android:bitmap="@drawable/pointer_arrow" -    android:hotSpotX="9" -    android:hotSpotY="9" /> +    android:hotSpotX="6dp" +    android:hotSpotY="6dp" /> diff --git a/core/res/res/drawable-mdpi/pointer_spot_anchor_icon.xml b/core/res/res/drawable/pointer_spot_anchor_icon.xml index 2222b8e023e2..73c0c11d99fa 100644 --- a/core/res/res/drawable-mdpi/pointer_spot_anchor_icon.xml +++ b/core/res/res/drawable/pointer_spot_anchor_icon.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8"?>  <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"      android:bitmap="@drawable/pointer_spot_anchor" -    android:hotSpotX="33" -    android:hotSpotY="33" /> +    android:hotSpotX="22dp" +    android:hotSpotY="22dp" /> diff --git a/core/res/res/drawable-mdpi/pointer_spot_hover_icon.xml b/core/res/res/drawable/pointer_spot_hover_icon.xml index dc62a696eb3b..1d7440b3f6d9 100644 --- a/core/res/res/drawable-mdpi/pointer_spot_hover_icon.xml +++ b/core/res/res/drawable/pointer_spot_hover_icon.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8"?>  <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"      android:bitmap="@drawable/pointer_spot_hover" -    android:hotSpotX="33" -    android:hotSpotY="33" /> +    android:hotSpotX="22dp" +    android:hotSpotY="22dp" /> diff --git a/core/res/res/drawable-mdpi/pointer_spot_touch_icon.xml b/core/res/res/drawable/pointer_spot_touch_icon.xml index 4bffee6ab58b..f4f0639d49d8 100644 --- a/core/res/res/drawable-mdpi/pointer_spot_touch_icon.xml +++ b/core/res/res/drawable/pointer_spot_touch_icon.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8"?>  <pointer-icon xmlns:android="http://schemas.android.com/apk/res/android"      android:bitmap="@drawable/pointer_spot_touch" -    android:hotSpotX="24" -    android:hotSpotY="24" /> +    android:hotSpotX="16dp" +    android:hotSpotY="16dp" /> diff --git a/core/res/res/values-mcc310-mnc260/config.xml b/core/res/res/values-mcc310-mnc260/config.xml index d602c9fa634c..00cdaeb72518 100644 --- a/core/res/res/values-mcc310-mnc260/config.xml +++ b/core/res/res/values-mcc310-mnc260/config.xml @@ -25,4 +25,9 @@      -->      <integer name="config_mobile_mtu">1440</integer> +    <!-- Values for GPS configuration --> +    <string-array translatable="false" name="config_gpsParameters"> +        <item>"SUPL_PORT=7279"</item> +        <item>GPS_LOCK=1</item> +    </string-array>  </resources> diff --git a/core/res/res/values-mcc310-mnc410/config.xml b/core/res/res/values-mcc310-mnc410/config.xml index c7ae8c8376ea..9e63047cb9ff 100644 --- a/core/res/res/values-mcc310-mnc410/config.xml +++ b/core/res/res/values-mcc310-mnc410/config.xml @@ -40,4 +40,8 @@          <item>315</item>          <item>316</item>      </string-array> +    <!-- Values for GPS configuration --> +    <string-array translatable="false" name="config_gpsParameters"> +        <item>"SUPL_HOST=supl.google.com"</item> +    </string-array>  </resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index a798d2e78a87..ce2bc8526713 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -7112,9 +7112,9 @@          <!-- Drawable to use as the icon bitmap. -->          <attr name="bitmap" format="reference" />          <!-- X coordinate of the icon hot spot. --> -        <attr name="hotSpotX" format="float" /> +        <attr name="hotSpotX" format="dimension" />          <!-- Y coordinate of the icon hot spot. --> -        <attr name="hotSpotY" format="float" /> +        <attr name="hotSpotY" format="dimension" />      </declare-styleable>      <declare-styleable name="Storage"> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index af213ba06f56..f5f079c233f9 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1695,4 +1695,21 @@      <string-array translatable="false" name="no_ems_support_sim_operators" />      <bool name="config_auto_attach_data_on_creation">true</bool> + +    <!-- Values for GPS configuration --> +    <string-array translatable="false" name="config_gpsParameters"> +        <item>SUPL_HOST=supl.google.com</item> +        <item>SUPL_PORT=7275</item> +        <item>XTRA_SERVER_1=http://xtrapath1.izatcloud.net/xtra2.bin</item> +        <item>XTRA_SERVER_2=http://xtrapath2.izatcloud.net/xtra2.bin</item> +        <item>XTRA_SERVER_3=http://xtrapath3.izatcloud.net/xtra2.bin</item> +        <item>NTP_SERVER=north-america.pool.ntp.org</item> +        <item>SUPL_VER=0x20000</item> +        <item>CAPABILITIES=0x33</item> +        <item>LPP_PROFILE=0</item> +        <item>NMEA_PROVIDER=0</item> +        <item>A_GLONASS_POS_PROTOCOL_SELECT=0</item> +        <item>ERR_ESTIMATE=0</item> +        <item>INTERMEDIATE_POS=0</item> +    </string-array>  </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 0a274f8994bb..06bd2ecf7532 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1037,6 +1037,7 @@    <java-symbol type="array" name="config_globalActionsList" />    <java-symbol type="array" name="config_telephonyHardware" />    <java-symbol type="array" name="config_keySystemUuidMapping" /> +  <java-symbol type="array" name="config_gpsParameters" />    <java-symbol type="drawable" name="default_wallpaper" />    <java-symbol type="drawable" name="indicator_input_error" /> diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java index b5d9729e043a..1072b3c546ec 100644 --- a/graphics/java/android/graphics/pdf/PdfRenderer.java +++ b/graphics/java/android/graphics/pdf/PdfRenderer.java @@ -195,6 +195,7 @@ public final class PdfRenderer implements AutoCloseable {      public Page openPage(int index) {          throwIfClosed();          throwIfPageOpened(); +        throwIfPageNotInDocument(index);          mCurrentPage = new Page(index);          return mCurrentPage;      } @@ -237,6 +238,12 @@ public final class PdfRenderer implements AutoCloseable {          }      } +    private void throwIfPageNotInDocument(int pageIndex) { +        if (pageIndex >= mPageCount) { +            throw new IllegalArgumentException("Invalid page index"); +        } +    } +      /**       * This class represents a PDF document page for rendering.       */ diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp index c802b183d41c..23fe1b990df5 100644 --- a/libs/hwui/ProgramCache.cpp +++ b/libs/hwui/ProgramCache.cpp @@ -88,7 +88,7 @@ const char* gVS_Header_Varyings_HasGradient[6] = {          "varying vec2 ditherTexCoords;\n",  };  const char* gVS_Header_Varyings_HasRoundRectClip = -        "varying vec2 roundRectPos;\n"; +        "varying highp vec2 roundRectPos;\n";  const char* gVS_Main =          "\nvoid main(void) {\n";  const char* gVS_Main_OutTexCoords = diff --git a/location/java/android/location/GpsMeasurement.java b/location/java/android/location/GpsMeasurement.java index 591a6ca23c50..1550dc2e1657 100644 --- a/location/java/android/location/GpsMeasurement.java +++ b/location/java/android/location/GpsMeasurement.java @@ -49,7 +49,7 @@ public class GpsMeasurement implements Parcelable {      private double mCarrierPhase;      private double mCarrierPhaseUncertainty;      private byte mLossOfLock; -    private short mBitNumber; +    private int mBitNumber;      private short mTimeFromLastBitInMs;      private double mDopplerShiftInHz;      private double mDopplerShiftUncertaintyInHz; @@ -784,14 +784,14 @@ public class GpsMeasurement implements Parcelable {       *       * The value is only available if {@link #hasBitNumber()} is true.       */ -    public short getBitNumber() { +    public int getBitNumber() {          return mBitNumber;      }      /**       * Sets the bit number within the broadcast frame.       */ -    public void setBitNumber(short bitNumber) { +    public void setBitNumber(int bitNumber) {          setFlag(HAS_BIT_NUMBER);          mBitNumber = bitNumber;      } @@ -801,7 +801,7 @@ public class GpsMeasurement implements Parcelable {       */      public void resetBitNumber() {          resetFlag(HAS_BIT_NUMBER); -        mBitNumber = Short.MIN_VALUE; +        mBitNumber = Integer.MIN_VALUE;      }      /** @@ -1161,7 +1161,7 @@ public class GpsMeasurement implements Parcelable {              gpsMeasurement.mCarrierPhase = parcel.readDouble();              gpsMeasurement.mCarrierPhaseUncertainty = parcel.readDouble();              gpsMeasurement.mLossOfLock = parcel.readByte(); -            gpsMeasurement.mBitNumber = (short) parcel.readInt(); +            gpsMeasurement.mBitNumber = parcel.readInt();              gpsMeasurement.mTimeFromLastBitInMs = (short) parcel.readInt();              gpsMeasurement.mDopplerShiftInHz = parcel.readDouble();              gpsMeasurement.mDopplerShiftUncertaintyInHz = parcel.readDouble(); diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 10fa4044b452..d15085bba088 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -1564,6 +1564,9 @@ public class AudioService extends IAudioService.Stub {                  callingPackage) != AppOpsManager.MODE_ALLOWED) {              return;          } +        if (!checkAudioSettingsPermission("setMicrophoneMute()")) { +            return; +        }          AudioSystem.muteMicrophone(on);          // Post a persist microphone msg. diff --git a/packages/Keyguard/res/layout/keyguard_emergency_carrier_area_empty.xml b/packages/Keyguard/res/layout/keyguard_emergency_carrier_area_empty.xml deleted file mode 100644 index 2f4adae00cf7..000000000000 --- a/packages/Keyguard/res/layout/keyguard_emergency_carrier_area_empty.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -** -** Copyright 2012, 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. -*/ ---> - -<!-- This is a blank layout to simplify implementation on landscape on phones -     it is referenced indirectly by keyguard_eca --> -<LinearLayout -    xmlns:android="http://schemas.android.com/apk/res/android" -    android:layout_width="0dip" -    android:layout_height="0dip" -    android:orientation="vertical" -    android:gravity="center" -    android:layout_gravity="center_horizontal" -    android:layout_alignParentBottom="true"> - -</LinearLayout> diff --git a/packages/Keyguard/res/values-land/alias.xml b/packages/Keyguard/res/values-land/alias.xml deleted file mode 100644 index 7aac5b4ab379..000000000000 --- a/packages/Keyguard/res/values-land/alias.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* //device/apps/common/assets/res/any/colors.xml -** -** Copyright 2012, 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> -    <!-- Alias used to reference one of two possible layouts in keyguard.  --> -    <item type="layout" name="keyguard_eca">@layout/keyguard_emergency_carrier_area_empty</item> -</resources> diff --git a/packages/Keyguard/res/values-port/alias.xml b/packages/Keyguard/res/values-port/alias.xml deleted file mode 100644 index c3ecbb9e4f63..000000000000 --- a/packages/Keyguard/res/values-port/alias.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* //device/apps/common/assets/res/any/colors.xml -** -** Copyright 2012, 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> -    <!-- Alias used to reference one of two possible layouts in keyguard.  --> -    <item type="layout" name="keyguard_eca">@layout/keyguard_emergency_carrier_area</item> -</resources> diff --git a/packages/Keyguard/res/values/alias.xml b/packages/Keyguard/res/values/alias.xml index e6657a18d76c..09e9591f37ad 100644 --- a/packages/Keyguard/res/values/alias.xml +++ b/packages/Keyguard/res/values/alias.xml @@ -49,4 +49,6 @@      <!-- Alias used to reference framework activity duration.  -->      <item type="integer" name="config_activityDefaultDur">@*android:integer/config_activityDefaultDur</item> +    <!-- Alias used to reference one of two possible layouts in keyguard.  --> +    <item type="layout" name="keyguard_eca">@layout/keyguard_emergency_carrier_area</item>  </resources> diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java index a0fab42f1fb6..8898f9ef4e14 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java @@ -128,16 +128,19 @@ public class KeyguardStatusView extends GridLayout {                  getResources().getDimensionPixelSize(R.dimen.widget_label_font_size));      } -    protected void refresh() { -        AlarmManager.AlarmClockInfo nextAlarm = mLockPatternUtils.getNextAlarm(); -        Patterns.update(mContext, nextAlarm != null); - +    public void refreshTime() {          mDateView.setFormat24Hour(Patterns.dateView);          mDateView.setFormat12Hour(Patterns.dateView);          mClockView.setFormat12Hour(Patterns.clockView12);          mClockView.setFormat24Hour(Patterns.clockView24); +    } + +    private void refresh() { +        AlarmManager.AlarmClockInfo nextAlarm = mLockPatternUtils.getNextAlarm(); +        Patterns.update(mContext, nextAlarm != null); +        refreshTime();          refreshAlarmStatus(nextAlarm);      } diff --git a/packages/PrintSpooler/Android.mk b/packages/PrintSpooler/Android.mk index 3fbd4d8a4160..4948a0240b1b 100644 --- a/packages/PrintSpooler/Android.mk +++ b/packages/PrintSpooler/Android.mk @@ -19,6 +19,7 @@ include $(CLEAR_VARS)  LOCAL_MODULE_TAGS := optional  LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_SRC_FILES += src/com/android/printspooler/renderer/IPdfRenderer.aidl  LOCAL_PACKAGE_NAME := PrintSpooler diff --git a/packages/PrintSpooler/AndroidManifest.xml b/packages/PrintSpooler/AndroidManifest.xml index 540a2f34d248..9efda2f2725b 100644 --- a/packages/PrintSpooler/AndroidManifest.xml +++ b/packages/PrintSpooler/AndroidManifest.xml @@ -53,6 +53,11 @@              android:permission="android.permission.BIND_PRINT_SPOOLER_SERVICE">          </service> +        <service +            android:name=".renderer.PdfRendererService" +            android:isolatedProcess="true"> +        </service> +          <activity              android:name=".ui.PrintActivity"              android:configChanges="orientation|screenSize" diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java index c3ddad991343..cd2ccbdff945 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java @@ -17,24 +17,31 @@  package com.android.printspooler.model;  import android.app.ActivityManager; +import android.content.ComponentName;  import android.content.Context; -import android.content.res.Configuration; +import android.content.Intent; +import android.content.ServiceConnection;  import android.graphics.Bitmap; +import android.graphics.BitmapFactory;  import android.graphics.Color; -import android.graphics.Matrix;  import android.graphics.Rect;  import android.graphics.drawable.BitmapDrawable; -import android.graphics.pdf.PdfRenderer;  import android.os.AsyncTask; +import android.os.IBinder;  import android.os.ParcelFileDescriptor; -import android.print.PrintAttributes.MediaSize; -import android.print.PrintAttributes.Margins; +import android.os.RemoteException; +import android.print.PrintAttributes;  import android.print.PrintDocumentInfo;  import android.util.ArrayMap;  import android.util.Log;  import android.view.View; +import com.android.internal.annotations.GuardedBy; +import com.android.printspooler.renderer.IPdfRenderer; +import com.android.printspooler.renderer.PdfRendererService;  import dalvik.system.CloseGuard; +import libcore.io.IoUtils; +import java.io.FileDescriptor;  import java.io.IOException;  import java.util.Iterator;  import java.util.LinkedHashMap; @@ -55,9 +62,6 @@ public final class PageContentRepository {      private static final int BYTES_PER_MEGABYTE = 1048576; -    private static final int MILS_PER_INCH = 1000; -    private static final int POINTS_IN_INCH = 72; -      private final CloseGuard mCloseGuard = CloseGuard.get();      private final ArrayMap<Integer, PageContentProvider> mPageContentProviders = @@ -115,7 +119,6 @@ public final class PageContentRepository {          if (DEBUG) {              Log.i(LOG_TAG, "STATE_DESTROYED");          } -        throwIfNotClosed();          doDestroy();      } @@ -351,15 +354,13 @@ public final class PageContentRepository {      public static final class RenderSpec {          final int bitmapWidth;          final int bitmapHeight; -        final MediaSize mediaSize; -        final Margins minMargins; +        final PrintAttributes printAttributes;          public RenderSpec(int bitmapWidth, int bitmapHeight, -                MediaSize mediaSize, Margins minMargins) { +                PrintAttributes printAttributes) {              this.bitmapWidth = bitmapWidth;              this.bitmapHeight = bitmapHeight; -            this.mediaSize = mediaSize; -            this.minMargins = minMargins; +            this.printAttributes = printAttributes;          }          @Override @@ -380,18 +381,11 @@ public final class PageContentRepository {              if (bitmapWidth != other.bitmapWidth) {                  return false;              } -            if (mediaSize != null) { -                if (!mediaSize.equals(other.mediaSize)) { +            if (printAttributes != null) { +                if (!printAttributes.equals(other.printAttributes)) {                      return false;                  } -            } else if (other.mediaSize != null) { -                return false; -            } -            if (minMargins != null) { -                if (!minMargins.equals(other.minMargins)) { -                    return false; -                } -            } else if (other.minMargins != null) { +            } else if (other.printAttributes != null) {                  return false;              }              return true; @@ -407,8 +401,7 @@ public final class PageContentRepository {          public int hashCode() {              int result = bitmapWidth;              result = 31 * result + bitmapHeight; -            result = 31 * result + (mediaSize != null ? mediaSize.hashCode() : 0); -            result = 31 * result + (minMargins != null ? minMargins.hashCode() : 0); +            result = 31 * result + (printAttributes != null ? printAttributes.hashCode() : 0);              return result;          }      } @@ -440,13 +433,11 @@ public final class PageContentRepository {          }      } -    private static int pointsFromMils(int mils) { -        return (int) (((float) mils / MILS_PER_INCH) * POINTS_IN_INCH); -    } - -    private static class AsyncRenderer { +    private static final class AsyncRenderer implements ServiceConnection {          private static final int MALFORMED_PDF_FILE_ERROR = -2; +        private final Object mLock = new Object(); +          private final Context mContext;          private final PageContentLruCache mPageContentCache; @@ -457,8 +448,8 @@ public final class PageContentRepository {          private int mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; -        // Accessed only by the executor thread. -        private PdfRenderer mRenderer; +        @GuardedBy("mLock") +        private IPdfRenderer mRenderer;          public AsyncRenderer(Context context, OnMalformedPdfFileListener malformedPdfFileListener) {              mContext = context; @@ -470,6 +461,21 @@ public final class PageContentRepository {              mPageContentCache = new PageContentLruCache(cacheSizeInBytes);          } +        @Override +        public void onServiceConnected(ComponentName name, IBinder service) { +            synchronized (mLock) { +                mRenderer = IPdfRenderer.Stub.asInterface(service); +                mLock.notifyAll(); +            } +        } + +        @Override +        public void onServiceDisconnected(ComponentName name) { +            synchronized (mLock) { +                mRenderer = null; +            } +        } +          public void open(final ParcelFileDescriptor source, final Runnable callback) {              // Opening a new document invalidates the cache as it has pages              // from the last document. We keep the cache even when the document @@ -479,13 +485,27 @@ public final class PageContentRepository {              new AsyncTask<Void, Void, Integer>() {                  @Override +                protected void onPreExecute() { +                    Intent intent = new Intent(mContext, PdfRendererService.class); +                    mContext.bindService(intent, AsyncRenderer.this, Context.BIND_AUTO_CREATE); +                } + +                @Override                  protected Integer doInBackground(Void... params) { -                    try { -                        mRenderer = new PdfRenderer(source); -                        return mRenderer.getPageCount(); -                    } catch (IOException ioe) { -                        Log.e(LOG_TAG, "Cannot open PDF document"); -                        return MALFORMED_PDF_FILE_ERROR; +                    synchronized (mLock) { +                        while (mRenderer == null) { +                            try { +                                mLock.wait(); +                            } catch (InterruptedException ie) { +                                /* ignore */ +                            } +                        } +                        try { +                            return mRenderer.openDocument(source); +                        } catch (RemoteException re) { +                            Log.e(LOG_TAG, "Cannot open PDF document"); +                            return MALFORMED_PDF_FILE_ERROR; +                        }                      }                  } @@ -510,7 +530,13 @@ public final class PageContentRepository {              new AsyncTask<Void, Void, Void>() {                  @Override                  protected Void doInBackground(Void... params) { -                    mRenderer.close(); +                    synchronized (mLock) { +                        try { +                            mRenderer.closeDocument(); +                        } catch (RemoteException re) { +                            /* ignore */ +                        } +                    }                      return null;                  } @@ -525,8 +551,19 @@ public final class PageContentRepository {          }          public void destroy() { -            mPageContentCache.invalidate(); -            mPageContentCache.clear(); +            new AsyncTask<Void, Void, Void>() { +                @Override +                protected Void doInBackground(Void... params) { +                    return null; +                } + +                @Override +                public void onPostExecute(Void result) { +                    mContext.unbindService(AsyncRenderer.this); +                    mPageContentCache.invalidate(); +                    mPageContentCache.clear(); +                } +            }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null);          }          public void startPreload(int firstShownPage, int lastShownPage, RenderSpec renderSpec) { @@ -752,63 +789,31 @@ public final class PageContentRepository {                      return mRenderedPage;                  } -                PdfRenderer.Page page = mRenderer.openPage(mPageIndex); - -                if (isCancelled()) { -                    page.close(); -                    return mRenderedPage; -                } -                  Bitmap bitmap = mRenderedPage.content.getBitmap(); -                final int srcWidthPts = page.getWidth(); -                final int srcHeightPts = page.getHeight(); - -                final int dstWidthPts = pointsFromMils(mRenderSpec.mediaSize.getWidthMils()); -                final int dstHeightPts = pointsFromMils(mRenderSpec.mediaSize.getHeightMils()); - -                final boolean scaleContent = mRenderer.shouldScaleForPrinting(); -                final boolean contentLandscape = !mRenderSpec.mediaSize.isPortrait(); - -                final float displayScale; -                Matrix matrix = new Matrix(); - -                if (scaleContent) { -                    displayScale = Math.min((float) bitmap.getWidth() / srcWidthPts, -                            (float) bitmap.getHeight() / srcHeightPts); -                } else { -                    if (contentLandscape) { -                        displayScale = (float) bitmap.getHeight() / dstHeightPts; -                    } else { -                        displayScale = (float) bitmap.getWidth() / dstWidthPts; -                    } -                } -                matrix.postScale(displayScale, displayScale); - -                Configuration configuration = mContext.getResources().getConfiguration(); -                if (configuration.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { -                    matrix.postTranslate(bitmap.getWidth() - srcWidthPts * displayScale, 0); +                ParcelFileDescriptor[] pipe = null; +                try { +                    pipe = ParcelFileDescriptor.createPipe(); +                    ParcelFileDescriptor source = pipe[0]; +                    ParcelFileDescriptor destination = pipe[1]; + +                    mRenderer.renderPage(mPageIndex, bitmap.getWidth(), bitmap.getHeight(), +                            mRenderSpec.printAttributes, destination); + +                    // We passed the file descriptor to the other side which took +                    // ownership, so close our copy for the write to complete. +                    destination.close(); + +                    BitmapFactory.Options options = new BitmapFactory.Options(); +                    options.inBitmap = bitmap; +                    BitmapFactory.decodeFileDescriptor(source.getFileDescriptor(), null, options); +                } catch (IOException|RemoteException e) { +                    Log.e(LOG_TAG, "Error rendering page:" + mPageIndex, e); +                } finally { +                    IoUtils.closeQuietly(pipe[0]); +                    IoUtils.closeQuietly(pipe[1]);                  } -                final int paddingLeftPts = pointsFromMils(mRenderSpec.minMargins.getLeftMils()); -                final int paddingTopPts = pointsFromMils(mRenderSpec.minMargins.getTopMils()); -                final int paddingRightPts = pointsFromMils(mRenderSpec.minMargins.getRightMils()); -                final int paddingBottomPts = pointsFromMils(mRenderSpec.minMargins.getBottomMils()); - -                Rect clip = new Rect(); -                clip.left = (int) (paddingLeftPts * displayScale); -                clip.top = (int) (paddingTopPts * displayScale); -                clip.right = (int) (bitmap.getWidth() - paddingRightPts * displayScale); -                clip.bottom = (int) (bitmap.getHeight() - paddingBottomPts * displayScale); - -                if (DEBUG) { -                    Log.i(LOG_TAG, "Rendering page:" + mPageIndex + " of " + mPageCount); -                } - -                page.render(bitmap, clip, matrix, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); - -                page.close(); -                  return mRenderedPage;              } diff --git a/packages/PrintSpooler/src/com/android/printspooler/renderer/IPdfRenderer.aidl b/packages/PrintSpooler/src/com/android/printspooler/renderer/IPdfRenderer.aidl new file mode 100644 index 000000000000..1fba2b1c60eb --- /dev/null +++ b/packages/PrintSpooler/src/com/android/printspooler/renderer/IPdfRenderer.aidl @@ -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. + */ + +package com.android.printspooler.renderer; + +import android.graphics.Rect; +import android.os.ParcelFileDescriptor; +import android.print.PageRange; +import android.print.PrintAttributes; + +/** + * Interface for communication with a remote pdf renderer. + */ +interface IPdfRenderer { +    int openDocument(in ParcelFileDescriptor source); +    oneway void renderPage(int pageIndex, int bitmapWidth, int bitmapHeight, +        in PrintAttributes attributes, in ParcelFileDescriptor destination); +    oneway void closeDocument(); +    oneway void writePages(in PageRange[] pages); +} diff --git a/packages/PrintSpooler/src/com/android/printspooler/renderer/PdfRendererService.java b/packages/PrintSpooler/src/com/android/printspooler/renderer/PdfRendererService.java new file mode 100644 index 000000000000..a4c693284e92 --- /dev/null +++ b/packages/PrintSpooler/src/com/android/printspooler/renderer/PdfRendererService.java @@ -0,0 +1,198 @@ +/* + * 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.printspooler.renderer; + +import android.app.Service; +import android.content.Intent; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.Matrix; +import android.graphics.Rect; +import android.graphics.pdf.PdfRenderer; +import android.os.IBinder; +import android.os.ParcelFileDescriptor; +import android.os.RemoteException; +import android.print.PageRange; +import android.print.PrintAttributes; +import android.print.PrintAttributes.Margins; +import android.util.Log; +import android.view.View; +import libcore.io.IoUtils; + +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Service for rendering PDF documents in an isolated process. + */ +public final class PdfRendererService extends Service { +    private static final String LOG_TAG = "PdfRendererService"; +    private static final boolean DEBUG = false; + +    private static final int MILS_PER_INCH = 1000; +    private static final int POINTS_IN_INCH = 72; + +    @Override +    public IBinder onBind(Intent intent) { +        return new PdfRendererImpl(); +    } + +    private final class PdfRendererImpl extends IPdfRenderer.Stub { +        private final Object mLock = new Object(); + +        private Bitmap mBitmap; +        private PdfRenderer mRenderer; + +        @Override +        public int openDocument(ParcelFileDescriptor source) throws RemoteException { +            synchronized (mLock) { +                throwIfOpened(); +                if (DEBUG) { +                    Log.i(LOG_TAG, "openDocument()"); +                } +                try { +                    mRenderer = new PdfRenderer(source); +                    return mRenderer.getPageCount(); +                } catch (IOException ioe) { +                    throw new RemoteException("Cannot open file"); +                } +            } +        } + +        @Override +        public void renderPage(int pageIndex, int bitmapWidth, int bitmapHeight, +                PrintAttributes attributes, ParcelFileDescriptor destination) { +            FileOutputStream out = null; +            synchronized (mLock) { +                try { +                    throwIfNotOpened(); + +                    PdfRenderer.Page page = mRenderer.openPage(pageIndex); + +                    final int srcWidthPts = page.getWidth(); +                    final int srcHeightPts = page.getHeight(); + +                    final int dstWidthPts = pointsFromMils( +                            attributes.getMediaSize().getWidthMils()); +                    final int dstHeightPts = pointsFromMils( +                            attributes.getMediaSize().getHeightMils()); + +                    final boolean scaleContent = mRenderer.shouldScaleForPrinting(); +                    final boolean contentLandscape = !attributes.getMediaSize().isPortrait(); + +                    final float displayScale; +                    Matrix matrix = new Matrix(); + +                    if (scaleContent) { +                        displayScale = Math.min((float) bitmapWidth / srcWidthPts, +                                (float) bitmapHeight / srcHeightPts); +                    } else { +                        if (contentLandscape) { +                            displayScale = (float) bitmapHeight / dstHeightPts; +                        } else { +                            displayScale = (float) bitmapWidth / dstWidthPts; +                        } +                    } +                    matrix.postScale(displayScale, displayScale); + +                    Configuration configuration = PdfRendererService.this.getResources() +                            .getConfiguration(); +                    if (configuration.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { +                        matrix.postTranslate(bitmapWidth - srcWidthPts * displayScale, 0); +                    } + +                    Margins minMargins = attributes.getMinMargins(); +                    final int paddingLeftPts = pointsFromMils(minMargins.getLeftMils()); +                    final int paddingTopPts = pointsFromMils(minMargins.getTopMils()); +                    final int paddingRightPts = pointsFromMils(minMargins.getRightMils()); +                    final int paddingBottomPts = pointsFromMils(minMargins.getBottomMils()); + +                    Rect clip = new Rect(); +                    clip.left = (int) (paddingLeftPts * displayScale); +                    clip.top = (int) (paddingTopPts * displayScale); +                    clip.right = (int) (bitmapWidth - paddingRightPts * displayScale); +                    clip.bottom = (int) (bitmapHeight - paddingBottomPts * displayScale); + +                    if (DEBUG) { +                        Log.i(LOG_TAG, "Rendering page:" + pageIndex); +                    } + +                    Bitmap bitmap = getBitmapForSize(bitmapWidth, bitmapHeight); +                    page.render(bitmap, clip, matrix, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); + +                    page.close(); + +                    out = new FileOutputStream(destination.getFileDescriptor()); +                    bitmap.compress(Bitmap.CompressFormat.PNG, 0, out); +                } finally { +                    IoUtils.closeQuietly(out); +                    IoUtils.closeQuietly(destination); +                } +            } +        } + +        @Override +        public void closeDocument() { +            synchronized (mLock) { +                throwIfNotOpened(); +                if (DEBUG) { +                    Log.i(LOG_TAG, "openDocument()"); +                } +                mRenderer.close(); +                mRenderer = null; +            } +        } + +        @Override +        public void writePages(PageRange[] pages) { +            synchronized (mLock) { +                throwIfNotOpened(); +                if (DEBUG) { +                    Log.i(LOG_TAG, "writePages()"); +                } +                // TODO: Implement dropping undesired pages. +            } +        } + +        private Bitmap getBitmapForSize(int width, int height) { +            if (mBitmap != null) { +                if (mBitmap.getWidth() == width && mBitmap.getHeight() == height) { +                    return mBitmap; +                } +                mBitmap.recycle(); +            } +            mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); +            return mBitmap; +        } + +        private void throwIfOpened() { +            if (mRenderer != null) { +                throw new IllegalStateException("Already opened"); +            } +        } + +        private void throwIfNotOpened() { +            if (mRenderer == null) { +                throw new IllegalStateException("Not opened"); +            } +        } +    } + +    private static int pointsFromMils(int mils) { +        return (int) (((float) mils / MILS_PER_INCH) * POINTS_IN_INCH); +    } +} diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java index 01c974677f90..022e0d0447cd 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java @@ -319,6 +319,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat              mProgressMessageController.cancel();              mPrinterRegistry.setTrackedPrinter(null); +            mPrintPreviewController.destroy();              mSpoolerProvider.destroy();              mPrintedDocument.finish();              mPrintedDocument.destroy(); @@ -2185,4 +2186,4 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat              updateOptionsUi();          }      } -}
\ No newline at end of file +} diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java index 4a23ec447c61..ddf637eeb71f 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java @@ -191,6 +191,9 @@ class PrintPreviewController implements MutexFileProvider.OnReleaseRequestCallba      }      public void destroy() { +        if (mPageAdapter.isOpened()) { +            mPageAdapter.close(null); +        }          mPageAdapter.destroy();      } diff --git a/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java b/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java index 83653731fba4..76ff167293f4 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java +++ b/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java @@ -20,6 +20,7 @@ import android.content.Context;  import android.graphics.Canvas;  import android.graphics.drawable.BitmapDrawable;  import android.graphics.drawable.ColorDrawable; +import android.print.PrintAttributes;  import android.print.PrintAttributes.MediaSize;  import android.print.PrintAttributes.Margins;  import android.util.AttributeSet; @@ -38,13 +39,12 @@ import com.android.printspooler.model.PageContentRepository.RenderSpec;  public class PageContentView extends View          implements PageContentRepository.OnPageContentAvailableCallback { +    private final PrintAttributes mAttributes = new PrintAttributes.Builder().build(); +      private final ColorDrawable mEmptyState;      private PageContentProvider mProvider; -    private MediaSize mMediaSize; -    private Margins mMinMargins; -      private boolean mContentRequested;      public PageContentView(Context context, AttributeSet attrs) { @@ -83,15 +83,17 @@ public class PageContentView extends View      }      public void init(PageContentProvider provider, MediaSize mediaSize, Margins minMargins) { -        if (mProvider == provider -                && ((mMediaSize == null) ? mediaSize == null : mMediaSize.equals(mediaSize)) -                && ((mMinMargins == null) ? minMargins == null : mMinMargins.equals(minMargins))) { +        if (mProvider == null ? provider == null : mProvider.equals(provider) +                && ((mAttributes.getMediaSize() == null) +                        ? mediaSize == null : mAttributes.getMediaSize().equals(mediaSize)) +                && ((mAttributes.getMinMargins() == null) +                        ? minMargins == null : mAttributes.getMinMargins().equals(minMargins))) {              return;          }          mProvider = provider; -        mMediaSize = mediaSize; -        mMinMargins = minMargins; +        mAttributes.setMediaSize(mediaSize); +        mAttributes.setMinMargins(minMargins);          mContentRequested = false;          // If there is no provider we want immediately to switch to @@ -106,8 +108,7 @@ public class PageContentView extends View      private void requestPageContentIfNeeded() {          if (getWidth() > 0 && getHeight() > 0 && !mContentRequested && mProvider != null) {              mContentRequested = true; -            mProvider.getPageContent(new RenderSpec(getWidth(), getHeight(), mMediaSize, -                    mMinMargins), this); +            mProvider.getPageContent(new RenderSpec(getWidth(), getHeight(), mAttributes), this);          }      }  } diff --git a/packages/SystemUI/res/drawable/notification_material_bg_dim.xml b/packages/SystemUI/res/drawable/notification_material_bg_dim.xml index b04394de7b93..65819428caf8 100644 --- a/packages/SystemUI/res/drawable/notification_material_bg_dim.xml +++ b/packages/SystemUI/res/drawable/notification_material_bg_dim.xml @@ -14,7 +14,11 @@    ~ See the License for the specific language governing permissions and    ~ limitations under the License    --> -<shape xmlns:android="http://schemas.android.com/apk/res/android"> -    <solid android:color="@color/notification_material_background_dimmed_color" /> -    <corners android:radius="@dimen/notification_material_rounded_rect_radius" /> -</shape> +<ripple xmlns:android="http://schemas.android.com/apk/res/android"> +    <item> +        <shape> +            <solid android:color="@color/notification_material_background_dimmed_color" /> +            <corners android:radius="@dimen/notification_material_rounded_rect_radius" /> +        </shape> +    </item> +</ripple> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index f3a62b85cc5f..6da811f9b8b3 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -90,7 +90,10 @@      <color name="notification_material_background_media_default_color">#ff424242</color>      <!-- The color of the ripples on the untinted notifications --> -    <color name="notification_ripple_untinted_color">#20000000</color> +    <color name="notification_ripple_untinted_color">#28000000</color> + +    <!-- The color of the ripples on the low priority notifications --> +    <color name="notification_ripple_color_low_priority">#30000000</color>      <!-- The color of the ripples on the tinted notifications -->      <color name="notification_ripple_tinted_color">#30ffffff</color> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java index 500bf45602d6..e6984b2bd6d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java @@ -88,6 +88,9 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView              = new PathInterpolator(0.6f, 0, 0.5f, 1);      private static final Interpolator ACTIVATE_INVERSE_ALPHA_INTERPOLATOR              = new PathInterpolator(0, 0, 0.5f, 1); +    private final int mTintedRippleColor; +    private final int mLowPriorityRippleColor; +    private final int mNormalRippleColor;      private boolean mDimmed;      private boolean mDark; @@ -153,6 +156,12 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView          mNormalColor = getResources().getColor(R.color.notification_material_background_color);          mLowPriorityColor = getResources().getColor(                  R.color.notification_material_background_low_priority_color); +        mTintedRippleColor = context.getResources().getColor( +                R.color.notification_ripple_tinted_color); +        mLowPriorityRippleColor = context.getResources().getColor( +                R.color.notification_ripple_color_low_priority); +        mNormalRippleColor = context.getResources().getColor( +                R.color.notification_ripple_untinted_color);      }      @Override @@ -191,6 +200,16 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView          }      } +    @Override +    protected void drawableStateChanged() { +        super.drawableStateChanged(); +        if (mDimmed) { +            mBackgroundDimmed.setState(getDrawableState()); +        } else { +            mBackgroundNormal.setState(getDrawableState()); +        } +    } +      private boolean handleTouchEventDimmed(MotionEvent event) {          int action = event.getActionMasked();          switch (action) { @@ -372,12 +391,15 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView      private void updateBackgroundTint() {          int color = getBackgroundColor(); +        int rippleColor = getRippleColor();          if (color == mNormalColor) {              // We don't need to tint a normal notification              color = 0;          }          mBackgroundDimmed.setTint(color);          mBackgroundNormal.setTint(color); +        mBackgroundDimmed.setRippleColor(rippleColor); +        mBackgroundNormal.setRippleColor(rippleColor);      }      private void fadeBackground() { @@ -618,6 +640,18 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView          }      } +    private int getRippleColor() { +        if (mBgTint != 0) { +            return mTintedRippleColor; +        } else if (mShowingLegacyBackground) { +            return mTintedRippleColor; +        } else if (mIsBelowSpeedBump) { +            return mLowPriorityRippleColor; +        } else { +            return mNormalRippleColor; +        } +    } +      /**       * When we draw the appear animation, we render the view in a bitmap and render this bitmap       * as a shader of a rect. This call creates the Bitmap and switches the drawing mode, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBackgroundView.java index ad274b0a70e1..5db680a1b379 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBackgroundView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBackgroundView.java @@ -35,15 +35,9 @@ public class NotificationBackgroundView extends View {      private Drawable mBackground;      private int mClipTopAmount;      private int mActualHeight; -    private final int mTintedRippleColor; -    private final int mNormalRippleColor;      public NotificationBackgroundView(Context context, AttributeSet attrs) {          super(context, attrs); -        mTintedRippleColor = context.getResources().getColor( -                R.color.notification_ripple_tinted_color); -        mNormalRippleColor = context.getResources().getColor( -                R.color.notification_ripple_untinted_color);      }      @Override @@ -103,17 +97,10 @@ public class NotificationBackgroundView extends View {      }      public void setTint(int tintColor) { -        int rippleColor;          if (tintColor != 0) {              mBackground.setColorFilter(tintColor, PorterDuff.Mode.SRC_ATOP); -            rippleColor = mTintedRippleColor;          } else {              mBackground.clearColorFilter(); -            rippleColor = mNormalRippleColor; -        } -        if (mBackground instanceof RippleDrawable) { -            RippleDrawable ripple = (RippleDrawable) mBackground; -            ripple.setColor(ColorStateList.valueOf(rippleColor));          }          invalidate();      } @@ -138,4 +125,15 @@ public class NotificationBackgroundView extends View {          // Prevents this view from creating a layer when alpha is animating.          return false;      } + +    public void setState(int[] drawableState) { +        mBackground.setState(drawableState); +    } + +    public void setRippleColor(int color) { +        if (mBackground instanceof RippleDrawable) { +            RippleDrawable ripple = (RippleDrawable) mBackground; +            ripple.setColor(ColorStateList.valueOf(color)); +        } +    }  } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 5a94395437cf..91a8b22e89d2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -35,6 +35,7 @@ import android.view.animation.Interpolator;  import android.widget.FrameLayout;  import android.widget.TextView; +import com.android.keyguard.KeyguardStatusView;  import com.android.systemui.R;  import com.android.systemui.qs.QSPanel;  import com.android.systemui.statusbar.ExpandableView; @@ -65,7 +66,7 @@ public class NotificationPanelView extends PanelView implements      private KeyguardStatusBarView mKeyguardStatusBar;      private View mQsContainer;      private QSPanel mQsPanel; -    private View mKeyguardStatusView; +    private KeyguardStatusView mKeyguardStatusView;      private ObservableScrollView mScrollView;      private TextView mClockView;      private View mReserveNotificationSpace; @@ -174,7 +175,7 @@ public class NotificationPanelView extends PanelView implements          mHeader = (StatusBarHeaderView) findViewById(R.id.header);          mHeader.setOnClickListener(this);          mKeyguardStatusBar = (KeyguardStatusBarView) findViewById(R.id.keyguard_header); -        mKeyguardStatusView = findViewById(R.id.keyguard_status_view); +        mKeyguardStatusView = (KeyguardStatusView) findViewById(R.id.keyguard_status_view);          mQsContainer = findViewById(R.id.quick_settings_container);          mQsPanel = (QSPanel) findViewById(R.id.quick_settings_panel);          mClockView = (TextView) findViewById(R.id.clock_view); @@ -1749,4 +1750,8 @@ public class NotificationPanelView extends PanelView implements              mHeader.updateEverything();          }      }; + +    public void onScreenTurnedOn() { +        mKeyguardStatusView.refreshTime(); +    }  } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ObservableScrollView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ObservableScrollView.java index 53361dcef591..b842a6ba348d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ObservableScrollView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ObservableScrollView.java @@ -87,7 +87,9 @@ public class ObservableScrollView extends ScrollView {      @Override      public boolean dispatchTouchEvent(MotionEvent ev) { -        if (!mTouchEnabled) { +        boolean isEndGuesture = (ev.getAction() == MotionEvent.ACTION_UP +                || ev.getAction() == MotionEvent.ACTION_CANCEL); +        if (!mTouchEnabled && !isEndGuesture) {              return false;          }          return super.dispatchTouchEvent(ev); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 3b24bfdd3e65..ad775cbf9993 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -3817,6 +3817,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,      public void onScreenTurnedOn() {          mStackScroller.setAnimationsEnabled(true); +        mNotificationPanel.onScreenTurnedOn();      }      /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index e1fd77970e41..1811d8d24952 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -42,6 +42,7 @@ public class StatusBarWindowView extends FrameLayout {      private DragDownHelper mDragDownHelper;      private NotificationStackScrollLayout mStackScrollLayout;      private NotificationPanelView mNotificationPanel; +    private View mBrightnessMirror;      PhoneStatusBar mService; @@ -72,6 +73,7 @@ public class StatusBarWindowView extends FrameLayout {                  R.id.notification_stack_scroller);          mNotificationPanel = (NotificationPanelView) findViewById(R.id.notification_panel);          mDragDownHelper = new DragDownHelper(getContext(), this, mStackScrollLayout, mService); +        mBrightnessMirror = findViewById(R.id.brightness_mirror);          // We really need to be able to animate while window animations are going on          // so that activities may be started asynchronously from panel animations @@ -106,6 +108,19 @@ public class StatusBarWindowView extends FrameLayout {      }      @Override +    public boolean dispatchTouchEvent(MotionEvent ev) { +        if (mBrightnessMirror != null && mBrightnessMirror.getVisibility() == VISIBLE) { +            // Disallow new pointers while the brightness mirror is visible. This is so that you +            // can't touch anything other than the brightness slider while the mirror is showing +            // and the rest of the panel is transparent. +            if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) { +                return false; +            } +        } +        return super.dispatchTouchEvent(ev); +    } + +    @Override      public boolean onInterceptTouchEvent(MotionEvent ev) {          boolean intercept = false;          if (mNotificationPanel.isFullyExpanded() diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 0919f77b4371..ef0b155b6228 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -967,6 +967,17 @@ public class ConnectivityService extends IConnectivityManager.Stub {      }      @Override +    public Network getNetworkForType(int networkType) { +        enforceAccessPermission(); +        final int uid = Binder.getCallingUid(); +        if (isNetworkBlocked(networkType, uid)) { +            return null; +        } +        NetworkAgentInfo nai = mLegacyTypeTracker.getNetworkForType(networkType); +        return (nai == null) ? null : nai.network; +    } + +    @Override      public Network[] getAllNetworks() {          enforceAccessPermission();          final ArrayList<Network> result = new ArrayList(); @@ -1724,7 +1735,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {          pw.println();          synchronized (this) { -            pw.println("NetworkTranstionWakeLock is currently " + +            pw.println("NetworkTransitionWakeLock is currently " +                      (mNetTransitionWakeLock.isHeld() ? "" : "not ") + "held.");              pw.println("It was last requested for "+mNetTransitionWakeLockCausedBy);          } diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java index df54c7fe289b..2830b5ed4028 100644 --- a/services/core/java/com/android/server/MmsServiceBroker.java +++ b/services/core/java/com/android/server/MmsServiceBroker.java @@ -29,10 +29,12 @@ import android.content.ServiceConnection;  import android.content.pm.PackageManager;  import android.net.Uri;  import android.os.Binder; +import android.os.Bundle;  import android.os.Handler;  import android.os.IBinder;  import android.os.Message;  import android.os.RemoteException; +import android.os.ServiceManager;  import android.telephony.TelephonyManager;  import android.util.Slog; @@ -228,21 +230,8 @@ public class MmsServiceBroker extends SystemService {          }          @Override -        public boolean getCarrierConfigBoolean(long subId, String name, boolean defaultValue) -                throws RemoteException { -            return getServiceGuarded().getCarrierConfigBoolean(subId, name, defaultValue); -        } - -        @Override -        public int getCarrierConfigInt(long subId, String name, int defaultValue) -                throws RemoteException { -            return getServiceGuarded().getCarrierConfigInt(subId, name, defaultValue); -        } - -        @Override -        public String getCarrierConfigString(long subId, String name, String defaultValue) -                throws RemoteException { -            return getServiceGuarded().getCarrierConfigString(subId, name, defaultValue); +        public Bundle getCarrierConfigValues(long subId) throws RemoteException { +            return getServiceGuarded().getCarrierConfigValues(subId);          }          @Override diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index f9b65b8ca4b8..1318f66f3693 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -44,6 +44,7 @@ import android.net.INetworkManagementEventObserver;  import android.net.InterfaceConfiguration;  import android.net.IpPrefix;  import android.net.LinkAddress; +import android.net.Network;  import android.net.NetworkStats;  import android.net.NetworkUtils;  import android.net.RouteInfo; @@ -1200,10 +1201,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub      }      @Override -    public void setDnsForwarders(String[] dns) { +    public void setDnsForwarders(Network network, String[] dns) {          mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); -        final Command cmd = new Command("tether", "dns", "set"); +        int netId = (network != null) ? network.netId : ConnectivityManager.NETID_UNSET; +        final Command cmd = new Command("tether", "dns", "set", netId); +          for (String s : dns) {              cmd.appendArg(NetworkUtils.numericToInetAddress(s).getHostAddress());          } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 654513400e64..6bc1c9ce550e 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1729,16 +1729,19 @@ public final class ActivityStackSupervisor implements DisplayListener {                          | (baseIntent.getFlags()&flagsOfInterest);                  intent.setFlags(launchFlags);                  inTask.setIntent(r); +                addingToTask = true; -            // If the task is not empty, then we are going to add the new activity on top -            // of the task, so it can not be launching as a new task. +            // If the task is not empty and the caller is asking to start it as the root +            // of a new task, then we don't actually want to start this on the task.  We +            // will bring the task to the front, and possibly give it a new intent.              } else if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { -                ActivityOptions.abort(options); -                throw new IllegalStateException("Caller has inTask " + inTask -                        + " but target is a new task"); +                addingToTask = false; + +            } else { +                addingToTask = true;              } +              reuseTask = inTask; -            addingToTask = true;          } else {              inTask = null;          } @@ -1979,7 +1982,7 @@ public final class ActivityStackSupervisor implements DisplayListener {                  sourceRecord.task : null;          // Should this be considered a new task? -        if (r.resultTo == null && !addingToTask +        if (r.resultTo == null && inTask == null && !addingToTask                  && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {              if (isLockTaskModeViolation(reuseTask)) {                  Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); @@ -2092,6 +2095,13 @@ public final class ActivityStackSupervisor implements DisplayListener {                  }              } +            if (!addingToTask) { +                // We don't actually want to have this activity added to the task, so just +                // stop here but still tell the caller that we consumed the intent. +                ActivityOptions.abort(options); +                return ActivityManager.START_TASK_TO_FRONT; +            } +              r.setTask(inTask, null);              if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r                      + " in explicit task " + r.task); diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 1fd114ce5a5e..7c303ffb2bfe 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -31,6 +31,7 @@ import android.net.INetworkStatsService;  import android.net.InterfaceConfiguration;  import android.net.LinkAddress;  import android.net.LinkProperties; +import android.net.Network;  import android.net.NetworkInfo;  import android.net.NetworkUtils;  import android.net.RouteInfo; @@ -56,6 +57,7 @@ import java.io.PrintWriter;  import java.net.InetAddress;  import java.net.Inet4Address;  import java.util.ArrayList; +import java.util.Arrays;  import java.util.Collection;  import java.util.HashMap;  import java.util.Iterator; @@ -742,7 +744,7 @@ public class Tethering extends BaseNetworkObserver {          static final int CMD_IP_FORWARDING_ENABLE_ERROR  =  7;          // notification from the master SM that it had trouble disabling IP Forwarding          static final int CMD_IP_FORWARDING_DISABLE_ERROR =  8; -        // notification from the master SM that it had trouble staring tethering +        // notification from the master SM that it had trouble starting tethering          static final int CMD_START_TETHERING_ERROR       =  9;          // notification from the master SM that it had trouble stopping tethering          static final int CMD_STOP_TETHERING_ERROR        = 10; @@ -1235,12 +1237,6 @@ public class Tethering extends BaseNetworkObserver {                          return false;                      }                  } -                try { -                    mNMService.setDnsForwarders(mDefaultDnsServers); -                } catch (Exception e) { -                    transitionTo(mSetDnsForwardersErrorState); -                    return false; -                }                  return true;              }              protected boolean turnOffMasterTetherSettings() { @@ -1348,8 +1344,17 @@ public class Tethering extends BaseNetworkObserver {                              }                          }                          try { -                            mNMService.setDnsForwarders(dnsServers); +                            Network network = getConnectivityManager().getNetworkForType(upType); +                            if (network == null) { +                                Log.e(TAG, "No Network for upstream type " + upType + "!"); +                            } +                            if (VDBG) { +                                Log.d(TAG, "Setting DNS forwarders: Network=" + network + +                                       ", dnsServers=" + Arrays.toString(dnsServers)); +                            } +                            mNMService.setDnsForwarders(network, dnsServers);                          } catch (Exception e) { +                            Log.e(TAG, "Setting DNS forwarders failed!");                              transitionTo(mSetDnsForwardersErrorState);                          }                      } diff --git a/services/core/java/com/android/server/location/GpsLocationProvider.java b/services/core/java/com/android/server/location/GpsLocationProvider.java index 753ae39e3d44..2ef9828d5af3 100644 --- a/services/core/java/com/android/server/location/GpsLocationProvider.java +++ b/services/core/java/com/android/server/location/GpsLocationProvider.java @@ -22,6 +22,7 @@ import com.android.internal.location.GpsNetInitiatedHandler;  import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification;  import com.android.internal.location.ProviderProperties;  import com.android.internal.location.ProviderRequest; +import com.android.internal.R;  import com.android.internal.telephony.Phone;  import com.android.internal.telephony.PhoneConstants; @@ -76,6 +77,7 @@ import android.text.TextUtils;  import android.util.Log;  import android.util.NtpTrustedTime; +import java.io.ByteArrayOutputStream;  import java.io.File;  import java.io.FileDescriptor;  import java.io.FileInputStream; @@ -138,7 +140,7 @@ public class GpsLocationProvider implements LocationProviderInterface {      private static final int LOCATION_HAS_BEARING = 8;      private static final int LOCATION_HAS_ACCURACY = 16; -// IMPORTANT - the GPS_DELETE_* symbols here must match constants in gps.h +    // IMPORTANT - the GPS_DELETE_* symbols here must match constants in gps.h      private static final int GPS_DELETE_EPHEMERIS = 0x0001;      private static final int GPS_DELETE_ALMANAC = 0x0002;      private static final int GPS_DELETE_POSITION = 0x0004; @@ -367,6 +369,10 @@ public class GpsLocationProvider implements LocationProviderInterface {      // Alarms      private final static String ALARM_WAKEUP = "com.android.internal.location.ALARM_WAKEUP";      private final static String ALARM_TIMEOUT = "com.android.internal.location.ALARM_TIMEOUT"; + +    // SIM/Carrier info. +    private final static String SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED"; +      private final PowerManager mPowerManager;      private final AlarmManager mAlarmManager;      private final PendingIntent mWakeupIntent; @@ -443,7 +449,7 @@ public class GpsLocationProvider implements LocationProviderInterface {          return mGpsNavigationMessageProvider;      } -    private final BroadcastReceiver mBroadcastReciever = new BroadcastReceiver() { +    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {          @Override public void onReceive(Context context, Intent intent) {              String action = intent.getAction(); @@ -477,6 +483,19 @@ public class GpsLocationProvider implements LocationProviderInterface {                      || Intent.ACTION_SCREEN_OFF.equals(action)                      || Intent.ACTION_SCREEN_ON.equals(action)) {                  updateLowPowerMode(); +            } else if (action.equals(SIM_STATE_CHANGED)) { +                TelephonyManager phone = (TelephonyManager) +                        mContext.getSystemService(Context.TELEPHONY_SERVICE); +                int simState = phone.getSimState(); +                Log.d(TAG, "SIM STATE CHANGED to " + simState); +                String mccMnc = phone.getSimOperator(); +                if (simState == TelephonyManager.SIM_STATE_READY && +                    !TextUtils.isEmpty(mccMnc)) { +                    Log.d(TAG, "SIM STATE is ready, SIM MCC/MNC is " + mccMnc); +                    synchronized (mLock) { +                        reloadGpsProperties(context, mProperties); +                    } +                }              }          }      }; @@ -514,37 +533,73 @@ public class GpsLocationProvider implements LocationProviderInterface {          return native_is_supported();      } -    private boolean loadPropertiesFile(String filename) { -        mProperties = new Properties(); +    private void reloadGpsProperties(Context context, Properties properties) { +        Log.d(TAG, "Reset GPS properties, previous size = " + properties.size()); +        loadPropertiesFromResource(context, properties); +        boolean isPropertiesLoadedFromFile = false; +        final String gpsHardware = SystemProperties.get("ro.hardware.gps"); +        if (!TextUtils.isEmpty(gpsHardware)) { +            final String propFilename = +                    PROPERTIES_FILE_PREFIX + "." + gpsHardware + PROPERTIES_FILE_SUFFIX; +            isPropertiesLoadedFromFile = +                    loadPropertiesFromFile(propFilename, properties); +        } +        if (!isPropertiesLoadedFromFile) { +            loadPropertiesFromFile(DEFAULT_PROPERTIES_FILE, properties); +        } +        Log.d(TAG, "GPS properties reloaded, size = " + properties.size()); + +        // TODO: we should get rid of C2K specific setting. +        setSuplHostPort(properties.getProperty("SUPL_HOST"), +                        properties.getProperty("SUPL_PORT")); +        mC2KServerHost = properties.getProperty("C2K_HOST"); +        String portString = properties.getProperty("C2K_PORT"); +        if (mC2KServerHost != null && portString != null) { +            try { +                mC2KServerPort = Integer.parseInt(portString); +            } catch (NumberFormatException e) { +                Log.e(TAG, "unable to parse C2K_PORT: " + portString); +            } +        } + +        try { +            // Convert properties to string contents and send it to HAL. +            ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); +            properties.store(baos, null); +            native_configuration_update(baos.toString()); +            Log.d(TAG, "final config = " + baos.toString()); +        } catch (IOException ex) { +            Log.w(TAG, "failed to dump properties contents"); +        } +    } + +    private void loadPropertiesFromResource(Context context, +                                            Properties properties) { +        String[] configValues = context.getResources().getStringArray( +                com.android.internal.R.array.config_gpsParameters); +        for (String item : configValues) { +            Log.d(TAG, "GpsParamsResource: " + item); +            String[] split = item.split("="); +            if (split.length == 2) { +                properties.setProperty(split[0].trim().toUpperCase(), split[1]); +            } else { +                Log.w(TAG, "malformed contents: " + item); +            } +        } +    } + +    private boolean loadPropertiesFromFile(String filename, +                                           Properties properties) {          try {              File file = new File(filename);              FileInputStream stream = null;              try {                  stream = new FileInputStream(file); -                mProperties.load(stream); +                properties.load(stream);              } finally {                  IoUtils.closeQuietly(stream);              } -            mSuplServerHost = mProperties.getProperty("SUPL_HOST"); -            String portString = mProperties.getProperty("SUPL_PORT"); -            if (mSuplServerHost != null && portString != null) { -                try { -                    mSuplServerPort = Integer.parseInt(portString); -                } catch (NumberFormatException e) { -                    Log.e(TAG, "unable to parse SUPL_PORT: " + portString); -                } -            } - -            mC2KServerHost = mProperties.getProperty("C2K_HOST"); -            portString = mProperties.getProperty("C2K_PORT"); -            if (mC2KServerHost != null && portString != null) { -                try { -                    mC2KServerPort = Integer.parseInt(portString); -                } catch (NumberFormatException e) { -                    Log.e(TAG, "unable to parse C2K_PORT: " + portString); -                } -            }          } catch (IOException e) {              Log.w(TAG, "Could not open GPS configuration file " + filename);              return false; @@ -580,16 +635,9 @@ public class GpsLocationProvider implements LocationProviderInterface {          mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(                  BatteryStats.SERVICE_NAME)); -        boolean propertiesLoaded = false; -        final String gpsHardware = SystemProperties.get("ro.hardware.gps"); -        if (!TextUtils.isEmpty(gpsHardware)) { -            final String propFilename = PROPERTIES_FILE_PREFIX + "." + gpsHardware + PROPERTIES_FILE_SUFFIX; -            propertiesLoaded = loadPropertiesFile(propFilename); -        } - -        if (!propertiesLoaded) { -            loadPropertiesFile(DEFAULT_PROPERTIES_FILE); -        } +        // Load GPS configuration. +        mProperties = new Properties(); +        reloadGpsProperties(mContext, mProperties);          // construct handler, listen for events          mHandler = new ProviderHandler(looper); @@ -625,7 +673,7 @@ public class GpsLocationProvider implements LocationProviderInterface {          intentFilter.addAction(Intents.DATA_SMS_RECEIVED_ACTION);          intentFilter.addDataScheme("sms");          intentFilter.addDataAuthority("localhost","7275"); -        mContext.registerReceiver(mBroadcastReciever, intentFilter, null, mHandler); +        mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler);          intentFilter = new IntentFilter();          intentFilter.addAction(Intents.WAP_PUSH_RECEIVED_ACTION); @@ -634,7 +682,7 @@ public class GpsLocationProvider implements LocationProviderInterface {          } catch (IntentFilter.MalformedMimeTypeException e) {              Log.w(TAG, "Malformed SUPL init mime type");          } -        mContext.registerReceiver(mBroadcastReciever, intentFilter, null, mHandler); +        mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler);          intentFilter = new IntentFilter();          intentFilter.addAction(ALARM_WAKEUP); @@ -643,7 +691,9 @@ public class GpsLocationProvider implements LocationProviderInterface {          intentFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);          intentFilter.addAction(Intent.ACTION_SCREEN_OFF);          intentFilter.addAction(Intent.ACTION_SCREEN_ON); -        mContext.registerReceiver(mBroadcastReciever, intentFilter, null, mHandler); +        intentFilter = new IntentFilter(); +        intentFilter.addAction(SIM_STATE_CHANGED); +        mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler);      }      /** @@ -844,6 +894,19 @@ public class GpsLocationProvider implements LocationProviderInterface {          sendMessage(ENABLE, 1, null);      } +    private void setSuplHostPort(String hostString, String portString) { +        if (hostString != null) { +            mSuplServerHost = hostString; +        } +        if (portString != null) { +            try { +                mSuplServerPort = Integer.parseInt(portString); +            } catch (NumberFormatException e) { +                Log.e(TAG, "unable to parse SUPL_PORT: " + portString); +            } +        } +    } +      private void handleEnable() {          if (DEBUG) Log.d(TAG, "handleEnable"); @@ -2055,5 +2118,8 @@ public class GpsLocationProvider implements LocationProviderInterface {      private static native boolean native_is_navigation_message_supported();      private native boolean native_start_navigation_message_collection();      private native boolean native_stop_navigation_message_collection(); + +    // GNSS Configuration +    private static native void native_configuration_update(String configData);  } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5aa029446d8b..9554afac73d7 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3035,115 +3035,125 @@ public class PackageManagerService extends IPackageManager.Stub {                              (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId)                      : null;              if (prefs != null && prefs.size() > 0) { -                // First figure out how good the original match set is. -                // We will only allow preferred activities that came -                // from the same match quality. -                int match = 0; +                boolean changed = false; +                try { +                    // First figure out how good the original match set is. +                    // We will only allow preferred activities that came +                    // from the same match quality. +                    int match = 0; -                if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Figuring out best match..."); +                    if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Figuring out best match..."); -                final int N = query.size(); -                for (int j=0; j<N; j++) { -                    final ResolveInfo ri = query.get(j); -                    if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Match for " + ri.activityInfo -                            + ": 0x" + Integer.toHexString(match)); -                    if (ri.match > match) { -                        match = ri.match; +                    final int N = query.size(); +                    for (int j=0; j<N; j++) { +                        final ResolveInfo ri = query.get(j); +                        if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Match for " + ri.activityInfo +                                + ": 0x" + Integer.toHexString(match)); +                        if (ri.match > match) { +                            match = ri.match; +                        }                      } -                } -                if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Best match: 0x" -                        + Integer.toHexString(match)); +                    if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Best match: 0x" +                            + Integer.toHexString(match)); -                match &= IntentFilter.MATCH_CATEGORY_MASK; -                final int M = prefs.size(); -                for (int i=0; i<M; i++) { -                    final PreferredActivity pa = prefs.get(i); -                    if (DEBUG_PREFERRED || debug) { -                        Slog.v(TAG, "Checking PreferredActivity ds=" -                                + (pa.countDataSchemes() > 0 ? pa.getDataScheme(0) : "<none>") -                                + "\n  component=" + pa.mPref.mComponent); -                        pa.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), "  "); -                    } -                    if (pa.mPref.mMatch != match) { -                        if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Skipping bad match " -                                + Integer.toHexString(pa.mPref.mMatch)); -                        continue; -                    } -                    // If it's not an "always" type preferred activity and that's what we're -                    // looking for, skip it. -                    if (always && !pa.mPref.mAlways) { -                        if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Skipping mAlways=false entry"); -                        continue; -                    } -                    final ActivityInfo ai = getActivityInfo(pa.mPref.mComponent, -                            flags | PackageManager.GET_DISABLED_COMPONENTS, userId); -                    if (DEBUG_PREFERRED || debug) { -                        Slog.v(TAG, "Found preferred activity:"); -                        if (ai != null) { -                            ai.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), "  "); -                        } else { -                            Slog.v(TAG, "  null"); +                    match &= IntentFilter.MATCH_CATEGORY_MASK; +                    final int M = prefs.size(); +                    for (int i=0; i<M; i++) { +                        final PreferredActivity pa = prefs.get(i); +                        if (DEBUG_PREFERRED || debug) { +                            Slog.v(TAG, "Checking PreferredActivity ds=" +                                    + (pa.countDataSchemes() > 0 ? pa.getDataScheme(0) : "<none>") +                                    + "\n  component=" + pa.mPref.mComponent); +                            pa.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), "  ");                          } -                    } -                    if (ai == null) { -                        // This previously registered preferred activity -                        // component is no longer known.  Most likely an update -                        // to the app was installed and in the new version this -                        // component no longer exists.  Clean it up by removing -                        // it from the preferred activities list, and skip it. -                        Slog.w(TAG, "Removing dangling preferred activity: " -                                + pa.mPref.mComponent); -                        pir.removeFilter(pa); -                        continue; -                    } -                    for (int j=0; j<N; j++) { -                        final ResolveInfo ri = query.get(j); -                        if (!ri.activityInfo.applicationInfo.packageName -                                .equals(ai.applicationInfo.packageName)) { +                        if (pa.mPref.mMatch != match) { +                            if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Skipping bad match " +                                    + Integer.toHexString(pa.mPref.mMatch));                              continue;                          } -                        if (!ri.activityInfo.name.equals(ai.name)) { +                        // If it's not an "always" type preferred activity and that's what we're +                        // looking for, skip it. +                        if (always && !pa.mPref.mAlways) { +                            if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Skipping mAlways=false entry");                              continue;                          } - -                        if (removeMatches) { -                            pir.removeFilter(pa); -                            if (DEBUG_PREFERRED) { -                                Slog.v(TAG, "Removing match " + pa.mPref.mComponent); +                        final ActivityInfo ai = getActivityInfo(pa.mPref.mComponent, +                                flags | PackageManager.GET_DISABLED_COMPONENTS, userId); +                        if (DEBUG_PREFERRED || debug) { +                            Slog.v(TAG, "Found preferred activity:"); +                            if (ai != null) { +                                ai.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), "  "); +                            } else { +                                Slog.v(TAG, "  null");                              } -                            break;                          } - -                        // Okay we found a previously set preferred or last chosen app. -                        // If the result set is different from when this -                        // was created, we need to clear it and re-ask the -                        // user their preference, if we're looking for an "always" type entry. -                        if (always && !pa.mPref.sameSet(query, priority)) { -                            Slog.i(TAG, "Result set changed, dropping preferred activity for " -                                    + intent + " type " + resolvedType); -                            if (DEBUG_PREFERRED) { -                                Slog.v(TAG, "Removing preferred activity since set changed " -                                        + pa.mPref.mComponent); -                            } +                        if (ai == null) { +                            // This previously registered preferred activity +                            // component is no longer known.  Most likely an update +                            // to the app was installed and in the new version this +                            // component no longer exists.  Clean it up by removing +                            // it from the preferred activities list, and skip it. +                            Slog.w(TAG, "Removing dangling preferred activity: " +                                    + pa.mPref.mComponent);                              pir.removeFilter(pa); -                            // Re-add the filter as a "last chosen" entry (!always) -                            PreferredActivity lastChosen = new PreferredActivity( -                                    pa, pa.mPref.mMatch, null, pa.mPref.mComponent, false); -                            pir.addFilter(lastChosen); -                            mSettings.writePackageRestrictionsLPr(userId); -                            return null; +                            changed = true; +                            continue;                          } +                        for (int j=0; j<N; j++) { +                            final ResolveInfo ri = query.get(j); +                            if (!ri.activityInfo.applicationInfo.packageName +                                    .equals(ai.applicationInfo.packageName)) { +                                continue; +                            } +                            if (!ri.activityInfo.name.equals(ai.name)) { +                                continue; +                            } -                        // Yay! Either the set matched or we're looking for the last chosen -                        if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Returning preferred activity: " -                                + ri.activityInfo.packageName + "/" + ri.activityInfo.name); +                            if (removeMatches) { +                                pir.removeFilter(pa); +                                changed = true; +                                if (DEBUG_PREFERRED) { +                                    Slog.v(TAG, "Removing match " + pa.mPref.mComponent); +                                } +                                break; +                            } + +                            // Okay we found a previously set preferred or last chosen app. +                            // If the result set is different from when this +                            // was created, we need to clear it and re-ask the +                            // user their preference, if we're looking for an "always" type entry. +                            if (always && !pa.mPref.sameSet(query, priority)) { +                                Slog.i(TAG, "Result set changed, dropping preferred activity for " +                                        + intent + " type " + resolvedType); +                                if (DEBUG_PREFERRED) { +                                    Slog.v(TAG, "Removing preferred activity since set changed " +                                            + pa.mPref.mComponent); +                                } +                                pir.removeFilter(pa); +                                // Re-add the filter as a "last chosen" entry (!always) +                                PreferredActivity lastChosen = new PreferredActivity( +                                        pa, pa.mPref.mMatch, null, pa.mPref.mComponent, false); +                                pir.addFilter(lastChosen); +                                changed = true; +                                return null; +                            } + +                            // Yay! Either the set matched or we're looking for the last chosen +                            if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Returning preferred activity: " +                                    + ri.activityInfo.packageName + "/" + ri.activityInfo.name); +                            return ri; +                        } +                    } +                } finally { +                    if (changed) { +                        if (DEBUG_PREFERRED) { +                            Slog.v(TAG, "Preferred activity bookkeeping changed; writing restrictions"); +                        }                          mSettings.writePackageRestrictionsLPr(userId); -                        return ri;                      }                  }              } -            mSettings.writePackageRestrictionsLPr(userId);          }          if (DEBUG_PREFERRED || debug) Slog.v(TAG, "No preferred activity to return");          return null; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0a0124701963..08343d81716e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -11398,7 +11398,8 @@ public class WindowManagerService extends IWindowManager.Stub                  final WindowList windows = getDefaultWindowListLocked();                  for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {                      final WindowState win = windows.get(winNdx); -                    if (win.mHasSurface && win.mAppToken != null) { +                    if (win.mHasSurface +                            && (win.mAppToken != null || mPolicy.isForceHiding(win.mAttrs))) {                          win.mWinAnimator.mDrawState = WindowStateAnimator.DRAW_PENDING;                          // Force add to mResizingWindows.                          win.mLastContentInsets.set(-1, -1, -1, -1); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 4b7dd088f40e..3d4be1246916 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -524,6 +524,7 @@ class WindowStateAnimator {          private boolean mShown = false;          private int mLayerStack;          private boolean mIsOpaque; +        private float mDsdx, mDtdx, mDsdy, mDtdy;          private final String mName;          public SurfaceTrace(SurfaceSession s, @@ -619,6 +620,19 @@ class WindowStateAnimator {          }          @Override +        public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) { +            if (dsdx != mDsdx || dtdx != mDtdx || dsdy != mDsdy || dtdy != mDtdy) { +                Slog.v(SURFACE_TAG, "setMatrix(" + dsdx + "," + dtdx + "," + dsdy + "," + dtdy + +                        "): OLD:" + this + ". Called by " + Debug.getCallers(3)); +                mDsdx = dsdx; +                mDtdx = dtdx; +                mDsdy = dsdy; +                mDtdy = dtdy; +            } +            super.setMatrix(dsdx, dtdx, dsdy, dtdy); +        } + +        @Override          public void hide() {              if (mShown) {                  Slog.v(SURFACE_TAG, "hide: OLD:" + this + ". Called by " + Debug.getCallers(3)); @@ -665,7 +679,8 @@ class WindowStateAnimator {                      + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y                      + " " + mSize.x + "x" + mSize.y                      + " crop=" + mWindowCrop.toShortString() -                    + " opaque=" + mIsOpaque; +                    + " opaque=" + mIsOpaque +                    + " (" + mDsdx + "," + mDtdx + "," + mDsdy + "," + mDtdy + ")";          }      } @@ -1068,6 +1083,14 @@ class WindowStateAnimator {                      mShownAlpha *= appTransformation.getAlpha();                      if (appTransformation.hasClipRect()) {                          mClipRect.set(appTransformation.getClipRect()); +                        if (mWin.mHScale > 0) { +                            mClipRect.left /= mWin.mHScale; +                            mClipRect.right /= mWin.mHScale; +                        } +                        if (mWin.mVScale > 0) { +                            mClipRect.top /= mWin.mVScale; +                            mClipRect.bottom /= mWin.mVScale; +                        }                          mHasClipRect = true;                      }                  } @@ -1418,10 +1441,10 @@ class WindowStateAnimator {              w.mLastVScale = w.mVScale;              if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w,                      "alpha=" + mShownAlpha + " layer=" + mAnimLayer -                    + " matrix=[" + (mDsDx*w.mHScale) -                    + "," + (mDtDx*w.mVScale) -                    + "][" + (mDsDy*w.mHScale) -                    + "," + (mDtDy*w.mVScale) + "]", null); +                    + " matrix=[" + mDsDx + "*" + w.mHScale +                    + "," + mDtDx + "*" + w.mVScale +                    + "][" + mDsDy + "*" + w.mHScale +                    + "," + mDtDy + "*" + w.mVScale + "]", null);              if (mSurfaceControl != null) {                  try {                      mSurfaceAlpha = mShownAlpha; diff --git a/services/core/jni/com_android_server_location_GpsLocationProvider.cpp b/services/core/jni/com_android_server_location_GpsLocationProvider.cpp index c39890806788..695808740592 100644 --- a/services/core/jni/com_android_server_location_GpsLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GpsLocationProvider.cpp @@ -65,6 +65,7 @@ static const AGpsRilInterface* sAGpsRilInterface = NULL;  static const GpsGeofencingInterface* sGpsGeofencingInterface = NULL;  static const GpsMeasurementInterface* sGpsMeasurementInterface = NULL;  static const GpsNavigationMessageInterface* sGpsNavigationMessageInterface = NULL; +static const GnssConfigurationInterface* sGnssConfigurationInterface = NULL;  // temporary storage for GPS callbacks  static GpsSvStatus  sGpsSvStatus; @@ -502,6 +503,9 @@ static void android_location_GpsLocationProvider_class_init_native(JNIEnv* env,          sGpsNavigationMessageInterface =              (const GpsNavigationMessageInterface*)sGpsInterface->get_extension(                      GPS_NAVIGATION_MESSAGE_INTERFACE); +        sGnssConfigurationInterface = +            (const GnssConfigurationInterface*)sGpsInterface->get_extension( +                    GNSS_CONFIGURATION_INTERFACE);      }  } @@ -901,55 +905,57 @@ static jobject translate_gps_clock(JNIEnv* env, GpsClock* clock) {      if (flags & GPS_CLOCK_HAS_LEAP_SECOND) {          jmethodID setterMethod = env->GetMethodID(gpsClockClass, "setLeapSecond", "(S)V"); -        env->CallObjectMethod(gpsClockObject, setterMethod, clock->leap_second); +        env->CallVoidMethod(gpsClockObject, setterMethod, clock->leap_second);     }     jmethodID typeSetterMethod = env->GetMethodID(gpsClockClass, "setType", "(B)V"); -   env->CallObjectMethod(gpsClockObject, typeSetterMethod, clock->type); +   env->CallVoidMethod(gpsClockObject, typeSetterMethod, clock->type);      jmethodID setterMethod = env->GetMethodID(gpsClockClass, "setTimeInNs", longSignature); -    env->CallObjectMethod(gpsClockObject, setterMethod, clock->time_ns); +    env->CallVoidMethod(gpsClockObject, setterMethod, clock->time_ns);      if (flags & GPS_CLOCK_HAS_TIME_UNCERTAINTY) {          jmethodID setterMethod =                  env->GetMethodID(gpsClockClass, "setTimeUncertaintyInNs", doubleSignature); -        env->CallObjectMethod(gpsClockObject, setterMethod, clock->time_uncertainty_ns); +        env->CallVoidMethod(gpsClockObject, setterMethod, clock->time_uncertainty_ns);      }      if (flags & GPS_CLOCK_HAS_FULL_BIAS) {          jmethodID setterMethod = env->GetMethodID(gpsClockClass, "setFullBiasInNs", longSignature); -        env->CallObjectMethod(gpsClockObject, setterMethod, clock->full_bias_ns); +        env->CallVoidMethod(gpsClockObject, setterMethod, clock->full_bias_ns);      }      if (flags & GPS_CLOCK_HAS_BIAS) {          jmethodID setterMethod = env->GetMethodID(gpsClockClass, "setBiasInNs", doubleSignature); -        env->CallObjectMethod(gpsClockObject, setterMethod, clock->bias_ns); +        env->CallVoidMethod(gpsClockObject, setterMethod, clock->bias_ns);      }      if (flags & GPS_CLOCK_HAS_BIAS_UNCERTAINTY) {          jmethodID setterMethod =                  env->GetMethodID(gpsClockClass, "setBiasUncertaintyInNs", doubleSignature); -        env->CallObjectMethod(gpsClockObject, setterMethod, clock->bias_uncertainty_ns); +        env->CallVoidMethod(gpsClockObject, setterMethod, clock->bias_uncertainty_ns);      }      if (flags & GPS_CLOCK_HAS_DRIFT) {          jmethodID setterMethod =                  env->GetMethodID(gpsClockClass, "setDriftInNsPerSec", doubleSignature); -        env->CallObjectMethod(gpsClockObject, setterMethod, clock->drift_nsps); +        env->CallVoidMethod(gpsClockObject, setterMethod, clock->drift_nsps);      }      if (flags & GPS_CLOCK_HAS_DRIFT_UNCERTAINTY) {          jmethodID setterMethod =                  env->GetMethodID(gpsClockClass, "setDriftUncertaintyInNsPerSec", doubleSignature); -        env->CallObjectMethod(gpsClockObject, setterMethod, clock->drift_uncertainty_nsps); +        env->CallVoidMethod(gpsClockObject, setterMethod, clock->drift_uncertainty_nsps);      } +    env->DeleteLocalRef(gpsClockClass);      return gpsClockObject;  }  static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measurement) {      const char* byteSignature = "(B)V";      const char* shortSignature = "(S)V"; +    const char* intSignature = "(I)V";      const char* longSignature = "(J)V";      const char* floatSignature = "(F)V";      const char* doubleSignature = "(D)V"; @@ -961,21 +967,21 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      GpsMeasurementFlags flags = measurement->flags;      jmethodID prnSetterMethod = env->GetMethodID(gpsMeasurementClass, "setPrn", byteSignature); -    env->CallObjectMethod(gpsMeasurementObject, prnSetterMethod, measurement->prn); +    env->CallVoidMethod(gpsMeasurementObject, prnSetterMethod, measurement->prn);      jmethodID timeOffsetSetterMethod =              env->GetMethodID(gpsMeasurementClass, "setTimeOffsetInNs", doubleSignature); -    env->CallObjectMethod( +    env->CallVoidMethod(              gpsMeasurementObject,              timeOffsetSetterMethod,              measurement->time_offset_ns);      jmethodID stateSetterMethod = env->GetMethodID(gpsMeasurementClass, "setState", shortSignature); -    env->CallObjectMethod(gpsMeasurementObject, stateSetterMethod, measurement->state); +    env->CallVoidMethod(gpsMeasurementObject, stateSetterMethod, measurement->state);      jmethodID receivedGpsTowSetterMethod =              env->GetMethodID(gpsMeasurementClass, "setReceivedGpsTowInNs", longSignature); -    env->CallObjectMethod( +    env->CallVoidMethod(              gpsMeasurementObject,              receivedGpsTowSetterMethod,              measurement->received_gps_tow_ns); @@ -991,13 +997,13 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      jmethodID cn0SetterMethod =              env->GetMethodID(gpsMeasurementClass, "setCn0InDbHz", doubleSignature); -    env->CallObjectMethod(gpsMeasurementObject, cn0SetterMethod, measurement->c_n0_dbhz); +    env->CallVoidMethod(gpsMeasurementObject, cn0SetterMethod, measurement->c_n0_dbhz);      jmethodID pseudorangeRateSetterMethod = env->GetMethodID(              gpsMeasurementClass,              "setPseudorangeRateInMetersPerSec",              doubleSignature); -    env->CallObjectMethod( +    env->CallVoidMethod(              gpsMeasurementObject,              pseudorangeRateSetterMethod,              measurement->pseudorange_rate_mps); @@ -1006,14 +1012,14 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen              gpsMeasurementClass,              "setPseudorangeRateUncertaintyInMetersPerSec",              doubleSignature); -    env->CallObjectMethod( +    env->CallVoidMethod(              gpsMeasurementObject,              pseudorangeRateUncertaintySetterMethod,              measurement->pseudorange_rate_uncertainty_mps);      jmethodID accumulatedDeltaRangeStateSetterMethod =              env->GetMethodID(gpsMeasurementClass, "setAccumulatedDeltaRangeState", shortSignature); -    env->CallObjectMethod( +    env->CallVoidMethod(              gpsMeasurementObject,              accumulatedDeltaRangeStateSetterMethod,              measurement->accumulated_delta_range_state); @@ -1039,7 +1045,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      if (flags & GPS_MEASUREMENT_HAS_PSEUDORANGE) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setPseudorangeInMeters", doubleSignature); -        env->CallObjectMethod(gpsMeasurementObject, setterMethod, measurement->pseudorange_m); +        env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->pseudorange_m);      }      if (flags & GPS_MEASUREMENT_HAS_PSEUDORANGE_UNCERTAINTY) { @@ -1047,7 +1053,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen                  gpsMeasurementClass,                  "setPseudorangeUncertaintyInMeters",                  doubleSignature); -        env->CallObjectMethod( +        env->CallVoidMethod(                  gpsMeasurementObject,                  setterMethod,                  measurement->pseudorange_uncertainty_m); @@ -1056,7 +1062,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      if (flags & GPS_MEASUREMENT_HAS_CODE_PHASE) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setCodePhaseInChips", doubleSignature); -        env->CallObjectMethod(gpsMeasurementObject, setterMethod, measurement->code_phase_chips); +        env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->code_phase_chips);      }      if (flags & GPS_MEASUREMENT_HAS_CODE_PHASE_UNCERTAINTY) { @@ -1064,7 +1070,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen                  gpsMeasurementClass,                  "setCodePhaseUncertaintyInChips",                  doubleSignature); -        env->CallObjectMethod( +        env->CallVoidMethod(                  gpsMeasurementObject,                  setterMethod,                  measurement->code_phase_uncertainty_chips); @@ -1073,7 +1079,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      if (flags & GPS_MEASUREMENT_HAS_CARRIER_FREQUENCY) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setCarrierFrequencyInHz", floatSignature); -        env->CallObjectMethod( +        env->CallVoidMethod(                  gpsMeasurementObject,                  setterMethod,                  measurement->carrier_frequency_hz); @@ -1082,13 +1088,13 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      if (flags & GPS_MEASUREMENT_HAS_CARRIER_CYCLES) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setCarrierCycles", longSignature); -        env->CallObjectMethod(gpsMeasurementObject, setterMethod, measurement->carrier_cycles); +        env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->carrier_cycles);      }      if (flags & GPS_MEASUREMENT_HAS_CARRIER_PHASE) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setCarrierPhase", doubleSignature); -        env->CallObjectMethod(gpsMeasurementObject, setterMethod, measurement->carrier_phase); +        env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->carrier_phase);      }      if (flags & GPS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY) { @@ -1096,7 +1102,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen                  gpsMeasurementClass,                  "setCarrierPhaseUncertainty",                  doubleSignature); -        env->CallObjectMethod( +        env->CallVoidMethod(                  gpsMeasurementObject,                  setterMethod,                  measurement->carrier_phase_uncertainty); @@ -1104,18 +1110,18 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      jmethodID lossOfLockSetterMethod =              env->GetMethodID(gpsMeasurementClass, "setLossOfLock", byteSignature); -    env->CallObjectMethod(gpsMeasurementObject, lossOfLockSetterMethod, measurement->loss_of_lock); +    env->CallVoidMethod(gpsMeasurementObject, lossOfLockSetterMethod, measurement->loss_of_lock);      if (flags & GPS_MEASUREMENT_HAS_BIT_NUMBER) {          jmethodID setterMethod = -                env->GetMethodID(gpsMeasurementClass, "setBitNumber", shortSignature); -        env->CallObjectMethod(gpsMeasurementObject, setterMethod, measurement->bit_number); +                env->GetMethodID(gpsMeasurementClass, "setBitNumber", intSignature); +        env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->bit_number);      }      if (flags & GPS_MEASUREMENT_HAS_TIME_FROM_LAST_BIT) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setTimeFromLastBitInMs", shortSignature); -        env->CallObjectMethod( +        env->CallVoidMethod(                  gpsMeasurementObject,                  setterMethod,                  measurement->time_from_last_bit_ms); @@ -1124,7 +1130,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      if (flags & GPS_MEASUREMENT_HAS_DOPPLER_SHIFT) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setDopplerShiftInHz", doubleSignature); -        env->CallObjectMethod(gpsMeasurementObject, setterMethod, measurement->doppler_shift_hz); +        env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->doppler_shift_hz);      }      if (flags & GPS_MEASUREMENT_HAS_DOPPLER_SHIFT_UNCERTAINTY) { @@ -1132,7 +1138,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen                  gpsMeasurementClass,                  "setDopplerShiftUncertaintyInHz",                  doubleSignature); -        env->CallObjectMethod( +        env->CallVoidMethod(                  gpsMeasurementObject,                  setterMethod,                  measurement->doppler_shift_uncertainty_hz); @@ -1140,7 +1146,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      jmethodID multipathIndicatorSetterMethod =              env->GetMethodID(gpsMeasurementClass, "setMultipathIndicator", byteSignature); -    env->CallObjectMethod( +    env->CallVoidMethod(              gpsMeasurementObject,              multipathIndicatorSetterMethod,              measurement->multipath_indicator); @@ -1148,19 +1154,19 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      if (flags & GPS_MEASUREMENT_HAS_SNR) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setSnrInDb", doubleSignature); -        env->CallObjectMethod(gpsMeasurementObject, setterMethod, measurement->snr_db); +        env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->snr_db);      }      if (flags & GPS_MEASUREMENT_HAS_ELEVATION) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setElevationInDeg", doubleSignature); -        env->CallObjectMethod(gpsMeasurementObject, setterMethod, measurement->elevation_deg); +        env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->elevation_deg);      }      if (flags & GPS_MEASUREMENT_HAS_ELEVATION_UNCERTAINTY) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setElevationUncertaintyInDeg", doubleSignature); -        env->CallObjectMethod( +        env->CallVoidMethod(                  gpsMeasurementObject,                  setterMethod,                  measurement->elevation_uncertainty_deg); @@ -1169,7 +1175,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen      if (flags & GPS_MEASUREMENT_HAS_AZIMUTH) {          jmethodID setterMethod =                  env->GetMethodID(gpsMeasurementClass, "setAzimuthInDeg", doubleSignature); -        env->CallObjectMethod(gpsMeasurementObject, setterMethod, measurement->azimuth_deg); +        env->CallVoidMethod(gpsMeasurementObject, setterMethod, measurement->azimuth_deg);      }      if (flags & GPS_MEASUREMENT_HAS_AZIMUTH_UNCERTAINTY) { @@ -1177,14 +1183,14 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen                  gpsMeasurementClass,                  "setAzimuthUncertaintyInDeg",                  doubleSignature); -        env->CallObjectMethod( +        env->CallVoidMethod(                  gpsMeasurementObject,                  setterMethod,                  measurement->azimuth_uncertainty_deg);      }      jmethodID usedInFixSetterMethod = env->GetMethodID(gpsMeasurementClass, "setUsedInFix", "(Z)V"); -    env->CallObjectMethod( +    env->CallVoidMethod(              gpsMeasurementObject,              usedInFixSetterMethod,              (flags & GPS_MEASUREMENT_HAS_USED_IN_FIX) && measurement->used_in_fix); @@ -1240,6 +1246,11 @@ static void measurement_callback(GpsData* data) {          env->CallVoidMethod(mCallbacksObj, method_reportMeasurementData, gpsMeasurementsEvent);          checkAndClearExceptionFromCallback(env, __FUNCTION__); + +        env->DeleteLocalRef(gpsClock); +        env->DeleteLocalRef(measurementArray); +        env->DeleteLocalRef(gpsMeasurementsEventClass); +        env->DeleteLocalRef(gpsMeasurementsEvent);      } else {          ALOGE("Invalid GpsData size found in gps_measurement_callback, size=%d", data->size);      } @@ -1318,6 +1329,8 @@ static jobject translate_gps_navigation_message(JNIEnv* env, GpsNavigationMessag      jmethodID setDataMethod = env->GetMethodID(navigationMessageClass, "setData", "([B)V");      env->CallVoidMethod(navigationMessageObject, setDataMethod, dataArray); +    env->DeleteLocalRef(navigationMessageClass); +    env->DeleteLocalRef(dataArray);      return navigationMessageObject;  } @@ -1344,6 +1357,10 @@ static void navigation_message_callback(GpsNavigationMessage* message) {          env->CallVoidMethod(mCallbacksObj, method_reportNavigationMessages, navigationMessageEvent);          checkAndClearExceptionFromCallback(env, __FUNCTION__); + +        env->DeleteLocalRef(navigationMessage); +        env->DeleteLocalRef(navigationMessageEventClass); +        env->DeleteLocalRef(navigationMessageEvent);      } else {          ALOGE("Invalid GpsNavigationMessage size found: %d", message->size);      } @@ -1392,6 +1409,20 @@ static jboolean android_location_GpsLocationProvider_stop_navigation_message_col      return JNI_TRUE;  } +static void android_location_GpsLocationProvider_configuration_update(JNIEnv* env, jobject obj, +        jstring config_content) +{ +    if (!sGnssConfigurationInterface) { +        ALOGE("no GPS configuration interface in configuraiton_update"); +        return; +    } +    const char *data = env->GetStringUTFChars(config_content, NULL); +    ALOGD("GPS configuration:\n %s", data); +    sGnssConfigurationInterface->configuration_update( +            data, env->GetStringUTFLength(config_content)); +    env->ReleaseStringUTFChars(config_content, data); +} +  static JNINativeMethod sMethods[] = {       /* name, signature, funcPtr */      {"class_init_native", "()V", (void *)android_location_GpsLocationProvider_class_init_native}, @@ -1479,6 +1510,9 @@ static JNINativeMethod sMethods[] = {      {"native_stop_navigation_message_collection",              "()Z",              (void*) android_location_GpsLocationProvider_stop_navigation_message_collection}, +    {"native_configuration_update", +            "(Ljava/lang/String;)V", +            (void*)android_location_GpsLocationProvider_configuration_update},  };  int register_android_server_location_GpsLocationProvider(JNIEnv* env) diff --git a/telephony/java/com/android/internal/telephony/IMms.aidl b/telephony/java/com/android/internal/telephony/IMms.aidl index cbcef2556cba..2aeb42f0b019 100644 --- a/telephony/java/com/android/internal/telephony/IMms.aidl +++ b/telephony/java/com/android/internal/telephony/IMms.aidl @@ -19,6 +19,7 @@ package com.android.internal.telephony;  import android.app.PendingIntent;  import android.content.ContentValues;  import android.net.Uri; +import android.os.Bundle;  /**   * Service interface to handle MMS API requests @@ -78,33 +79,11 @@ interface IMms {      void updateMmsDownloadStatus(int messageRef, in byte[] pdu);      /** -     * Get carrier-dependent configuration value as boolean. For example, if multipart SMS -     * is supported. +     * Get carrier-dependent configuration values.       *       * @param subId the SIM id -     * @param name the configuration name -     * @param defaultValue the default value if fail to find the name       */ -    boolean getCarrierConfigBoolean(long subId, String name, boolean defaultValue); - -    /** -     * Get carrier-dependent configuration value as int. For example, the MMS message size limit. -     * -     * @param subId the SIM id -     * @param name the configuration name -     * @param defaultValue the default value if fail to find the name -     */ -    int getCarrierConfigInt(long subId, String name, int defaultValue); - -    /** -     * Get carrier-dependent configuration value as String. For example, extra HTTP headers for -     * MMS request. -     * -     * @param subId the SIM id -     * @param name the configuration name -     * @param defaultValue the default value if fail to find the name -     */ -    String getCarrierConfigString(long subId, String name, String defaultValue); +    Bundle getCarrierConfigValues(long subId);      /**       * Import a text message into system's SMS store  |