From 6c3cad57f0dffa65f50c3cf21642bfa867e932b8 Mon Sep 17 00:00:00 2001 From: Tyler Gunn Date: Mon, 1 May 2023 20:27:34 +0000 Subject: Fix issue with late binding to ICS. If a call is added to InCallController and NO bindings take place, Telecom would not track that call in its call id mapper. If one of the disabled ICS becomes enabled later, Telecom would skip binding because it assumes it should only have bound if there is a call present. To fix this, moved the "addCall" invocation to happen all the time in onCallAdded; this ensures that regardless of whether we bind to an ICS we still know about the call if a package enables later on in the call. Test: Added failing unit test and verified that code change fixes it. Test: Manual test by modifying Telecom so that it doesn't do an initial binding; verified that I was able to repro the original bug and that the change fixed it. Fixes: 280309857 Change-Id: I8783b2ce5be4af9e24d6ffa4bca81b23a64e0700 Merged-In: I8783b2ce5be4af9e24d6ffa4bca81b23a64e0700 --- .../android/server/telecom/InCallController.java | 8 +- .../telecom/tests/InCallControllerTests.java | 116 ++++++++++++++++++++- 2 files changed, 119 insertions(+), 5 deletions(-) diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java index 9a53575c3..6e092912e 100644 --- a/src/com/android/server/telecom/InCallController.java +++ b/src/com/android/server/telecom/InCallController.java @@ -1136,6 +1136,10 @@ public class InCallController extends CallsManagerListenerBase implements @Override public void onCallAdded(Call call) { + Log.i(this, "onCallAdded: %s", call); + // Track the call if we don't already know about it. + addCall(call); + if (!isBoundAndConnectedToServices()) { Log.i(this, "onCallAdded: %s; not bound or connected.", call); // We are not bound, or we're not connected. @@ -1148,10 +1152,6 @@ public class InCallController extends CallsManagerListenerBase implements mEmergencyCallHelper.maybeGrantTemporaryLocationPermission(call, mCallsManager.getCurrentUserHandle()); - Log.i(this, "onCallAdded: %s", call); - // Track the call if we don't already know about it. - addCall(call); - Log.i(this, "mInCallServiceConnection isConnected=%b", mInCallServiceConnection.isConnected()); diff --git a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java index 3d387a8ee..08752f011 100644 --- a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java +++ b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java @@ -52,10 +52,12 @@ import android.app.NotificationManager; import android.app.UiModeManager; import android.content.AttributionSource; import android.content.AttributionSourceState; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.PermissionChecker; import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; @@ -65,6 +67,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.Resources; import android.compat.testing.PlatformCompatChangeRule; +import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -118,6 +121,7 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.quality.Strictness; import org.mockito.stubbing.Answer; +import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -180,6 +184,7 @@ public class InCallControllerTests extends TelecomTestCase { private EmergencyCallHelper mEmergencyCallHelper; private SystemStateHelper.SystemStateListener mSystemStateListener; private CarModeTracker mCarModeTracker = spy(new CarModeTracker()); + private BroadcastReceiver mRegisteredReceiver; private final int serviceBindingFlags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS @@ -191,6 +196,7 @@ public class InCallControllerTests extends TelecomTestCase { super.setUp(); MockitoAnnotations.initMocks(this); when(mMockCall.getAnalytics()).thenReturn(new Analytics.CallInfo()); + when(mMockCall.getId()).thenReturn("TC@1"); doReturn(mMockResources).when(mMockContext).getResources(); doReturn(mMockAppOpsManager).when(mMockContext).getSystemService(AppOpsManager.class); doReturn(SYS_PKG).when(mMockResources).getString( @@ -214,6 +220,12 @@ public class InCallControllerTests extends TelecomTestCase { mInCallController = new InCallController(mMockContext, mLock, mMockCallsManager, mMockSystemStateHelper, mDefaultDialerCache, mTimeoutsAdapter, mEmergencyCallHelper, mCarModeTracker, mClockProxy); + // Capture the broadcast receiver registered. + doAnswer(invocation -> { + mRegisteredReceiver = invocation.getArgument(0); + return null; + }).when(mMockContext).registerReceiver(any(BroadcastReceiver.class), + any(IntentFilter.class)); ArgumentCaptor systemStateListenerArgumentCaptor = ArgumentCaptor.forClass(SystemStateHelper.SystemStateListener.class); @@ -755,6 +767,104 @@ public class InCallControllerTests extends TelecomTestCase { assertEquals(sysDialerComponentName, bindIntentCaptor2.getValue().getComponent()); } + /** + * Tests a case where InCallController DOES NOT bind to ANY InCallServices when the call is + * first added, but then one becomes available after the call starts. This test was originally + * added to reproduce a bug which would cause the call id mapper in the InCallController to not + * track a newly added call unless something was bound when the call was first added. + * @throws Exception + */ + @MediumTest + @Test + public void testNoInitialBinding() throws Exception { + Bundle callExtras = new Bundle(); + callExtras.putBoolean("whatever", true); + + // Make a basic call + when(mMockCallsManager.getCurrentUserHandle()).thenReturn(mUserHandle); + when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); + when(mMockCallsManager.isInEmergencyCall()).thenReturn(true); + when(mMockCall.isEmergencyCall()).thenReturn(true); + when(mMockCall.isIncoming()).thenReturn(false); + when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE); + when(mMockCall.getIntentExtras()).thenReturn(callExtras); + when(mMockCall.isExternalCall()).thenReturn(false); + when(mMockCall.isSelfManaged()).thenReturn(true); + when(mMockCall.visibleToInCallService()).thenReturn(true); + + // Dialer doesn't handle these calls, but non-UI ICS does. + when(mDefaultDialerCache.getDefaultDialerApplication(CURRENT_USER_ID)) + .thenReturn(DEF_PKG); + ArgumentCaptor serviceConnectionCaptor = + ArgumentCaptor.forClass(ServiceConnection.class); + when(mMockContext.bindServiceAsUser(any(Intent.class), serviceConnectionCaptor.capture(), + eq(serviceBindingFlags), + eq(mUserHandle))).thenReturn(true); + when(mTimeoutsAdapter.getEmergencyCallbackWindowMillis(any(ContentResolver.class))) + .thenReturn(300_000L); + + // Setup package manager; there is a dialer and disable non-ui ICS + when(mMockPackageManager.queryIntentServicesAsUser( + any(Intent.class), anyInt(), anyInt())).thenReturn( + Arrays.asList( + getDefResolveInfo(false /* externalCalls */, false /* selfMgd */), + getNonUiResolveinfo(true /* selfManaged */, + false /* isEnabled */) + ) + ); + when(mMockPackageManager + .getComponentEnabledSetting(new ComponentName(DEF_PKG, DEF_CLASS))) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); + when(mMockPackageManager + .getComponentEnabledSetting(new ComponentName(NONUI_PKG, NONUI_CLASS))) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); + + // Add the call. + mInCallController.onCallAdded(mMockCall); + + // There will be 4 calls for the various types of ICS; this is normal. + verify(mMockPackageManager, times(4)).queryIntentServicesAsUser( + any(Intent.class), + eq(PackageManager.GET_META_DATA | PackageManager.MATCH_DISABLED_COMPONENTS), + eq(CURRENT_USER_ID)); + + // Verify no bind at this point + ArgumentCaptor bindIntentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mMockContext, never()).bindServiceAsUser( + bindIntentCaptor.capture(), + any(ServiceConnection.class), + eq(serviceBindingFlags), + eq(mUserHandle)); + + // Setup mocks to enable non-ui ICS + when(mMockPackageManager.queryIntentServicesAsUser( + any(Intent.class), anyInt(), anyInt())).thenReturn( + Arrays.asList( + getDefResolveInfo(false /* externalCalls */, false /* selfMgd */), + getNonUiResolveinfo(true /* selfManaged */, + true /* isEnabled */) + ) + ); + when(mMockPackageManager + .getComponentEnabledSetting(new ComponentName(NONUI_PKG, NONUI_CLASS))) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); + + // Emulate a late enable of the non-ui ICS + Intent packageUpdated = new Intent(Intent.ACTION_PACKAGE_CHANGED); + packageUpdated.setData(Uri.fromParts("package", NONUI_PKG, null)); + packageUpdated.putExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST, + new String[] {NONUI_CLASS}); + packageUpdated.putExtra(Intent.EXTRA_UID, NONUI_UID); + mRegisteredReceiver.onReceive(mMockContext, packageUpdated); + + // Make sure we bound to it. + verify(mMockContext, times(1)).bindServiceAsUser( + bindIntentCaptor.capture(), + any(ServiceConnection.class), + eq(serviceBindingFlags), + any(UserHandle.class)); + } + /** * Ensures that the {@link InCallController} will bind to an {@link InCallService} which * supports external calls. @@ -1379,13 +1489,17 @@ public class InCallControllerTests extends TelecomTestCase { } private ResolveInfo getNonUiResolveinfo(boolean supportsSelfManaged) { + return getNonUiResolveinfo(supportsSelfManaged, true /* isEnabled */); + } + + private ResolveInfo getNonUiResolveinfo(boolean supportsSelfManaged, boolean isEnabled) { return new ResolveInfo() {{ serviceInfo = new ServiceInfo(); serviceInfo.packageName = NONUI_PKG; serviceInfo.name = NONUI_CLASS; serviceInfo.applicationInfo = new ApplicationInfo(); serviceInfo.applicationInfo.uid = NONUI_UID; - serviceInfo.enabled = true; + serviceInfo.enabled = isEnabled; serviceInfo.permission = Manifest.permission.BIND_INCALL_SERVICE; serviceInfo.metaData = new Bundle(); if (supportsSelfManaged) { -- cgit v1.2.3 From b65097a563ed90bf4855a818319a9ccef12ee65a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 6 Jul 2023 23:57:21 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I85e602f45ba31a1fc87287cc22554d3db9db074f --- testapps/transactionalVoipApp/res/values-kk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testapps/transactionalVoipApp/res/values-kk/strings.xml b/testapps/transactionalVoipApp/res/values-kk/strings.xml index 6511211ca..03fd03129 100644 --- a/testapps/transactionalVoipApp/res/values-kk/strings.xml +++ b/testapps/transactionalVoipApp/res/values-kk/strings.xml @@ -28,7 +28,7 @@ "жауап беру" "setInactive" "ажырату" - "Динамик" + "Телефон динамигі" "Динамик" "Bluetooth" "трансляцияны бастау" -- cgit v1.2.3 From e837e6a226a1ce936d1461503eb08ebd7008204c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 13 Jul 2023 18:20:42 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I7d8923fced09d7a70c9ae0de23234997e251c7fa --- testapps/transactionalVoipApp/res/values-kk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testapps/transactionalVoipApp/res/values-kk/strings.xml b/testapps/transactionalVoipApp/res/values-kk/strings.xml index 6511211ca..03fd03129 100644 --- a/testapps/transactionalVoipApp/res/values-kk/strings.xml +++ b/testapps/transactionalVoipApp/res/values-kk/strings.xml @@ -28,7 +28,7 @@ "жауап беру" "setInactive" "ажырату" - "Динамик" + "Телефон динамигі" "Динамик" "Bluetooth" "трансляцияны бастау" -- cgit v1.2.3 From 3221828a158e60b96dcde3b85b8face15ce8dc1b Mon Sep 17 00:00:00 2001 From: Tyler Gunn Date: Tue, 11 Jul 2023 21:41:47 +0000 Subject: Move set speakerphone out of async task executor. This turned out to cause a regression related to switching to hearing aids. There are other set/clearcommunicationDevice operations elsewhere in Telecom which are not part of the async task executor so we were seeing race conditions where the clear hear doesn't happen before the set in the Telecom BluetoothDeviceManager code. For now we'll move this back out of the task executor since that was only done to try and satisfy issues with Cuttlefish tests. Test: Run CTS/Unit test suite. Bug: 283198536 Change-Id: I9cc11eb11b59eb04b706a4bd6f61c1b7240a50c2 Merged-In: I9cc11eb11b59eb04b706a4bd6f61c1b7240a50c2 --- .../server/telecom/CallAudioRouteStateMachine.java | 42 +++++++++++----------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/com/android/server/telecom/CallAudioRouteStateMachine.java b/src/com/android/server/telecom/CallAudioRouteStateMachine.java index 531f42e27..55a5df89f 100644 --- a/src/com/android/server/telecom/CallAudioRouteStateMachine.java +++ b/src/com/android/server/telecom/CallAudioRouteStateMachine.java @@ -1734,28 +1734,30 @@ public class CallAudioRouteStateMachine extends StateMachine { final boolean hasAnyCalls = mCallsManager.hasAnyCalls(); // These APIs are all via two-way binder calls so can potentially block Telecom. Since none // of this has to happen in the Telecom lock we'll offload it to the async executor. - mAsyncTaskExecutor.execute(() -> { - AudioDeviceInfo speakerDevice = null; - for (AudioDeviceInfo info : mAudioManager.getAvailableCommunicationDevices()) { - if (info.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) { - speakerDevice = info; - break; - } + + AudioDeviceInfo speakerDevice = null; + for (AudioDeviceInfo info : mAudioManager.getAvailableCommunicationDevices()) { + if (info.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) { + speakerDevice = info; + break; } - boolean speakerOn = false; - if (speakerDevice != null && on) { - boolean result = mAudioManager.setCommunicationDevice(speakerDevice); - if (result) { - speakerOn = true; - } - } else { - AudioDeviceInfo curDevice = mAudioManager.getCommunicationDevice(); - if (curDevice != null - && curDevice.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) { - mAudioManager.clearCommunicationDevice(); - } + } + boolean speakerOn = false; + if (speakerDevice != null && on) { + boolean result = mAudioManager.setCommunicationDevice(speakerDevice); + if (result) { + speakerOn = true; + } + } else { + AudioDeviceInfo curDevice = mAudioManager.getCommunicationDevice(); + if (curDevice != null + && curDevice.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) { + mAudioManager.clearCommunicationDevice(); } - mStatusBarNotifier.notifySpeakerphone(hasAnyCalls && speakerOn); + } + final boolean isSpeakerOn = speakerOn; + mAsyncTaskExecutor.execute(() -> { + mStatusBarNotifier.notifySpeakerphone(hasAnyCalls && isSpeakerOn); }); } -- cgit v1.2.3 From 29b52e3cd027da2d8644450a4dee3a7d95dc0043 Mon Sep 17 00:00:00 2001 From: Grace Jia Date: Thu, 20 Jul 2023 13:42:50 -0700 Subject: Fix vulnerability in CallRedirectionService. Currently when the CallRedirectionService binding died, we didn't do anything, which cause malicious app start activities even not run in the background by implementing a CallRedirectionService and overriding the onPlaceCall method to schedule a activity start job in an independent process and then kill itself. In that way, the activity can still start after the CallRedirectionService died. Fix this by unbinding the service when the binding died. Bug: b/289809991 Test: Using testapp provided in bug to make sure the test activity can't be started Change-Id: I065d361b83700474a1efab2a75928427ee0a14ba --- .../telecom/callredirection/CallRedirectionProcessor.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java b/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java index da64b3769..879b26603 100644 --- a/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java +++ b/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java @@ -164,6 +164,20 @@ public class CallRedirectionProcessor implements CallRedirectionCallback { Log.endSession(); } } + + @Override + public void onBindingDied(ComponentName componentName) { + // Make sure we unbind the service if binding died to avoid background stating + // activity leaks + Log.startSession("CRSC.oBD"); + try { + synchronized (mTelecomLock) { + finishCallRedirection(); + } + } finally { + Log.endSession(); + } + } } private class CallRedirectionAdapter extends ICallRedirectionAdapter.Stub { -- cgit v1.2.3 From 3a78ed748b337064a6b7cda75a889b5db2368a55 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 26 Jul 2023 09:52:59 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I55e8c4c219f58352c680e194f8b8670422d0e551 --- res/values-pt-rPT/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 462e6f6df..f47df4e3a 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -65,7 +65,7 @@ "Números bloqueados" "Não irá receber chamadas ou mensagens de texto de números bloqueados." "Adicionar um número" - "Pretende desbloquear %1$s?" + "Quer desbloquear %1$s?" "Desbloquear" "Bloquear chamadas e mensagens de texto de" "Número de telefone" @@ -101,7 +101,7 @@ "Chamadas desligadas" "Apps Telefone com falhas" "Ao efetuar esta chamada, irá terminar a chamada na app %1$s." - "Escolha como pretende efetuar esta chamada" + "Escolha como quer efetuar esta chamada" "Redirecionar chamada através de %1$s" "Ligar com o meu número de telefone" "Não é possível efetuar uma chamada através da app %1$s. Experimente utilizar uma app de redirecionamento de chamadas diferente ou contactar o programador para obter ajuda." -- cgit v1.2.3 From b085068458262db478715a62d46ddbccac2f48ac Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 26 Jul 2023 09:53:45 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2537449353c79a1a375f3ce2fbfca65cafd42a6c --- res/values-am/strings.xml | 2 +- res/values-pt-rPT/strings.xml | 4 ++-- testapps/transactionalVoipApp/res/values-am/strings.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 21c8d7cc3..f0923d5ca 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -128,7 +128,7 @@ "ማዳመጫ" "ብሉቱዝ" "ባለገመድ ማዳመጫ" - "ድምጽ ማውጫ" + "ድምፅ ማውጫ" "ውጫዊ" "ያልታወቀ" "ኦዲዮን ወደ ሌላ መሣሪያ በመልቀቅ ላይ" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index e68f3c8e4..5fbe1d3aa 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -65,7 +65,7 @@ "Números bloqueados" "Não irá receber chamadas ou mensagens de texto de números bloqueados." "Adicionar um número" - "Pretende desbloquear %1$s?" + "Quer desbloquear %1$s?" "Desbloquear" "Bloquear chamadas e mensagens de texto de" "Número de telefone" @@ -102,7 +102,7 @@ "Apps Telefone com falhas" "Streaming de chamadas" "Ao efetuar esta chamada, irá terminar a chamada na app %1$s." - "Escolha como pretende efetuar esta chamada" + "Escolha como quer efetuar esta chamada" "Redirecionar chamada através de %1$s" "Ligar com o meu número de telefone" "Não é possível efetuar uma chamada através da app %1$s. Experimente utilizar uma app de redirecionamento de chamadas diferente ou contactar o programador para obter ajuda." diff --git a/testapps/transactionalVoipApp/res/values-am/strings.xml b/testapps/transactionalVoipApp/res/values-am/strings.xml index 120a9b9ce..d71c28739 100644 --- a/testapps/transactionalVoipApp/res/values-am/strings.xml +++ b/testapps/transactionalVoipApp/res/values-am/strings.xml @@ -29,7 +29,7 @@ "ወደ ገቢር ያልሆነ ተቀናብሯል" "ግንኙነትን ያቋርጡ" "ማዳመጫ" - "ድምጽ ማውጫ" + "ድምፅ ማውጫ" "ብሉቱዝ" "ዥረት ይጀምሩ" "ለየት ያለ ነገርን ይጣሉ" -- cgit v1.2.3 From 900787156d7ef2233fc307ef24b39c1be4366701 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 26 Jul 2023 09:55:00 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id658ba1179b396525a9ac4547dd6e09fce0867c3 --- res/values-pt-rPT/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index a1e725e08..cfe6637f0 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -65,7 +65,7 @@ "Números bloqueados" "Não irá receber chamadas ou mensagens de texto de números bloqueados." "Adicionar um número" - "Pretende desbloquear %1$s?" + "Quer desbloquear %1$s?" "Desbloquear" "Bloquear chamadas e mensagens de texto de" "Número de telefone" @@ -101,7 +101,7 @@ "Chamadas desligadas" "Apps Telefone com falhas" "Ao efetuar esta chamada, irá terminar a chamada na app %1$s." - "Escolha como pretende efetuar esta chamada" + "Escolha como quer efetuar esta chamada" "Redirecionar chamada através de %1$s" "Ligar com o meu número de telefone" "Não é possível efetuar uma chamada através da app %1$s. Experimente utilizar uma app de redirecionamento de chamadas diferente ou contactar o programador para obter ajuda." -- cgit v1.2.3 From 033477d4e791bcd1b8d3bb1530df95a814643bfa Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 26 Jul 2023 13:19:16 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I82af0468aad3ae8bb37798173fab157af6795c91 --- res/values-am/strings.xml | 2 +- res/values-pt-rPT/strings.xml | 4 ++-- testapps/transactionalVoipApp/res/values-am/strings.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 21c8d7cc3..f0923d5ca 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -128,7 +128,7 @@ "ማዳመጫ" "ብሉቱዝ" "ባለገመድ ማዳመጫ" - "ድምጽ ማውጫ" + "ድምፅ ማውጫ" "ውጫዊ" "ያልታወቀ" "ኦዲዮን ወደ ሌላ መሣሪያ በመልቀቅ ላይ" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index e68f3c8e4..5fbe1d3aa 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -65,7 +65,7 @@ "Números bloqueados" "Não irá receber chamadas ou mensagens de texto de números bloqueados." "Adicionar um número" - "Pretende desbloquear %1$s?" + "Quer desbloquear %1$s?" "Desbloquear" "Bloquear chamadas e mensagens de texto de" "Número de telefone" @@ -102,7 +102,7 @@ "Apps Telefone com falhas" "Streaming de chamadas" "Ao efetuar esta chamada, irá terminar a chamada na app %1$s." - "Escolha como pretende efetuar esta chamada" + "Escolha como quer efetuar esta chamada" "Redirecionar chamada através de %1$s" "Ligar com o meu número de telefone" "Não é possível efetuar uma chamada através da app %1$s. Experimente utilizar uma app de redirecionamento de chamadas diferente ou contactar o programador para obter ajuda." diff --git a/testapps/transactionalVoipApp/res/values-am/strings.xml b/testapps/transactionalVoipApp/res/values-am/strings.xml index 120a9b9ce..d71c28739 100644 --- a/testapps/transactionalVoipApp/res/values-am/strings.xml +++ b/testapps/transactionalVoipApp/res/values-am/strings.xml @@ -29,7 +29,7 @@ "ወደ ገቢር ያልሆነ ተቀናብሯል" "ግንኙነትን ያቋርጡ" "ማዳመጫ" - "ድምጽ ማውጫ" + "ድምፅ ማውጫ" "ብሉቱዝ" "ዥረት ይጀምሩ" "ለየት ያለ ነገርን ይጣሉ" -- cgit v1.2.3 From 51ab5549f50a818d1a5a803eb8533afb4ab40068 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 15 Aug 2023 10:14:27 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I54d873343ae5ac1caa1cb7666b8fe3b6a1966411 --- res/values-zh-rCN/strings.xml | 4 ++-- testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 071289e41..1ef0a552f 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -45,7 +45,7 @@ "快速回复" "讯息已发送至 %s。" "未能将信息发送到 %s。" - "通话帐号" + "通话账号" "只能拨打紧急呼救电话。" "此应用没有电话权限,无法拨出电话。" "要拨打电话,请输入有效的电话号码。" @@ -90,7 +90,7 @@ "如果接听此来电,您当前的视频通话会中断。" "接听" "拒接" - "无法拨出电话,因为没有通话帐号支持拨打这类电话。" + "无法拨出电话,因为没有通话账号支持拨打这类电话。" "由于当前正在进行 %1$s 通话,因此无法拨打电话。" "由于当前正在进行 %1$s 通话,因此无法拨打电话。" "由于当前正在通过其他应用通话,因此无法拨打电话。" diff --git a/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml b/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml index a434e3595..a74cbb539 100644 --- a/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml +++ b/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml @@ -19,7 +19,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "事务性 API 测试活动" "通话活动中的事务" - "注册电话帐号" + "注册电话账号" "启动 FGS(在后台模拟 MT + 应用)" "开始去电" "开始来电" -- cgit v1.2.3 From 81076d36940ad55803252f23a0b8a0b55e5ad8d5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 15 Aug 2023 11:52:59 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I97d483a91f1cd404baccd86c688d2dc7e4d27238 --- res/values-zh-rCN/strings.xml | 4 ++-- testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 071289e41..1ef0a552f 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -45,7 +45,7 @@ "快速回复" "讯息已发送至 %s。" "未能将信息发送到 %s。" - "通话帐号" + "通话账号" "只能拨打紧急呼救电话。" "此应用没有电话权限,无法拨出电话。" "要拨打电话,请输入有效的电话号码。" @@ -90,7 +90,7 @@ "如果接听此来电,您当前的视频通话会中断。" "接听" "拒接" - "无法拨出电话,因为没有通话帐号支持拨打这类电话。" + "无法拨出电话,因为没有通话账号支持拨打这类电话。" "由于当前正在进行 %1$s 通话,因此无法拨打电话。" "由于当前正在进行 %1$s 通话,因此无法拨打电话。" "由于当前正在通过其他应用通话,因此无法拨打电话。" diff --git a/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml b/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml index a434e3595..a74cbb539 100644 --- a/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml +++ b/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml @@ -19,7 +19,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "事务性 API 测试活动" "通话活动中的事务" - "注册电话帐号" + "注册电话账号" "启动 FGS(在后台模拟 MT + 应用)" "开始去电" "开始来电" -- cgit v1.2.3 From 5611eb88ec74ed2e376933ab43a3fbec0f016a9e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 23 Aug 2023 14:23:38 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I199f5660e8a04e1dfd19b096341d6edf977b7c24 --- res/values-zh-rCN/strings.xml | 4 ++-- testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 071289e41..1ef0a552f 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -45,7 +45,7 @@ "快速回复" "讯息已发送至 %s。" "未能将信息发送到 %s。" - "通话帐号" + "通话账号" "只能拨打紧急呼救电话。" "此应用没有电话权限,无法拨出电话。" "要拨打电话,请输入有效的电话号码。" @@ -90,7 +90,7 @@ "如果接听此来电,您当前的视频通话会中断。" "接听" "拒接" - "无法拨出电话,因为没有通话帐号支持拨打这类电话。" + "无法拨出电话,因为没有通话账号支持拨打这类电话。" "由于当前正在进行 %1$s 通话,因此无法拨打电话。" "由于当前正在进行 %1$s 通话,因此无法拨打电话。" "由于当前正在通过其他应用通话,因此无法拨打电话。" diff --git a/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml b/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml index a434e3595..a74cbb539 100644 --- a/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml +++ b/testapps/transactionalVoipApp/res/values-zh-rCN/strings.xml @@ -19,7 +19,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "事务性 API 测试活动" "通话活动中的事务" - "注册电话帐号" + "注册电话账号" "启动 FGS(在后台模拟 MT + 应用)" "开始去电" "开始来电" -- cgit v1.2.3 From 7145a04a9e9937ea4cb3904f58b099078f066640 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 22 Sep 2023 03:33:21 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie2175f900fa52a856d21b724904459605f7eb86c --- res/values-el/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 2cf961d4d..6b58863e8 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -101,7 +101,7 @@ "Αποσυνδεδεμένες κλήσεις" "Εφαρμογές τηλεφώνου που αντιμετώπισαν σφάλμα λειτουργίας" "Ροή κλήσης" - "Εάν πραγματοποιήσετε αυτήν την κλήση, η κλήση σας μέσω %1$s θα τερματιστεί." + "Εάν πραγματοποιήσετε αυτή την κλήση, η κλήση σας μέσω %1$s θα τερματιστεί." "Επιλέξτε πώς θα πραγματοποιήσετε την κλήση" "Ανακατεύθυνση της κλήσης μέσω %1$s" "Κλήση μέσω του αριθμού τηλεφώνου μου" -- cgit v1.2.3 From 879ebad49fe0ec158ccb45c7151beeed3fee9f26 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 22 Sep 2023 03:34:03 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Idabd0aac8d66848446555d70f1e607c9d1db6b49 --- res/values-el/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 2cf961d4d..6b58863e8 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -101,7 +101,7 @@ "Αποσυνδεδεμένες κλήσεις" "Εφαρμογές τηλεφώνου που αντιμετώπισαν σφάλμα λειτουργίας" "Ροή κλήσης" - "Εάν πραγματοποιήσετε αυτήν την κλήση, η κλήση σας μέσω %1$s θα τερματιστεί." + "Εάν πραγματοποιήσετε αυτή την κλήση, η κλήση σας μέσω %1$s θα τερματιστεί." "Επιλέξτε πώς θα πραγματοποιήσετε την κλήση" "Ανακατεύθυνση της κλήσης μέσω %1$s" "Κλήση μέσω του αριθμού τηλεφώνου μου" -- cgit v1.2.3 From a604311f86ea8136ca2ac9f9ff0af7fa57ee3f42 Mon Sep 17 00:00:00 2001 From: Pranav Madapurmath Date: Wed, 5 Apr 2023 21:36:12 +0000 Subject: Resolve account image icon profile boundary exploit. Because Telecom grants the INTERACT_ACROSS_USERS permission, an exploit is possible where the user can upload an image icon (belonging to another user) via registering a phone account. This CL provides a lightweight solution for parsing the image URI to detect profile exploitation. Fixes: 273502295 Fixes: 296915211 Test: Unit test to enforce successful/failure path Change-Id: I2b6418f019a373ee9f02ba8683e5b694e7ab80a5 (cherry picked from commit d0d1d38e37de54e58a7532a0020582fbd7d476b7) Merged-In: I2b6418f019a373ee9f02ba8683e5b694e7ab80a5 (cherry picked from commit e7d0ca3fe5be6e393f643f565792ea5e7ed05f48) --- .../android/server/telecom/TelecomServiceImpl.java | 22 ++++++++++++++++++++++ .../telecom/tests/TelecomServiceImplTest.java | 21 +++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java index 6d8a2f356..9b609af49 100644 --- a/src/com/android/server/telecom/TelecomServiceImpl.java +++ b/src/com/android/server/telecom/TelecomServiceImpl.java @@ -38,6 +38,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; +import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Binder; import android.os.Build; @@ -539,6 +540,9 @@ public class TelecomServiceImpl { .build(); } + // Validate the profile boundary of the given image URI. + validateAccountIconUserBoundary(account.getIcon()); + final long token = Binder.clearCallingIdentity(); try { mPhoneAccountRegistrar.registerPhoneAccount(account); @@ -2361,4 +2365,22 @@ public class TelecomServiceImpl { mContext.sendBroadcast(intent); } } + + private void validateAccountIconUserBoundary(Icon icon) { + // Refer to Icon#getUriString for context. The URI string is invalid for icons of + // incompatible types. + if (icon != null && (icon.getType() == Icon.TYPE_URI + || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP)) { + String encodedUser = icon.getUri().getEncodedUserInfo(); + // If there is no encoded user, the URI is calling into the calling user space + if (encodedUser != null) { + int userId = Integer.parseInt(encodedUser); + if (userId != UserHandle.getUserId(Binder.getCallingUid())) { + // If we are transcending the profile boundary, throw an error. + throw new IllegalArgumentException("Attempting to register a phone account with" + + " an image icon belonging to another user."); + } + } + } + } } diff --git a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java index c2d97e6ed..664b31efe 100644 --- a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java +++ b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java @@ -31,6 +31,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Binder; import android.os.Build; @@ -591,6 +592,26 @@ public class TelecomServiceImplTest extends TelecomTestCase { } } + @SmallTest + @Test + public void testRegisterPhoneAccountImageIconCrossUser() throws RemoteException { + String packageNameToUse = "com.android.officialpackage"; + PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName( + packageNameToUse, "cs"), "test", Binder.getCallingUserHandle()); + Icon icon = Icon.createWithContentUri("content://10@media/external/images/media/"); + PhoneAccount phoneAccount = makePhoneAccount(phHandle).setIcon(icon).build(); + doReturn(PackageManager.PERMISSION_GRANTED) + .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE); + + // This should fail; security exception will be thrown. + registerPhoneAccountTestHelper(phoneAccount, false); + + icon = Icon.createWithContentUri("content://0@media/external/images/media/"); + phoneAccount = makePhoneAccount(phHandle).setIcon(icon).build(); + // This should succeed. + registerPhoneAccountTestHelper(phoneAccount, true); + } + @SmallTest @Test public void testUnregisterPhoneAccount() throws RemoteException { -- cgit v1.2.3 From 625cbebf32d27d87393d1ca1df1bb45b8a145030 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 19 Oct 2023 21:32:31 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Idb642c18bc6a53df280e1f1f60b46da10d3e1846 --- res/values-pt/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index afb8eca46..a7fc3c741 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -57,7 +57,7 @@ "Definir padrão" "Cancelar" "O %s poderá ligar e controlar todos os aspectos das chamadas. Defina como aplicativo Telefone padrão somente aqueles em que você confia." - "Usar o %s como seu app de seleção de chamadas padrão?" + "Usar o %s como seu app de filtro de ligações padrão?" "O %s não selecionará mais as chamadas." "O %s poderá ver as informações sobre os autores das chamadas que não estão entre seus contatos e bloqueá-los. Defina como app de seleção de chamadas padrão somente aqueles em que você confia." "Definir padrão" -- cgit v1.2.3 From 638247ce5fd893f4d1ad185c0dfbee3dc00eb4b5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 30 Oct 2023 14:48:59 -0700 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2d556281c589345c8f186ebc0bd3044484d58f02 --- res/values-kk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 628b44025..399da2030 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -69,7 +69,7 @@ "Бөгеуден шығару" "Қоңыраулары мен мәтіндік хабарлары бөгелетін нөмір" "Телефон нөмірі" - "Бөгеу" + "Блоктау" "Бөгелген нөмірлерді тек құрылғы иесі көре және басқара алады." "Бөгеуді алу" "Тыйым уақытша алынды" -- cgit v1.2.3 From af01dac83cf9998632a638ecb9f0a479431d61b8 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 9 Nov 2023 18:20:19 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I665360523087a5a25c38167294973d0bc5af7a24 --- testapps/transactionalVoipApp/res/values-ca/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testapps/transactionalVoipApp/res/values-ca/strings.xml b/testapps/transactionalVoipApp/res/values-ca/strings.xml index 06f165569..550044425 100644 --- a/testapps/transactionalVoipApp/res/values-ca/strings.xml +++ b/testapps/transactionalVoipApp/res/values-ca/strings.xml @@ -31,7 +31,7 @@ "Auricular" "Altaveu" "Bluetooth" - "inicia la reproducció en continu" + "inicia la reproducció en línia" "llança una excepció" "actualitza la notificació a l\'estil de trucada en curs" -- cgit v1.2.3 From 1e019f117ff26cdefc697ba17326c8c08ac9a7c0 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 29 Nov 2023 12:34:37 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia427ce89cf97fff3855eaf731546e89e8ab208df --- res/values-da/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index fff725758..4eead6668 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -73,7 +73,7 @@ "Det er kun ejeren af en enhed, der kan se og administrere blokerede numre." "Fjern blokering" "Blokering er midlertidigt slået fra" - "Når du har ringet eller sendt en sms-besked til alarmcentralen, bliver blokering slået fra for at sikre, at alarmcentralen kan komme i kontakt med dig." + "Når du har ringet eller sendt en besked til alarmcentralen, bliver blokering slået fra for at sikre, at alarmcentralen kan komme i kontakt med dig." "Genaktiver nu" "%1$s blev blokeret" "Blokeringen af %1$s blev ophævet" -- cgit v1.2.3 From 88ca646d3b4a27ef9932690535c357a4f094fea0 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 13 Dec 2023 15:27:38 -0800 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I30d6511d812e6bee2515320687d448e551635c0e --- res/values-sw/strings.xml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 1b499900c..ef58c0044 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -48,11 +48,11 @@ "Akaunti za simu" "Piga simu za dharura pekee." "Programu hii haiwezi kupiga simu bila ruhusa ya Simu." - "Ili upige simu, weka nambari sahihi." + "Ili upige simu, weka namba sahihi." "Hangout ya video haiwezi kuongezwa kwa wakati huu." "Nambari ya sauti inayokosekana" - "Hakuna nambari ya ujumbe wa sauti iliyohifadhiwa katika SIM kadi." - "Ongeza nambari" + "Hakuna namba ya ujumbe wa sauti iliyohifadhiwa katika SIM kadi." + "Ongeza namba" "Unataka kufanya %s iwe programu chaguomsingi ya simu?" "Fanya iwe Chaguo-Msingi" "Ghairi" @@ -63,21 +63,21 @@ "Weka iwe Chaguomsingi" "Ghairi" "Nambari zilizozuiwa" - "Hutapokea simu au SMS kutoka kwa nambari zilizozuiwa." - "Ongeza nambari" + "Hutapokea simu au SMS kutoka kwa namba zilizozuiwa." + "Ongeza namba" "Ungependa kuacha kuzuia %1$s?" "Acha kuzuia" "Zuia simu na SMS kutoka kwa" "Nambari ya simu" "Zuia" - "Ni mmiliki wa kifaa pekee anayeweza kuangalia na kuthibiti nambari zilizozuiwa." + "Ni mmiliki wa kifaa pekee anayeweza kuangalia na kuthibiti namba zilizozuiwa." "Acha kuzuia" "Kipengele cha kuzuia kimezimwa kwa muda" - "Ukishapiga au kutuma ujumbe kwa nambari ya dharura, kipengele cha kuzuia anwani huzimwa ili watoa huduma za dharura waweze kuwasiliana nawe." + "Ukishapiga au kutuma ujumbe kwa namba ya dharura, kipengele cha kuzuia anwani huzimwa ili watoa huduma za dharura waweze kuwasiliana nawe." "Kiwashe tena sasa" "%1$s imezuiwa" "%1$s imeacha kuzuiwa" - "Huwezi kuzuia nambari ya dharura." + "Huwezi kuzuia namba ya dharura." "%1$s tayari imezuiwa." "Kupiga simu kwa kutumia kipiga simu cha binafsi" "Simu ya %1$s kutoka kwa %2$s" @@ -104,19 +104,19 @@ "Ukipiga simu hii, simu yako kwenye %1$s itakatwa." "Chagua jinsi utakavyopiga simu hii" "Elekeza simu ukitumia %1$s" - "Piga simu ukitumia nambari yangu ya simu" + "Piga simu ukitumia namba yangu ya simu" "%1$s imeshindwa kupiga simu. Jaribu kutumia programu nyingine inayoelekeza simu kwingine au uwasiliane na msanidi programu kwa usaidizi." "Kuzuia Simu" "Nambari ambazo haziko kwenye Anwani" - "Zuia nambari ambazo hazipo kwenye orodha ya Anwani zako" + "Zuia namba ambazo hazipo kwenye orodha ya Anwani zako" "Faragha" - "Zuia wapigaji ambao wameficha nambari zao za simu" + "Zuia wapigaji ambao wameficha namba zao za simu" "Simu ya kulipia" - "Zuia simu kutoka kwa nambari ya simu za kulipia" + "Zuia simu kutoka kwa namba ya simu za kulipia" "Zisizojulikani" "Zuia simu kutoka kwa wapigaji wasiojulikana" "Zisizotambulishwa" - "Zuia simu zinazopigwa bila kutambulisha nambari ya simu" + "Zuia simu zinazopigwa bila kutambulisha namba ya simu" "Kuzuia Simu" "Kipengele cha Kuzuia Simu kimezimwa" "Simu ya dharura imepigwa" -- cgit v1.2.3