Question

Edit: Changed JellyBean to cyanogenmod 10 as it's probably a cyanogen feature

I noticed my phone under CyanogenMod10 phone displays in the call log the (approximate) location of callers (only when the number is a land line phone not in my contacts).

It doesn't just rely on the country code because it also displays the city of the caller when found. I browsed the Contacts package app and found values was fetched from database (in com.android.contacts.CallDetailActivity)

final String countryIso = callCursor.getString(COUNTRY_ISO_COLUMN_INDEX);
final String geocode = callCursor.getString(GEOCODED_LOCATION_COLUMN_INDEX);

So I though it was in the Phone package app after successfully placing or receiving a call. But I quickly lost myself in the source... I would to know where and (briefly) how those values are set and the geocode resolved.

Are phone numbers sent to a mysterious web service?

Does Cyanogen have a table with all country codes and city prefixes of the world (I doubt it)?

Or is that DB downloaded depending on the country you are in?

Was it helpful?

Solution

Finally I found how this thing work

First ContactsProvider add this value when calling DefaultCallLogInsertionHelper.addComputedValues

see here

https://github.com/CyanogenMod/android_packages_providers_ContactsProvider/blob/ics/src/com/android/providers/contacts/DefaultCallLogInsertionHelper.java#L59

@Override
public void addComputedValues(ContentValues values) {
    // Insert the current country code, so we know the country the number belongs to.
    String countryIso = getCurrentCountryIso();
    values.put(Calls.COUNTRY_ISO, countryIso);
    // Insert the geocoded location, so that we do not need to compute it on the fly.
    values.put(Calls.GEOCODED_LOCATION,
            getGeocodedLocationFor(values.getAsString(Calls.NUMBER), countryIso));
}

so code you see

final String countryIso = callCursor.getString(COUNTRY_ISO_COLUMN_INDEX);
final String geocode = callCursor.getString(GEOCODED_LOCATION_COLUMN_INDEX);

is actually reading from saved data

So, real data are from PhoneNumberOfflineGeocoder which you can find here https://github.com/CyanogenMod/android_external_libphonenumber/blob/ics/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java

That is something called libphonenumber

https://code.google.com/p/libphonenumber/

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top