summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityThread.java39
-rw-r--r--core/res/res/values-es-rUS/strings.xml30
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java29
-rw-r--r--services/java/com/android/server/am/ProcessRecord.java3
4 files changed, 60 insertions, 41 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 2cd223f..5f2de0f 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4075,6 +4075,9 @@ public final class ActivityThread {
if(prc.count == 0) {
// Schedule the actual remove asynchronously, since we
// don't know the context this will be called in.
+ // TODO: it would be nice to post a delayed message, so
+ // if we come back and need the same provider quickly
+ // we will still have it available.
Message msg = mH.obtainMessage(H.REMOVE_PROVIDER, provider);
mH.sendMessage(msg);
} //end if
@@ -4085,23 +4088,36 @@ public final class ActivityThread {
final void completeRemoveProvider(IContentProvider provider) {
IBinder jBinder = provider.asBinder();
+ String name = null;
synchronized(mProviderMap) {
ProviderRefCount prc = mProviderRefCountMap.get(jBinder);
if(prc != null && prc.count == 0) {
mProviderRefCountMap.remove(jBinder);
//invoke removeProvider to dereference provider
- removeProviderLocked(provider);
+ name = removeProviderLocked(provider);
}
}
+
+ if (name != null) {
+ try {
+ if(localLOGV) Log.v(TAG, "removeProvider::Invoking " +
+ "ActivityManagerNative.removeContentProvider(" + name);
+ ActivityManagerNative.getDefault().removeContentProvider(
+ getApplicationThread(), name);
+ } catch (RemoteException e) {
+ //do nothing content provider object is dead any way
+ } //end catch
+ }
}
- public final void removeProviderLocked(IContentProvider provider) {
+ public final String removeProviderLocked(IContentProvider provider) {
if (provider == null) {
- return;
+ return null;
}
IBinder providerBinder = provider.asBinder();
- boolean amRemoveFlag = false;
+ String name = null;
+
// remove the provider from mProviderMap
Iterator<ProviderRecord> iter = mProviderMap.values().iterator();
while (iter.hasNext()) {
@@ -4111,7 +4127,7 @@ public final class ActivityThread {
//find if its published by this process itself
if(pr.mLocalProvider != null) {
if(localLOGV) Log.i(TAG, "removeProvider::found local provider returning");
- return;
+ return name;
}
if(localLOGV) Log.v(TAG, "removeProvider::Not local provider Unlinking " +
"death recipient");
@@ -4119,18 +4135,13 @@ public final class ActivityThread {
myBinder.unlinkToDeath(pr, 0);
iter.remove();
//invoke remove only once for the very first name seen
- if(!amRemoveFlag) {
- try {
- if(localLOGV) Log.v(TAG, "removeProvider::Invoking " +
- "ActivityManagerNative.removeContentProvider("+pr.mName);
- ActivityManagerNative.getDefault().removeContentProvider(getApplicationThread(), pr.mName);
- amRemoveFlag = true;
- } catch (RemoteException e) {
- //do nothing content provider object is dead any way
- } //end catch
+ if(name == null) {
+ name = pr.mName;
}
} //end if myBinder
} //end while iter
+
+ return name;
}
final void removeDeadProvider(String name, IContentProvider provider) {
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index e3580a6..0bd0469 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -147,10 +147,8 @@
<string name="permgroupdesc_location" msgid="2430258821648348660">"Controla tu ubicación física"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Comunicación de red"</string>
<string name="permgroupdesc_network" msgid="5035763698958415998">"Admite aplicaciones que acceden a varias funciones de red."</string>
- <!-- no translation found for permgrouplab_accounts (3359646291125325519) -->
- <skip />
- <!-- no translation found for permgroupdesc_accounts (4948732641827091312) -->
- <skip />
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"Tus cuentas"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Acceder a las cuentas disponibles."</string>
<string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Controles de hardware"</string>
<string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Acceso directo al hardware en el teléfono."</string>
<string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Llamadas telefónicas"</string>
@@ -455,12 +453,9 @@
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Localizador del trabajo"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Asistente"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
- <!-- no translation found for eventTypeBirthday (2813379844211390740) -->
- <skip />
- <!-- no translation found for eventTypeAnniversary (3876779744518284000) -->
- <skip />
- <!-- no translation found for eventTypeOther (5834288791948564594) -->
- <skip />
+ <string name="eventTypeBirthday" msgid="2813379844211390740">"Cumpleaños"</string>
+ <string name="eventTypeAnniversary" msgid="3876779744518284000">"Aniversario"</string>
+ <string name="eventTypeOther" msgid="5834288791948564594">"Evento"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Personalizado"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Página principal"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Trabajo"</string>
@@ -487,7 +482,8 @@
<string name="orgTypeWork" msgid="29268870505363872">"Trabajo"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Otro"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Personalizado"</string>
- <string name="contact_status_update_attribution" msgid="3903174274739111950">"A través de <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
+ <!-- no translation found for contact_status_update_attribution (5112589886094402795) -->
+ <skip />
<string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> a través de <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
<string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ingresar el código de PIN"</string>
<string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"¡Código de PIN incorrecto!"</string>
@@ -793,12 +789,8 @@
<string name="accessibility_binding_label" msgid="4148120742096474641">"Accesibilidad"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"Papel tapiz"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"Cambiar fondo de pantalla"</string>
- <!-- no translation found for pptp_vpn_description (2688045385181439401) -->
- <skip />
- <!-- no translation found for l2tp_vpn_description (3750692169378923304) -->
- <skip />
- <!-- no translation found for l2tp_ipsec_psk_vpn_description (3945043564008303239) -->
- <skip />
- <!-- no translation found for l2tp_ipsec_crt_vpn_description (5382714073103653577) -->
- <skip />
+ <string name="pptp_vpn_description" msgid="2688045385181439401">"Protocolo de túnel punto a punto"</string>
+ <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protocolo de túnel de nivel 2"</string>
+ <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Clave previamente compartida según L2TP/IPSec VPN"</string>
+ <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certificado según L2TP/IPSec VPN"</string>
</resources>
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 34302b1..c611795 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -7542,8 +7542,13 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
if (DEBUG_PROVIDER) Log.v(TAG,
"Adding provider requested by "
+ r.processName + " from process "
- + cpr.info.processName);
- r.conProviders.add(cpr);
+ + cpr.info.processName);
+ Integer cnt = r.conProviders.get(cpr);
+ if (cnt == null) {
+ r.conProviders.put(cpr, new Integer(1));
+ } else {
+ r.conProviders.put(cpr, new Integer(cnt.intValue()+1));
+ }
cpr.clients.add(r);
} else {
cpr.externals++;
@@ -7648,8 +7653,13 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
if (DEBUG_PROVIDER) Log.v(TAG,
"Adding provider requested by "
+ r.processName + " from process "
- + cpr.info.processName);
- r.conProviders.add(cpr);
+ + cpr.info.processName);
+ Integer cnt = r.conProviders.get(cpr);
+ if (cnt == null) {
+ r.conProviders.put(cpr, new Integer(1));
+ } else {
+ r.conProviders.put(cpr, new Integer(cnt.intValue()+1));
+ }
cpr.clients.add(r);
} else {
cpr.externals++;
@@ -7726,8 +7736,13 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
+ cpr.info.name + " in process " + r.processName);
return;
} else {
- localCpr.clients.remove(r);
- r.conProviders.remove(localCpr);
+ Integer cnt = r.conProviders.get(localCpr);
+ if (cnt == null || cnt.intValue() <= 1) {
+ localCpr.clients.remove(r);
+ r.conProviders.remove(localCpr);
+ } else {
+ r.conProviders.put(localCpr, new Integer(cnt.intValue()-1));
+ }
}
updateOomAdjLocked();
}
@@ -9914,7 +9929,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
// Unregister from connected content providers.
if (!app.conProviders.isEmpty()) {
- Iterator it = app.conProviders.iterator();
+ Iterator it = app.conProviders.keySet().iterator();
while (it.hasNext()) {
ContentProviderRecord cpr = (ContentProviderRecord)it.next();
cpr.clients.remove(app);
diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java
index d05b44b..6202257 100644
--- a/services/java/com/android/server/am/ProcessRecord.java
+++ b/services/java/com/android/server/am/ProcessRecord.java
@@ -94,7 +94,8 @@ class ProcessRecord implements Watchdog.PssRequestor {
// class (String) -> ContentProviderRecord
final HashMap pubProviders = new HashMap();
// All ContentProviderRecord process is using
- final HashSet conProviders = new HashSet();
+ final HashMap<ContentProviderRecord, Integer> conProviders
+ = new HashMap<ContentProviderRecord, Integer>();
boolean persistent; // always keep this application running?
boolean crashing; // are we in the process of crashing?