Всем привет.
Давно мечтал на своей нокии иметь поиск по контактам как в Windows Mobile. Т.е. при наборе номера одновременно производится поиск в контактах, причём как на предмет совпадения набираемого номера, так и в именах контактов. В именах поиск производится как на т9, не зависимо от текущего языка. На досугах накидал на телефоне скрипт, который это дело кое-как реализует.
Прошу любить и жаловать:
# -*- coding: utf-8 -*-
import appuifw as ui
import contacts
import e32
import key_codes as kc
import telephone as tel
C=contacts.ContactsDb()
fulllist=[(-1,u'Number',[u''])]+[(el[0], el[1].title,[el[1][f].value for f in el[1].keys() if el[1][f].schema['phonenumberfield']]) for el in C.items()]
list=[]+fulllist
def u(s):
  return unicode(s,'utf-8')
n=[[' ',], ['',],['a','b','c','а','б','в','г','A','B','C','А','Б','В','Г',],['d','e','f','д','е','ж','з','D','Е','F','Д','Е','Ж','З',],['g','h','i','и','й','к','л','G','H','I','И','Й','К','Л',],['j','k','l','м','н','о','п','J','K','L','М','Н','О','П',],['m','n','o','р','с','т','у','M','N','O','Р','С','Т','У',],['p','q','r','s','ф','х','ц','ч','P','Q','R','S','p','q','r','s',],['t','u','v','ш','щ','ъ','ы','T','U','V','Ш','Щ','Ъ','Ы',],['w','x','y','z','ь','э','ю','я','W','X','Y','Z','Ь','Э','Ю','Я',]]
n=[[u(j) for j in i] for i in n]
def show():
  ui.note(unicode(repr(list[lb.current()])))
  
def call():
  phones=list[lb.current()][2]
  name=list[lb.current()][1]
  if not phones:
    ui.note(u'No number')
    return
  elif len(phones)==1:
    ind=0
  else:
    ind=ui.popup_menu(phones, name)
  if ind!=None:
    tel.dial(phones[ind])
#global number
number=u''
def Key1():
  global number
  number+=u'1'
  update()
def Key2():
  global number
  number+=u'2'
  update()
def Key3():
  global number
  number+=u'3'
  update()
def Key4():
  global number
  number+=u'4'
  update()
def Key5():
  global number
  number+=u'5'
  update()
def Key6():
  global number
  number+=u'6'
  update()
def Key7():
  global number
  number+=u'7'
  update()
def Key8():
  global number
  number+=u'8'
  update()
def Key9():
  global number
  number+=u'9'
  update()
def Key0():
  global number
  number+=u'0'
  update()
def KeyC():
  global number
  number=number[:-1]
  update()
def clear():
  global number
  number=u''
  update()
def num(char):
  global n
  i=0
  for chars in n:
    if char in chars:
      return u(str(i))
    i+=1
  return char
  
def sort(title, numbers):
  global number
  numtitle=u''
  if not numbers:
    return 0
  else:
    for c in title:
      numtitle+=num(c)
    #ui.note(numtitle)
    for n in numbers+[numtitle,]:
      if n[:2]==u'+7':
        n=u'8'+n[2:]
      try:
        if not n.split(number)[0]==n:
          return 1
      except:
        pass
  return 0
def update():
  global list
  list[0][2][0]=number
  if not number:
    list=[el for el in fulllist]
  else:
    list=[el for el in fulllist if sort(el[1],el[2])]
  titles=[el[1] for el in list]
  titles[0]=number
  lb.set_list(titles)
titles=[el[1] for el in list]
titles[0]=u''
lb=ui.Listbox(titles, show)
lb.bind(kc.EKey1,Key1)
lb.bind(kc.EKey2,Key2)
lb.bind(kc.EKey3,Key3)
lb.bind(kc.EKey4,Key4)
lb.bind(kc.EKey5,Key5)
lb.bind(kc.EKey6,Key6)
lb.bind(kc.EKey7,Key7)
lb.bind(kc.EKey8,Key8)
lb.bind(kc.EKey9,Key9)
lb.bind(kc.EKey0,Key0)
lb.bind(kc.EKeyBackspace,KeyC)
lb.bind(kc.EKeyYes,call)
lb.bind(kc.EKeyNo,clear)
#ui.app.screen='large'
ui.app.title = u"Dialer"
ui.app.body=lb
running=1
def quit():
    global running
    running=0
    
ui.app.exit_key_handler=quit
while running:
    e32.ao_sleep(0.01)
За код и отсутствие комментариев прошу сильно не пинать ибо написано целиком и полностью на телефоне(как и этот пост).
Это только тестовая версия, приложение будет полностью переписано.
Жду критики, пожеланий, комментариев и другого вида фидбек.