From 7baf0f8897cd0b0e1e3e333a188f0287d1b4bbb9 Mon Sep 17 00:00:00 2001 From: Wysie Date: Thu, 14 Jan 2010 23:57:05 +0800 Subject: 2.8 Fixed bug at [url]http://code.google.com/p/cyanogenmod.../detail?id=999[/url] Added German translations, thanks to thiasB! Patched Call Logs by niuchl. It's supposed to be faster. Do report if it's faster/slow/bugs anything. His implementation does NOT make use of a HashTable or any cache. --- res/values-de/strings.xml | 167 +++++++++++++++++++++ res/values/strings.xml | 4 +- src/com/android/contacts/ContactsListActivity.java | 37 +++-- .../android/contacts/RecentCallsListActivity.java | 164 +++++++++----------- 4 files changed, 259 insertions(+), 113 deletions(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 0d7520cce..704505c53 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -224,4 +224,171 @@ "\"%s\" konnte nicht geöffnet werden: %s" "%s von %s Kontakten" "Namen Ihrer Kontakte" + + Verpasste löschen + Ausgehende löschen + Eingehende löschen + + + Einstellungen + Gruppen verwalten + + Zeige alle Gruppen + Zeige Kontakte mit Rufnummer + + + SMS/MMS + + + Geprächsdauer gesamt + + + Dauer total eingehend/ausgehend + Eingehend + Ausgehend + Ok + + + Häufig angerufen leeren + + + Telefon + Linke Aktionstaste (LAT) + Mailbox Verwaltung + Nummernprüfung ausschalten + Linke Aktionstaste (LAT) und Menü werden dauerhaft aktiviert. + LAT und Menü werden aktiviert, wenn mindestens eine Nummer eingegeben wurde (ausser Mailbox). + 1 wählt Mailbox + Taste 1 wird für Mailbox genutzt. + Taste 1 entsprechend Mailbox Verwaltung. + Nutze haptische Rückmeldung + + Farbe der Zahlen (normal) + Farbe der Zahlen (fokusiert) + Farbe der Zahlen (gedrückt) + Farbe wählen + Nutze eigene Farben für Zahlen + Unterstützte Formate: #RRGGBB oder #AARRGGBB (mit #). + + Farbe der Zahlen ändern + + Anrufliste + Relative Zeiten + Zeige relative Zeiten in Anrufliste. + Zeige exakte Zeiten in Anrufliste. + Zeige Sekunden + Zeige Sekunden bei exakten Zeiten. + Anrufliste löschen bestätigen + Anrufliste löschen mit Bestätigung. + Anrufliste löschen ohne Bestätigung. + Nummernspeicher immer leeren + Aktuelle Anrufliste ist immer sichergestellt. + Schnellerer Wechsel zur Anrufliste aber evtl. nicht aktuelle Kontaktinformationen nach Änderung. + + Individuelle Anruflisten + Einstellungen für individuelle Anruflisten. + + Gruppieren von Ruflisteneinstellungen + Gruppieren unbekannter Nummern (experimentell) + Versuche ungespeicherte Nummern zu gruppieren. Betrifft auch Löschen von Anruflisten. + Anzahl zu vergleichender Zahlen + Genauer, je größer die Anzahl. + + Kontakte + Zeige Kontaktbilder + Zeige Bilder von Kontakten an. + Zeige Anruftaste + Zeige Anruftaste für Kontakte mit Rufnummern. + Größe der Kontaktbilder + Größe der Kontaktbilder im Profil einstellen. Betrifft auch Favoriten. + Größe wählen + Alphabetische Trennmarke + Alphabetische Trennung wird angezeigt in der Kontaktliste. + Alphabetische Trennung wird nicht angezeigt in der Kontaktliste. + Virt. Tastatur autom. zeigen + Die virtuelle Tastatur wird eingeblendet, sobald das Kontaktprofil betreten wird. + Virt. Tastatur verbergen + Die virtuelle Tastatur wird ausgeblendet beim Scrollen. + Kontakt anzeigen + Einstellungen für Ansicht eines Kontaktes ändern. + Textaktionen nur für Handys + Text/SMS Aktion nur für Mobilfunknummern. + Text/SMS Aktion nur für alle Nummern. + + Gruppen bearbeiten + Einstellungen für Gruppen bearbeiten. + Löschen bestätigen + Löschen von Gruppen mit Bestätigung. + Löschen von Gruppen ohne Bestätigung. + + Häufig gewählt + Häufig Gewählte verbergen. + Die Daten werden nicht gelöscht, nur verborgen. + Leeren bestätigen + Leeren der Liste mit Bestätigung. + Leeren der Liste ohne Bestätigung. + + Zeige Kennung + Kennungen (mobil, privat, etc.) werden angezeigt. + Kennungen (mobil, privat, etc.) werden nicht angezeigt. + + Zeige Rufnummer + Rufnummer wird gezeigt. + Rufnummer wird nicht gezeigt. + + Sonstiges + Autorotation verwenden + + Über + Mod Name + Wysie Contacts + Version + 2.7 + Danksagung + ChainsDD, geesun and the rest of XDA! :) + + + + Anrufliste leeren + Bist du sicher, dass du die Anrufliste leeren möchtest? + Lösche alle %s + Lösche alle + + Bist du sicher, dass du alle Anrufe von %s löschen möchtest? + Bist du sicher, dass du alle eingegangenen Anrufe von %s löschen möchtest? + Bist du sicher, dass du alle ausgegangenen Anrufe an %s löschen möchtest? + Bist du sicher, dass du alle verpassten Anrufe von %s löschen möchtest? + + Bist du sicher, dass du alle eingegangenen Anrufe löschen möchtest? + Bist du sicher, dass du alle ausgegangenen Anrufe löschen möchtest? + Bist du sicher, dass du alle verpassten Anrufe löschen möchtest? + + + Lösche häufig Angerufene + Bist du sicher, dass du die Liste der häufig angerufenen Kontakte löschen möchtest? + + + Gehe zu + Gruppen + Anrufliste ansehen + Nummer auswählen um Log einzusehen + + + Nutzung + Gruppenname gedrückt halten zum umbenennen oder löschen. Für neue Gruppe Menü drücken. Dieser Text wird bis zum nächsten Update nicht gezeigt. + + + Gruppen verwalten + Neue Gruppe + Gruppenname eingeben + Gruppe umbenennen + Gruppe löschen + Neuen Gruppennamen eingeben + Sicher, dass du diese Gruppe löschen möchstest? + + + + Kein Kontakt oder Ruflisteneintrag für diese Nummer gefunden. + Kopiere \"%s\" + Gesamtdauer diff --git a/res/values/strings.xml b/res/values/strings.xml index 50e54f8e0..4ac15396c 100755 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -858,9 +858,9 @@ Mod Name Wysie Contacts Version - 2.7 + 2.8 Credits - ChainsDD, geesun and the rest of XDA! :) + ChainsDD, geesun, niuchl, rac2030 and the rest of XDA! :) Clear call log diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java index 6f4ee0076..d17929837 100755 --- a/src/com/android/contacts/ContactsListActivity.java +++ b/src/com/android/contacts/ContactsListActivity.java @@ -2208,17 +2208,15 @@ public final class ContactsListActivity extends ListActivity size = cache.numberBuffer.sizeCopied; if (size != 0) { + //Wysie_Soh: 2.8 changes. Always show first. Only hide if preference is set to hide. + numberView.setText(cache.numberBuffer.data, 0, size); + numberView.setVisibility(View.VISIBLE); + labelView.setVisibility(View.VISIBLE); - if ((showContactsNumber && mContactsTab) || (showFavsNumber && mFavTab)) { - numberView.setText(cache.numberBuffer.data, 0, size); - numberView.setVisibility(View.VISIBLE); - } - else { + if ((!showContactsNumber && mContactsTab) || (!showFavsNumber && mFavTab)) { numberView.setVisibility(View.GONE); } - labelView.setVisibility(View.VISIBLE); - if ((showContactsDialButton && mContactsTab) || (showFavsDialButton && mFavTab)) { callView.setTag(new String(cache.numberBuffer.data, 0, size)); //Wysie_Soh: Set tag to green dial button callView.setVisibility(View.VISIBLE); @@ -2237,8 +2235,7 @@ public final class ContactsListActivity extends ListActivity } // Set the label - if (!cursor.isNull(TYPE_COLUMN_INDEX) && ((showContactsLabel && mContactsTab) || - (showFavsLabel && mFavTab))) { + if (!cursor.isNull(TYPE_COLUMN_INDEX)) { int type = cursor.getInt(TYPE_COLUMN_INDEX); if (type != People.Phones.TYPE_CUSTOM) { @@ -2252,7 +2249,7 @@ public final class ContactsListActivity extends ListActivity // Don't check size, if it's zero just don't show anything labelView.setText(cache.labelBuffer.data, 0, cache.labelBuffer.sizeCopied); } - + //Wysie_Soh: Set layout rules programmatically newNameLayout.addRule(RelativeLayout.ABOVE, R.id.label); newNumberLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0); @@ -2261,19 +2258,21 @@ public final class ContactsListActivity extends ListActivity cache.nameView.setLayoutParams(newNameLayout); numberView.setLayoutParams(newNumberLayout); + + if ((!showContactsLabel && mContactsTab) || (!showFavsLabel && mFavTab)) { + labelView.setVisibility(View.GONE); + //Wysie_Soh: Set layout rules programmatically + newNameLayout.addRule(RelativeLayout.ABOVE, R.id.number); + newNumberLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + newNumberLayout.addRule(RelativeLayout.ALIGN_BASELINE, 0); + newNumberLayout.setMargins(0, -10, 0, 8); + cache.nameView.setLayoutParams(newNameLayout); + numberView.setLayoutParams(newNumberLayout); + } } else { // There is no label, hide the the view labelView.setVisibility(View.GONE); - - //Wysie_Soh: Set layout rules programmatically - newNameLayout.addRule(RelativeLayout.ABOVE, R.id.number); - newNumberLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - newNumberLayout.addRule(RelativeLayout.ALIGN_BASELINE, 0); - newNumberLayout.setMargins(0, -10, 0, 8); - - cache.nameView.setLayoutParams(newNameLayout); - numberView.setLayoutParams(newNumberLayout); } // Set the proper icon (star or presence or nothing) diff --git a/src/com/android/contacts/RecentCallsListActivity.java b/src/com/android/contacts/RecentCallsListActivity.java index 9a7285d36..0f7b6a96b 100644 --- a/src/com/android/contacts/RecentCallsListActivity.java +++ b/src/com/android/contacts/RecentCallsListActivity.java @@ -35,7 +35,6 @@ import android.database.sqlite.SQLiteDiskIOException; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteFullException; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; @@ -74,23 +73,18 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.ListView; import android.widget.RelativeLayout; -import android.widget.ResourceCursorAdapter; import android.widget.TextView; import com.android.internal.telephony.CallerInfo; import com.android.internal.telephony.ITelephony; -import java.io.FileNotFoundException; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - +import java.util.Map; import java.util.HashMap; import java.util.Hashtable; import java.util.LinkedList; import java.util.Locale; +import java.util.Set; +import java.util.HashSet; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; @@ -99,8 +93,6 @@ import android.view.LayoutInflater; import android.widget.ArrayAdapter; import java.util.ArrayList; import java.util.List; -import android.widget.Toast; - /** * Displays a list of call log entries. @@ -840,13 +832,19 @@ public class RecentCallsListActivity extends ListActivity @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { final RecentCallsListActivity activity = mActivity.get(); + final Cursor fCursor = cursor; if (activity != null && !activity.isFinishing()) { // final RecentCallsListActivity.RecentCallsAdapter callsAdapter = activity.mAdapter; final RecentCallsListActivity.RecentCallsArrayAdapter callsAdapter = activity.mArrayAdapter; - callsAdapter.setLoading(false); - activity.getUpdateCallLogsItem(cursor); + // niuchl: Process time consuming job asynchronously, so that the main thread will not be blocked. + new Handler().post(new Runnable() { + public void run() { + activity.getUpdateCallLogsItem(fCursor); + callsAdapter.setLoading(false); + } + }); // callsAdapter.changeCursor(cursor); } else { @@ -942,6 +940,63 @@ public class RecentCallsListActivity extends ListActivity return false; } + private Map> nameIdMap = null; + private Map> idPhoneMap = null; + // niuchl: Querying database in batch mode, and the performace is improved a lot. + private void initNumberList() { + if (tempNumList != null && nameIdMap != null && idPhoneMap != null) { + return; + } + + tempNumList = new Hashtable(); + nameIdMap = new HashMap>(); + idPhoneMap = new HashMap>(); + Cursor cursor = getContentResolver().query(Phones.CONTENT_URI, + new String[] {Phones.NUMBER, Phones.PERSON_ID, Phones.DISPLAY_NAME}, + null, null, null); + + if (cursor != null && cursor.moveToFirst()) { + do { + String phone = cursor.getString(0); + Long id = cursor.getLong(1); + String name = cursor.getString(2); + tempNumList.put(phone, id); + if (nameIdMap.containsKey(name)) { + nameIdMap.get(name).add(id); + } else { + Set idSet = new HashSet(); + idSet.add(id); + nameIdMap.put(name, idSet); + } + if (idPhoneMap.containsKey(id)) { + idPhoneMap.get(id).add(phone); + } else { + Set phoneSet = new HashSet(); + phoneSet.add(phone); + idPhoneMap.put(id, phoneSet); + } + } while (cursor.moveToNext()); + cursor.close(); + } + } + + private long getPersonId(String phoneNumber, String userName) { + if (nameIdMap.containsKey(userName)) { + Set idSet = nameIdMap.get(userName); + for (Long id : idSet) { + if (idPhoneMap.containsKey(id)) { + Set phoneSet = idPhoneMap.get(id); + for (String phone : phoneSet) { + if (phone.equals(phoneNumber) || PhoneNumberUtils.compare(phone, phoneNumber)) { + return id; + } + } + } + } + } + return -1; + } + public void getUpdateCallLogsItem(Cursor cursor) { mListCallLogs.clear(); numbersCache.clear(); @@ -950,12 +1005,13 @@ public class RecentCallsListActivity extends ListActivity if (cursor == null) { return; } + + initNumberList(); Cursor phonesCursor = null; int number = -1; cacheUpdated = false; - if (cursor.getCount() != 0) { - cursor.moveToFirst(); + if (cursor.getCount() != 0 && cursor.moveToFirst()) { do { RecentCallsInfo item = new RecentCallsInfo(); @@ -977,44 +1033,18 @@ public class RecentCallsListActivity extends ListActivity item.duration = cursor.getInt( RecentCallsListActivity.DURATION_COLUMN_INDEX); - //Wysie_Soh: The following portion of code to retrieve personId - //really slows down the performance. However, without it, - //call logs will not be grouped by contact, and instead will be grouped - //by number (non-ideal). Thus, we make use of a Hashtable to keep - //numbers and ids pairs, and avoid querying. This speeds it up significantly, - //but it's still slower than default/without querying personId - item.personId = -1; - try { - item.personId = tempNumList.get(item.number); - } catch (NullPointerException e) { - } - - if (item.personId == -1) { - phonesCursor = getContentResolver().query( - Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, - Uri.encode(item.number)), PHONES_ID_PROJECTION, null, null, null); - - if (phonesCursor != null && phonesCursor.moveToFirst()) { - item.personId = phonesCursor.getLong(PERSON_ID_COLUMN_INDEX); - tempNumList.put(item.number, item.personId); - cacheUpdated = true; - phonesCursor.close(); - } - } + item.personId = getPersonId(item.number, item.name); addItemIntoList(item); } while (cursor.moveToNext()); cursor.close(); - } // Log.e(TAG,"getUpdateCallLogsItem"); numbersCache.clear(); numbersCachePosition.clear(); personIdCache.clear(); mArrayAdapter.notifyDataSetChanged(); - writeCacheToFile(); - } static String numbersOnly(String s) { @@ -1054,7 +1084,6 @@ public class RecentCallsListActivity extends ListActivity @Override protected void onResume() { - loadCacheFromFile(); /* mListCallLogs.clear(); @@ -1763,53 +1792,4 @@ public class RecentCallsListActivity extends ListActivity //WYSIE TODO: Implement manual delete. - //Wysie: The purpose is to save the existing tempNumList hashtable to a binary file - //so that upon the next start, we can load from here directly, instead of querying - //CONTENT_FILTER_URL which is very slow. - private void writeCacheToFile() { - if (!cacheUpdated) - return; - try { - FileOutputStream fOut = openFileOutput(CACHEFILENAME, 0); - ObjectOutputStream oOut = new ObjectOutputStream(fOut); - oOut.writeObject(tempNumList); - oOut.close(); - fOut.close(); - //Log.d("WYSIE", "FILE SAVE SUCCESS"); - } - catch (FileNotFoundException e) { - //Do nothing - } - catch (IOException e) { - //Do nothing - } - } - - //Wysie: Load the Hashtable from file. Check EditContactActivity for the line - //deleteFile(CACHEFILENAME). The current logic works by ALWAYS deleting the cached/saved file - //as long as a contact info has been edited. This ensures that the call logs are always up to date. - private void loadCacheFromFile() { - try { - FileInputStream fIn = openFileInput(CACHEFILENAME); - ObjectInputStream oIn = new ObjectInputStream(fIn); - tempNumList = (Hashtable)oIn.readObject(); - oIn.close(); - fIn.close(); - //Log.d("WYSIE", "FILE LOAD SUCCESS"); - } - //In case of exceptions, create new tempNumList - catch (ClassNotFoundException e) { - tempNumList = new Hashtable(); - //Log.d("WYSIE", "FILE LOAD ERROR"); - } - catch (FileNotFoundException e) { - tempNumList = new Hashtable(); - //Log.d("WYSIE", "FILE LOAD ERROR"); - } - catch (IOException e) { - tempNumList = new Hashtable(); - //Log.d("WYSIE", "FILE LOAD ERROR"); - } - } - } -- cgit v1.2.3